Add day 13

master
Peter Resch 5 years ago
parent b9bf721df5
commit 47137deb51

@ -10,6 +10,7 @@ import 'package:aoc2020/aoc20201209.dart';
import 'package:aoc2020/aoc20201210.dart'; import 'package:aoc2020/aoc20201210.dart';
import 'package:aoc2020/aoc20201211.dart'; import 'package:aoc2020/aoc20201211.dart';
import 'package:aoc2020/aoc20201212.dart'; import 'package:aoc2020/aoc20201212.dart';
import 'package:aoc2020/aoc20201213.dart';
import 'package:aoc2020/aocbase.dart'; import 'package:aoc2020/aocbase.dart';
import 'dart:mirrors'; import 'dart:mirrors';
@ -32,6 +33,7 @@ class aoc2020 {
AOC20201210(), AOC20201210(),
AOC20201211(), AOC20201211(),
AOC20201212(), AOC20201212(),
AOC20201213(),
]; ];
static void list() async { static void list() async {

@ -1,20 +1,77 @@
import 'dart:math';
import 'package:aoc2020/aocbase.dart'; import 'package:aoc2020/aocbase.dart';
import 'package:aoc2020/model/readdata.dart'; import 'package:aoc2020/model/readdata.dart';
class AOC20201213 extends AOCBase { class AOC20201213 extends AOCBase {
var mylist = <String>[]; var mylist = <String>[];
int get arrival => int.parse(mylist.first);
var busId = <int>[];
var busIdSec2 = <int>[];
void init(bool test) async { void init(bool test) async {
mylist = await ReadData.readFile<String>(classString, test: test); 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 @override
Future<void> a({bool test}) async { Future<void> a({bool test}) async {
await init(test); 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 @override
Future<void> b({bool test}) async { Future<void> b({bool test}) async {
await init(test); 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…
Cancel
Save