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.

78 lines
2.6 KiB
Dart

import 'dart:math';
import 'package:aoc2020/aocbase.dart';
import 'package:aoc2020/model/readdata.dart';
class AOC20201213 extends AOCBase {
var mylist = <String>[];
int get arrival => int.parse(mylist.first);
var busId = <int>[];
var busIdSec2 = <int>[];
void init(bool test) async {
mylist = await ReadData.readFile<String>(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<void> 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<void> b({bool test}) async {
await init(test);
var maxTime = busIdSec2.reduce(max);
var indexOfMax = busIdSec2.indexOf(maxTime);
var offsets = <int>[];
for (var index = 0; index < busIdSec2.length; index++) {
if (busIdSec2[index] != 1) offsets.add(index - indexOfMax);
}
// var mapOfBusIds = = busId.asMap();
var mapOfBusIdtoOffsets = <int, int>{};
var mapOfIndexToBusId = <int, int>{};
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;
}
}