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
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;
|
|
}
|
|
}
|