Skip to content

Commit 9f89cd5

Browse files
Merge pull request #135 from amclin/feat/2020-day-13
Feat/2020 day 13
2 parents 8d0c3e2 + f2ab7be commit 9f89cd5

File tree

6 files changed

+140
-1
lines changed

6 files changed

+140
-1
lines changed

2020/day-12/ferry.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const { expect } = require('chai')
33
const { distance } = require('../../2018/day-06/coordinates')
44
const { move, route } = require('./ferry')
55

6-
describe('--- Day 11: Seating System ---', () => {
6+
describe('--- Day 12: Rain Risk ---', () => {
77
describe('Part 1', () => {
88
describe('move()', () => {
99
let origin

2020/day-13/busSchedules.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
const parseSchedule = (schedule) => {
2+
// Drop "x" and convert to numeric
3+
return schedule.split(',').filter((e) => e !== 'x').map(Number)
4+
}
5+
6+
const findNext = ({ time, schedule }) => {
7+
const result = schedule.map((route) => {
8+
return {
9+
route,
10+
wait: route - (time % route)
11+
}
12+
}).sort(
13+
(a, b) => a.wait - b.wait
14+
)
15+
16+
result.forEach((res) => {
17+
console.debug(`Wait for route ${res.route} is ${res.wait}`)
18+
})
19+
20+
return result[0]
21+
}
22+
23+
const findSequentialTime = (schedule) => {
24+
const routes = schedule.split(',').map((el) => (el !== 'x') ? Number(el) : el)
25+
26+
let x = routes[0]
27+
let result = []
28+
// If we get an array the same length as the routes array, that means all routes matched
29+
while (result.length < routes.length) {
30+
x += routes[0]
31+
// loop through the list looking for el mod = idx
32+
let matches = true
33+
let i = 0
34+
while (i < routes.length && matches === true) {
35+
if (routes[i] === 'x') { // "x" doesn't matter
36+
i++
37+
} else if ((x + i) % routes[i] === 0) { // Route is sequentially +1 above the previous route
38+
i++
39+
} else {
40+
matches = false
41+
}
42+
}
43+
if (matches) { result = routes }
44+
}
45+
console.debug(`Found a match ${x}`)
46+
return x
47+
}
48+
49+
module.exports = {
50+
parseSchedule,
51+
findNext,
52+
findSequentialTime
53+
}

2020/day-13/busSchedules.test.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/* eslint-env mocha */
2+
const { expect } = require('chai')
3+
const { parseSchedule, findNext, findSequentialTime } = require('./busSchedules')
4+
5+
const testData = {
6+
time: 939,
7+
schedule: '7,13,x,x,59,x,31,19'
8+
}
9+
10+
describe('--- Day 13: Shuttle Search ---', () => {
11+
describe('Part 1', () => {
12+
describe('parseSchedule()', () => {
13+
it('cleans up the schedule', () => {
14+
expect(parseSchedule(testData.schedule))
15+
.to.deep.equal([7, 13, 59, 31, 19])
16+
})
17+
})
18+
describe('findNext()', () => {
19+
it('finds the next departing bus', () => {
20+
expect(findNext({
21+
time: 939,
22+
schedule: parseSchedule(testData.schedule)
23+
})).to.deep.equal({
24+
route: 59,
25+
wait: 5
26+
})
27+
})
28+
})
29+
})
30+
describe('Part 2', () => {
31+
describe('findSequentialTime', () => {
32+
it('finds a sequential time where the busses all depart sequentially', () => {
33+
expect(findSequentialTime('7,13,x,x,59,x,31,19')).to.equal(1068781)
34+
expect(findSequentialTime('17,x,13,19')).to.equal(3417)
35+
expect(findSequentialTime('67,7,59,61')).to.equal(754018)
36+
expect(findSequentialTime('67,x,7,59,61')).to.equal(779210)
37+
expect(findSequentialTime('67,7,x,59,61')).to.equal(1261476)
38+
expect(findSequentialTime('1789,37,47,1889')).to.equal(1202161486)
39+
})
40+
})
41+
})
42+
})

2020/day-13/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// eslint-disable-next-line no-unused-vars
2+
const console = require('../helpers')
3+
require('./solution')

2020/day-13/input.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1000067
2+
17,x,x,x,x,x,x,x,x,x,x,37,x,x,x,x,x,439,x,29,x,x,x,x,x,x,x,x,x,x,13,x,x,x,x,x,x,x,x,x,23,x,x,x,x,x,x,x,787,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,19

2020/day-13/solution.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const fs = require('fs')
2+
const path = require('path')
3+
const filePath = path.join(__dirname, 'input.txt')
4+
const { linesToArray } = require('../../2018/inputParser')
5+
const { parseSchedule, findNext } = require('./busSchedules')
6+
7+
fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => {
8+
if (err) throw err
9+
10+
initData = linesToArray(initData.trim())
11+
12+
const resetInput = () => {
13+
// Deep copy to ensure we aren't mutating the original data
14+
return JSON.parse(JSON.stringify(initData))
15+
}
16+
17+
const part1 = () => {
18+
const data = resetInput()
19+
const { wait, route } = findNext({
20+
time: data[0],
21+
schedule: parseSchedule(data[1])
22+
})
23+
return route * wait
24+
}
25+
26+
const part2 = () => {
27+
const data = resetInput()
28+
console.debug(data)
29+
return 'No answer yet'
30+
}
31+
const answers = []
32+
answers.push(part1())
33+
answers.push(part2())
34+
35+
answers.forEach((ans, idx) => {
36+
console.info(`-- Part ${idx + 1} --`)
37+
console.info(`Answer: ${ans}`)
38+
})
39+
})

0 commit comments

Comments
 (0)