jsadvent/solutions/2020/13.js
2020-12-13 00:52:19 -06:00

57 lines
1.3 KiB
JavaScript

const { Glib, BNMath: Math, fn } = require('../../lib');
const parse = (input) => {
const [arrivalString, idStrings] = input.split('\n');
return {
arrival: BigInt(arrivalString),
ids: Glib.fromSplit(idStrings, ',').map((s) =>
s === 'x' ? 1n : BigInt(s),
),
};
};
const departureAfter = (time, id) => {
let next = (time / id) * id;
return next < time ? next + id : next;
};
module.exports = {
'1': (input) => {
input = parse(input);
return input.ids
.flatMap((i) => {
if (i === 1n) {
return [];
}
return [[i, departureAfter(input.arrival, i) - input.arrival]];
})
.minScore()
.glib.product();
return id * (time - input.arrival);
},
'2': (input) => {
input = parse(input).ids.array;
let solved = 1n;
let step = input[0];
let start = departureAfter(0n, input[0]);
while (true) {
for (let i = solved; i < input.length; i++) {
const currentBus = input[i];
const currentTime = start + i;
if (departureAfter(currentTime, currentBus) === currentTime) {
solved += 1n;
step *= currentBus;
} else {
break;
}
}
if (solved == input.length) {
return start;
}
start += step;
}
},
};