import 'dart:math'; import 'package:aoc2020/aocbase.dart'; import 'package:aoc2020/model/point.dart'; import 'package:aoc2020/model/readdata.dart'; class AOC20201205 extends AOCBase { Point calcSeat(String row) { var rmax = 127; var cmax = 7; for (var rowBin = 0; rowBin < 7; rowBin++) { var range = 128 >> rowBin + 1; rmax -= (row[rowBin] == 'F') ? range : 0; } for (var rowBin = 0; rowBin < 3; rowBin++) { var range = 8 >> rowBin + 1; cmax -= (row[rowBin + 7] == 'L') ? range : 0; } return Point(rmax, cmax); } @override Future a({bool test}) async { var filename = (test ?? false) ? classStringTest : classString; var mylist = await ReadData.readFileString(filename); var maxSeatId = 0; for (var row in mylist) { var seat = calcSeat(row); var val = seat.item1 * 8 + seat.item2; maxSeatId = max(maxSeatId, val); } answerA = maxSeatId; } @override Future b({bool test}) async { var filename = (test ?? false) ? classStringTest : classString; var mylist = await ReadData.readFileString(filename); var plane = List.generate(128, (i) => List.generate(8, (j) => false, growable: false), growable: false); for (var row in mylist) { var seat = calcSeat(row); plane[seat.item1][seat.item2] = true; } for (var rowIndex = 0; rowIndex < plane.length; rowIndex++) { var row = plane[rowIndex]; if (row[0] == false) continue; if (row.contains(false)) { var column = row.indexWhere((seat) => seat == false); answerB = rowIndex * 8 + column; return; } } } }