diff --git a/aoc2020/lib/aoc2020.dart b/aoc2020/lib/aoc2020.dart index 3654ed1..af7a6a4 100644 --- a/aoc2020/lib/aoc2020.dart +++ b/aoc2020/lib/aoc2020.dart @@ -10,6 +10,7 @@ import 'package:aoc2020/aoc20201209.dart'; import 'package:aoc2020/aoc20201210.dart'; import 'package:aoc2020/aoc20201211.dart'; import 'package:aoc2020/aoc20201212.dart'; +import 'package:aoc2020/aoc20201213.dart'; import 'package:aoc2020/aocbase.dart'; import 'dart:mirrors'; @@ -32,6 +33,7 @@ class aoc2020 { AOC20201210(), AOC20201211(), AOC20201212(), + AOC20201213(), ]; static void list() async { diff --git a/aoc2020/lib/aoc20201213.dart b/aoc2020/lib/aoc20201213.dart index 161888f..55710ad 100644 --- a/aoc2020/lib/aoc20201213.dart +++ b/aoc2020/lib/aoc20201213.dart @@ -1,20 +1,77 @@ +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; } } diff --git a/aoc2020/lib/data/aoc20201213.data b/aoc2020/lib/data/aoc20201213.data new file mode 100644 index 0000000..11e789e --- /dev/null +++ b/aoc2020/lib/data/aoc20201213.data @@ -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 diff --git a/aoc2020/lib/data/aoc20201213test.data b/aoc2020/lib/data/aoc20201213test.data new file mode 100644 index 0000000..9d971e3 --- /dev/null +++ b/aoc2020/lib/data/aoc20201213test.data @@ -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