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 = []; List> room = []; var width = 0; var height = 0; void init(bool test) async { mylist = await ReadData.readFile(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 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> _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> cycle({bool sectionB = false}) { var tollerance = sectionB ? 5 : 4; var _tmpRoom = List>.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> room1, List> 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 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 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; } }