import 'dart:math'; import 'package:aoc2020/aocbase.dart'; import 'package:aoc2020/model/readdata.dart'; class AOC20201213 extends AOCBase { var mylist = []; int get arrival => int.parse(mylist.first); var busId = []; var busIdSec2 = []; void init(bool test) async { mylist = await ReadData.readFile(classString, test: test); busId = mylist.last.split(',').where((id) => id != 'x').toList().map((id) => int.parse(id)).toList(); busIdSec2 = mylist.last.split(',').map((id) => id == 'x' ? 1 : int.parse(id)).toList(); } @override Future a({bool test}) async { await init(test); var _mods = busId.map((id) => id - (arrival % id)).toList(); var _minTime = _mods.reduce(min); var myBusId = busId[_mods.indexOf(_minTime)]; answerA = myBusId * _minTime; } @override Future b({bool test}) async { await init(test); var maxTime = busIdSec2.reduce(max); var indexOfMax = busIdSec2.indexOf(maxTime); var offsets = []; for (var index = 0; index < busIdSec2.length; index++) { if (busIdSec2[index] != 1) offsets.add(index - indexOfMax); } // var mapOfBusIds = = busId.asMap(); var mapOfBusIdtoOffsets = {}; var mapOfIndexToBusId = {}; for (var i = 0; i < busId.length; i++) { mapOfBusIdtoOffsets[busId[i]] = offsets[i]; mapOfIndexToBusId[i] = busId[i]; } busId.sort((b, a) => a.compareTo(b)); // void printSched(int time, int increment, int currIndex) { // stdout.write('$time [$increment:$currIndex]'); // for (var index = 0; index < busId.length; index++) { // var busid = mapOfIndexToBusId[index]; // var str = (time + mapOfBusIdtoOffsets[busid]) % busid == 0 ? 'D' : '.'; // stdout.write(' $str'); // } // print(' '); // } int calcFor({int number, int inputTime, int increment}) { var time = inputTime; var notdone = true; do { var fail = false; time += increment; for (var index = 0; index < number && !fail; index++) { var offset = mapOfBusIdtoOffsets[busId[index]]; fail = (time + offset) % busId[index] != 0; } notdone = fail; } while (notdone && time > 0); return time; } var time1 = calcFor(number: 4, inputTime: 0, increment: maxTime); var time2 = calcFor(number: 4, inputTime: time1, increment: maxTime); var diffTime = time2 - time1; print('$time2 - $time1 = ${diffTime}'); var time = calcFor(number: busId.length, inputTime: time2, increment: diffTime); answerB = time - indexOfMax; } }