Add day 13
parent
b9bf721df5
commit
47137deb51
@ -1,20 +1,77 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,2 @@
|
||||
1000299
|
||||
41,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,971,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,17,13,x,x,x,x,23,x,x,x,x,x,29,x,487,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,19
|
||||
@ -0,0 +1,7 @@
|
||||
939
|
||||
17,x,13,19
|
||||
67,7,59,61
|
||||
67,x,7,59,61
|
||||
67,7,x,59,61
|
||||
1789,37,47,1889
|
||||
7,13,x,x,59,x,31,19
|
||||
Loading…
Reference in New Issue