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