You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.5 KiB
Dart

import 'dart:io';
import 'package:aoc2020/aocbase.dart';
import 'package:aoc2020/model/point.dart';
import 'package:aoc2020/model/readdata.dart';
enum SeatType { floor, taken, vacant }
class AOC20201211 extends AOCBase {
var mylist = <String>[];
List<List<String>> room = [];
var width = 0;
var height = 0;
void init(bool test) async {
mylist = await ReadData.readFile<String>(classString, test: test);
height = mylist.length;
width = mylist.first.length;
room = List.generate(height, (val) => mylist[val].split(''));
}
void printRoom() {
print(' ');
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
stdout.write(room[y][x] + ' ');
}
print(' ');
}
print(' ');
}
List<Point> dirs = [Point(-1, -1), Point(-1, 0), Point(-1, 1), Point(1, -1), Point(1, 0), Point(1, 1), Point(0, -1), Point(0, 1)];
Point adjacent(List<List<String>> _room, Point seat, {bool sectionB = false}) {
var open = 0;
var occupied = 0;
// var _seat = '.';
if (sectionB == false) {
for (var y = seat.item1 - 1; y < seat.item1 + 2; y++) {
for (var x = seat.item2 - 1; x < seat.item2 + 2; x++) {
if (x == seat.item2 && y == seat.item1) continue;
if (x < 0 || x >= width || y < 0 || y >= height || _room[y][x] != '#') open++;
if (x >= 0 && x < width && y >= 0 && y < height && _room[y][x] == '#') occupied++;
}
}
} else {
for (var dir in dirs) {
var x = seat.item2;
var y = seat.item1;
var done = false;
do {
x += dir.item2;
y += dir.item1;
if (x < 0 || x >= width || y < 0 || y >= height) {
done = true;
open++;
} else {
if (room[y][x] != '.') {
done = true;
if (room[y][x] == '#') {
occupied++;
} else {
open++;
}
}
}
} while (!done);
}
}
return Point(open, occupied);
}
List<List<String>> cycle({bool sectionB = false}) {
var tollerance = sectionB ? 5 : 4;
var _tmpRoom = List<List<String>>.generate(height, (val) => List.generate(width, (_) => ' '));
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
var test = adjacent(room, Point(y, x), sectionB: sectionB);
_tmpRoom[y][x] = test.item1 == 8 && room[y][x] != '.' ? '#' : room[y][x];
_tmpRoom[y][x] = test.item2 >= tollerance && _tmpRoom[y][x] == '#' ? 'L' : _tmpRoom[y][x];
}
}
return _tmpRoom;
}
Point testDifferent(List<List<String>> room1, List<List<String>> room2) {
var occupied = 0;
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
if (room1[y][x] != room2[y][x]) return Point(true, 0);
occupied += room2[y][x] == '#' ? 1 : 0;
}
}
return Point(false, occupied);
}
@override
Future<void> a({bool test}) async {
await init(test);
// printRoom();
var diff = Point(true, 0);
do {
var _tmpRoom = cycle();
// printRoom();
diff = testDifferent(room, _tmpRoom);
room = _tmpRoom;
} while (diff.item1);
answerA = diff.item2;
}
@override
Future<void> b({bool test}) async {
await init(test);
var diff = Point(true, 0);
do {
var _tmpRoom = cycle(sectionB: true);
diff = testDifferent(room, _tmpRoom);
room = _tmpRoom;
// printRoom();
} while (diff.item1);
answerB = diff.item2;
}
}