From 033ccb151a25afdddac5241964de4e82c71dd017 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Mon, 13 Dec 2021 17:32:31 -0800 Subject: [PATCH 1/3] feat(2021-day-02): navigate a sub following a set of directions --- 2021/day-02/index.js | 3 + 2021/day-02/input.txt | 1000 ++++++++++++++++++++++++++++++++++ 2021/day-02/navigate.js | 30 + 2021/day-02/navigate.test.js | 56 ++ 2021/day-02/solution.js | 42 ++ index.js | 2 +- 6 files changed, 1132 insertions(+), 1 deletion(-) create mode 100644 2021/day-02/index.js create mode 100644 2021/day-02/input.txt create mode 100644 2021/day-02/navigate.js create mode 100644 2021/day-02/navigate.test.js create mode 100644 2021/day-02/solution.js diff --git a/2021/day-02/index.js b/2021/day-02/index.js new file mode 100644 index 0000000..af7e035 --- /dev/null +++ b/2021/day-02/index.js @@ -0,0 +1,3 @@ +// eslint-disable-next-line no-unused-vars +const console = require('../helpers') +require('./solution') diff --git a/2021/day-02/input.txt b/2021/day-02/input.txt new file mode 100644 index 0000000..d5c08db --- /dev/null +++ b/2021/day-02/input.txt @@ -0,0 +1,1000 @@ +forward 9 +forward 9 +forward 3 +down 2 +forward 8 +down 8 +forward 1 +down 6 +down 9 +down 9 +forward 1 +up 5 +up 4 +up 8 +down 6 +down 7 +forward 4 +forward 6 +forward 2 +forward 2 +forward 4 +down 2 +down 6 +forward 6 +forward 9 +up 4 +up 6 +down 2 +forward 7 +up 7 +down 8 +down 4 +down 6 +forward 1 +down 2 +up 1 +forward 8 +down 9 +forward 6 +up 9 +down 8 +forward 5 +forward 8 +down 8 +up 3 +up 9 +down 2 +down 2 +forward 5 +up 7 +forward 5 +down 6 +forward 4 +down 2 +up 2 +up 7 +up 1 +down 4 +down 8 +forward 6 +down 2 +forward 7 +down 1 +forward 7 +forward 1 +up 1 +down 4 +down 3 +down 4 +down 4 +up 8 +down 1 +up 7 +forward 8 +down 5 +up 1 +down 4 +down 3 +forward 4 +up 7 +forward 1 +down 4 +down 2 +down 4 +up 8 +up 6 +down 1 +up 3 +down 5 +forward 4 +down 3 +forward 9 +down 9 +forward 2 +down 4 +up 3 +down 4 +forward 1 +forward 7 +forward 9 +forward 7 +forward 3 +forward 6 +down 4 +forward 7 +down 5 +down 1 +forward 7 +up 1 +down 8 +down 7 +down 7 +down 7 +down 3 +forward 4 +forward 6 +forward 6 +forward 1 +down 7 +down 6 +down 8 +up 5 +down 7 +up 6 +forward 9 +down 7 +down 1 +down 9 +forward 8 +up 5 +down 6 +forward 3 +up 2 +down 1 +forward 2 +down 3 +up 6 +forward 8 +forward 1 +forward 3 +down 9 +forward 1 +down 3 +up 7 +forward 8 +up 8 +down 7 +down 2 +forward 3 +up 7 +forward 6 +down 7 +down 6 +up 5 +forward 9 +down 7 +up 5 +forward 6 +up 5 +up 6 +forward 6 +down 8 +down 1 +forward 7 +forward 6 +down 5 +down 6 +forward 9 +down 6 +up 5 +forward 9 +forward 4 +down 1 +forward 5 +down 4 +forward 5 +forward 1 +down 1 +forward 4 +down 5 +forward 4 +up 8 +down 1 +forward 6 +down 5 +forward 8 +forward 8 +forward 5 +down 7 +down 4 +forward 4 +up 1 +up 8 +down 6 +up 5 +forward 6 +forward 5 +forward 9 +down 3 +down 5 +forward 3 +down 6 +forward 6 +up 7 +up 6 +down 6 +down 1 +forward 8 +forward 9 +up 5 +forward 8 +forward 9 +forward 9 +down 2 +down 8 +forward 8 +down 2 +up 8 +down 2 +down 2 +up 1 +down 5 +down 6 +down 1 +down 8 +down 9 +forward 3 +forward 2 +down 6 +up 8 +forward 9 +forward 7 +forward 1 +down 8 +up 8 +forward 8 +down 5 +down 3 +up 3 +forward 6 +forward 5 +down 4 +forward 4 +down 4 +forward 5 +forward 9 +forward 2 +forward 9 +down 1 +down 3 +down 6 +forward 6 +down 7 +forward 3 +forward 4 +forward 1 +down 6 +forward 1 +forward 4 +forward 2 +forward 2 +forward 1 +forward 2 +down 1 +up 2 +forward 1 +down 3 +forward 8 +down 3 +down 9 +forward 5 +down 3 +down 3 +forward 2 +forward 9 +down 9 +forward 4 +down 2 +forward 5 +up 8 +down 4 +forward 5 +down 1 +forward 9 +down 1 +forward 7 +forward 2 +down 2 +down 6 +up 3 +forward 7 +up 4 +forward 7 +forward 6 +down 8 +forward 2 +down 3 +forward 9 +forward 4 +forward 8 +down 6 +forward 8 +down 9 +down 2 +down 3 +forward 1 +down 5 +down 3 +forward 2 +forward 7 +down 4 +down 3 +forward 9 +down 2 +forward 2 +forward 1 +up 6 +up 4 +down 5 +forward 5 +up 8 +down 7 +forward 6 +down 5 +forward 3 +forward 3 +forward 7 +up 9 +up 6 +down 5 +up 7 +forward 2 +forward 5 +down 9 +down 6 +forward 7 +down 9 +up 2 +up 5 +forward 1 +forward 8 +forward 9 +up 8 +forward 9 +forward 5 +up 9 +down 4 +down 7 +forward 2 +forward 1 +down 4 +up 8 +down 5 +down 7 +down 9 +down 3 +down 9 +up 8 +up 7 +up 8 +down 8 +down 2 +down 6 +down 6 +up 5 +up 9 +forward 1 +down 8 +up 4 +up 3 +forward 7 +up 7 +down 3 +up 1 +forward 3 +down 7 +forward 8 +forward 2 +down 6 +down 2 +up 7 +up 5 +forward 7 +forward 1 +forward 6 +up 6 +forward 5 +down 2 +up 4 +forward 2 +down 9 +forward 6 +forward 3 +forward 3 +forward 4 +forward 2 +down 6 +forward 9 +forward 7 +down 4 +up 1 +forward 4 +down 6 +down 6 +up 1 +up 1 +forward 3 +down 5 +up 5 +down 3 +down 6 +up 8 +down 2 +up 6 +up 1 +forward 8 +up 6 +down 8 +forward 9 +forward 4 +forward 9 +down 7 +down 9 +down 6 +down 1 +forward 9 +forward 9 +down 6 +down 5 +up 6 +down 9 +up 4 +up 5 +forward 8 +down 4 +down 5 +forward 8 +forward 7 +down 2 +forward 2 +forward 6 +forward 7 +down 1 +down 7 +down 1 +down 6 +forward 2 +up 2 +down 4 +down 8 +forward 1 +down 1 +down 3 +down 3 +up 9 +down 9 +forward 3 +up 4 +forward 1 +down 9 +down 8 +down 9 +forward 5 +forward 4 +up 3 +down 8 +forward 2 +down 3 +up 5 +forward 4 +down 7 +down 8 +down 9 +forward 8 +down 8 +forward 4 +down 6 +down 3 +forward 5 +down 3 +down 9 +down 4 +up 8 +forward 4 +up 6 +down 3 +forward 6 +down 9 +down 7 +forward 7 +forward 3 +forward 2 +forward 4 +down 4 +down 5 +up 9 +down 2 +down 6 +down 9 +forward 7 +forward 3 +up 3 +forward 3 +down 4 +down 7 +forward 2 +down 2 +forward 3 +down 8 +down 7 +down 7 +forward 2 +forward 2 +up 6 +forward 8 +forward 9 +up 3 +forward 8 +forward 5 +forward 7 +up 3 +forward 3 +forward 6 +down 5 +down 5 +down 4 +forward 1 +forward 8 +forward 4 +forward 3 +down 1 +forward 8 +down 4 +up 5 +forward 4 +down 2 +forward 7 +down 2 +forward 9 +down 1 +forward 6 +forward 8 +forward 6 +forward 7 +forward 1 +forward 6 +down 5 +up 3 +forward 7 +down 6 +forward 2 +down 2 +forward 8 +forward 9 +up 7 +forward 1 +forward 1 +up 1 +forward 1 +down 2 +forward 6 +down 9 +up 1 +up 2 +forward 6 +forward 1 +forward 7 +down 1 +up 8 +forward 7 +up 6 +up 4 +down 1 +forward 2 +down 4 +down 1 +down 7 +down 4 +up 3 +forward 8 +forward 3 +forward 5 +down 7 +down 8 +forward 5 +forward 2 +down 5 +down 2 +forward 2 +up 9 +down 3 +down 5 +up 7 +down 4 +down 2 +down 7 +forward 6 +down 2 +forward 1 +up 4 +forward 2 +forward 2 +down 5 +down 1 +down 1 +forward 7 +forward 6 +down 7 +down 5 +up 1 +up 3 +forward 3 +forward 9 +forward 4 +down 1 +down 5 +forward 3 +forward 7 +down 8 +forward 8 +forward 2 +forward 7 +up 7 +down 7 +down 4 +down 2 +up 6 +up 1 +forward 8 +up 8 +up 6 +down 8 +forward 1 +down 5 +forward 3 +down 3 +down 3 +forward 1 +up 3 +up 3 +forward 8 +forward 8 +down 8 +forward 6 +forward 2 +down 7 +forward 8 +down 7 +up 5 +forward 7 +down 1 +forward 9 +up 6 +down 2 +up 2 +up 5 +forward 6 +forward 9 +forward 3 +down 8 +forward 8 +down 2 +up 5 +down 9 +forward 5 +down 6 +down 3 +down 9 +up 8 +up 3 +down 2 +forward 7 +forward 4 +forward 4 +forward 8 +up 6 +up 4 +forward 9 +down 6 +down 8 +up 3 +up 5 +forward 8 +forward 7 +forward 4 +down 8 +forward 1 +forward 5 +down 9 +forward 8 +up 6 +down 6 +down 8 +down 2 +forward 4 +forward 9 +forward 2 +forward 7 +down 3 +forward 3 +up 6 +down 4 +forward 2 +up 4 +down 4 +forward 4 +forward 3 +forward 1 +up 6 +forward 1 +down 1 +forward 7 +up 4 +forward 3 +down 4 +up 6 +up 2 +up 8 +down 1 +down 6 +down 6 +down 1 +down 7 +forward 8 +down 9 +forward 5 +up 2 +up 7 +up 5 +down 6 +up 1 +up 6 +forward 4 +down 7 +forward 5 +forward 1 +down 6 +forward 2 +down 2 +forward 9 +down 9 +up 6 +forward 1 +up 7 +down 7 +forward 1 +down 6 +up 1 +forward 2 +forward 1 +down 4 +forward 9 +forward 7 +forward 5 +down 1 +forward 2 +down 2 +down 2 +down 5 +forward 1 +up 8 +forward 9 +down 7 +forward 9 +down 2 +up 5 +down 9 +down 8 +down 5 +forward 8 +forward 4 +down 4 +down 6 +forward 1 +down 5 +up 6 +down 3 +down 3 +forward 9 +down 9 +forward 6 +down 5 +up 6 +down 5 +up 7 +forward 9 +down 2 +down 4 +down 8 +forward 4 +up 7 +forward 9 +forward 7 +up 5 +down 7 +down 5 +down 1 +forward 5 +forward 4 +down 2 +up 3 +forward 1 +up 4 +up 9 +down 4 +forward 3 +down 4 +down 9 +forward 4 +up 2 +up 3 +forward 7 +up 6 +down 8 +down 8 +forward 6 +forward 2 +forward 3 +forward 9 +forward 7 +down 6 +down 7 +down 4 +down 2 +forward 8 +down 6 +forward 6 +forward 6 +forward 9 +down 8 +down 1 +up 5 +down 1 +forward 9 +down 1 +up 8 +forward 8 +down 3 +forward 1 +down 9 +forward 6 +forward 4 +forward 8 +down 2 +up 8 +down 2 +up 8 +down 9 +down 4 +up 7 +forward 7 +forward 5 +down 5 +down 4 +up 8 +forward 1 +down 7 +forward 1 +up 9 +forward 9 +forward 7 +forward 9 +down 9 +forward 4 +down 7 +forward 6 +forward 6 +up 3 +forward 2 +down 5 +up 8 +down 1 +up 8 +down 4 +down 1 +up 6 +forward 4 +forward 3 +forward 6 +down 3 +forward 4 +forward 4 +forward 4 +down 8 +forward 3 +up 8 +up 8 +down 8 +forward 6 +forward 8 +up 5 +forward 6 +down 8 +down 7 +up 4 +forward 6 +forward 9 +down 9 +forward 4 +up 2 +forward 1 +up 3 +down 9 +down 8 +forward 8 +forward 8 +forward 7 +down 6 +down 1 +up 6 +up 6 +forward 9 +forward 7 +forward 7 +down 3 +down 6 +down 9 +down 4 +forward 7 +forward 3 +forward 3 +down 7 +up 5 +down 3 +forward 6 +forward 3 +forward 5 +up 3 +down 7 +forward 2 +up 7 +forward 9 +down 3 +down 9 +forward 8 +forward 5 +up 7 +up 2 +up 8 +forward 6 +down 8 +forward 2 +forward 4 +up 2 +forward 2 +forward 8 +forward 4 +down 8 +forward 5 +down 4 +down 7 +forward 3 +down 3 +up 1 +down 9 +forward 9 +down 2 +down 1 +forward 1 +down 6 +down 3 +forward 5 +down 3 +down 8 +up 7 +down 1 +up 9 +down 4 +forward 9 +down 4 +forward 3 +forward 6 +down 3 +forward 3 +down 2 +down 7 +down 1 +up 4 +down 9 +down 1 +down 3 +down 4 +down 8 +down 7 +forward 4 +down 4 +down 9 +forward 2 +forward 7 +forward 2 +down 6 +up 8 +forward 6 +down 2 +forward 6 +up 8 +forward 6 +down 9 +forward 2 +forward 6 diff --git a/2021/day-02/navigate.js b/2021/day-02/navigate.js new file mode 100644 index 0000000..a378497 --- /dev/null +++ b/2021/day-02/navigate.js @@ -0,0 +1,30 @@ +const move = (location, direction, distance) => { + const result = location + switch (direction) { + case 'forward': + result.x += distance + break + case 'up': + result.d -= distance + break + case 'down': + result.d += distance + break + default: + throw new Error(`Direction ${direction} is unsupported`) + } + return result +} + +const navigate = (location, route) => { + let position = location + route.forEach(instruction => { + position = move(position, instruction[0], instruction[1]) + }) + return position +} + +module.exports = { + move, + navigate +} diff --git a/2021/day-02/navigate.test.js b/2021/day-02/navigate.test.js new file mode 100644 index 0000000..d51369e --- /dev/null +++ b/2021/day-02/navigate.test.js @@ -0,0 +1,56 @@ +/* eslint-env mocha */ +const { expect } = require('chai') +const { move, navigate } = require('./navigate') + +const TestRoute = [ + ['down', 5], + ['forward', 5], + ['forward', 8], + ['up', 3], + ['down', 8], + ['forward', 2] +] + +describe('--- Day 2: Dive! ---', () => { + describe('Part 1', () => { + describe('move()', () => { + it('moves the submarine forward', () => { + expect(move({ x: 0, d: 0 }, 'forward', 8)).to.deep.equal({ + x: 8, + d: 0 + }) + }) + it('moves the submarine down', () => { + expect(move({ x: 0, d: 0 }, 'down', 8)).to.deep.equal({ + x: 0, + d: 8 + }) + }) + it('moves the submarine up', () => { + expect(move({ x: 0, d: 0 }, 'up', 8)).to.deep.equal({ + x: 0, + d: -8 + }) + }) + it('throws an error for an unexpected direction', () => { + expect(() => { + move({ x: 0, d: 0 }, 'garbage', 5) + }).to.throw('Direction garbage is unsupported') + }) + // it('defaults to 0,0 as the origin when not provided', () => { + // expect(move({}, 'up', 8)).to.deep.equal({ + // x: 0, + // d: -8 + // }) + // }) + }) + describe('navigate()', () => { + it('takes a series of directions and follows the route', () => { + expect(navigate({ x: 0, d: 0 }, TestRoute)).to.deep.equal({ + x: 15, + d: 10 + }) + }) + }) + }) +}) diff --git a/2021/day-02/solution.js b/2021/day-02/solution.js new file mode 100644 index 0000000..ca45df8 --- /dev/null +++ b/2021/day-02/solution.js @@ -0,0 +1,42 @@ +const fs = require('fs') +const path = require('path') +const filePath = path.join(__dirname, 'input.txt') +const { linesToArray } = require('../../2018/inputParser') +const { navigate } = require('./navigate') + +fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => { + if (err) throw err + + initData = linesToArray(initData.trim()).map(command => { + const tmp = command.split(' ') + return [ + tmp[0], + parseInt(tmp[1]) + ] + }) + + const resetInput = () => { + // Deep copy to ensure we aren't mutating the original data + return JSON.parse(JSON.stringify(initData)) + } + + const part1 = () => { + const data = resetInput() + const destination = navigate({ x: 0, d: 0 }, data) + return destination.x * destination.d + } + + const part2 = () => { + const data = resetInput() + console.debug(data) + return 'No answer yet' + } + const answers = [] + answers.push(part1()) + answers.push(part2()) + + answers.forEach((ans, idx) => { + console.info(`-- Part ${idx + 1} --`) + console.info(`Answer: ${ans}`) + }) +}) diff --git a/index.js b/index.js index c0d3680..fe32819 100644 --- a/index.js +++ b/index.js @@ -1 +1 @@ -require('./2021/day-01/solution') +require('./2021/day-02/solution') From 57638debe926d23f59d75d3bf9ae257ca223680f Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Mon, 13 Dec 2021 17:51:52 -0800 Subject: [PATCH 2/3] test: correct test data sequeance --- 2021/day-02/navigate.test.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/2021/day-02/navigate.test.js b/2021/day-02/navigate.test.js index d51369e..b9638e0 100644 --- a/2021/day-02/navigate.test.js +++ b/2021/day-02/navigate.test.js @@ -3,8 +3,8 @@ const { expect } = require('chai') const { move, navigate } = require('./navigate') const TestRoute = [ - ['down', 5], ['forward', 5], + ['down', 5], ['forward', 8], ['up', 3], ['down', 8], @@ -37,12 +37,6 @@ describe('--- Day 2: Dive! ---', () => { move({ x: 0, d: 0 }, 'garbage', 5) }).to.throw('Direction garbage is unsupported') }) - // it('defaults to 0,0 as the origin when not provided', () => { - // expect(move({}, 'up', 8)).to.deep.equal({ - // x: 0, - // d: -8 - // }) - // }) }) describe('navigate()', () => { it('takes a series of directions and follows the route', () => { From 43985c85baef441ff8f3b74bb933cee0cc7d8142 Mon Sep 17 00:00:00 2001 From: Anthony McLin Date: Mon, 13 Dec 2021 17:53:29 -0800 Subject: [PATCH 3/3] feat(2021-day-02): move the submarine using aiming --- 2021/day-02/navigate.js | 30 ++++++++++++++++++++--- 2021/day-02/navigate.test.js | 46 +++++++++++++++++++++++++++++++++++- 2021/day-02/solution.js | 4 ++-- 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/2021/day-02/navigate.js b/2021/day-02/navigate.js index a378497..d119a4e 100644 --- a/2021/day-02/navigate.js +++ b/2021/day-02/navigate.js @@ -16,15 +16,39 @@ const move = (location, direction, distance) => { return result } -const navigate = (location, route) => { +const navigate = (location, route, useAiming = false) => { let position = location route.forEach(instruction => { - position = move(position, instruction[0], instruction[1]) + if (useAiming) { + position = aimedMove(position, instruction[0], instruction[1]) + } else { + position = move(position, instruction[0], instruction[1]) + } }) return position } +const aimedMove = (location, direction, distance) => { + const result = location + switch (direction) { + case 'forward': + result.x += distance + result.d += (distance * location.a) + break + case 'up': + result.a -= distance + break + case 'down': + result.a += distance + break + default: + throw new Error(`Direction ${direction} is unsupported`) + } + return result +} + module.exports = { move, - navigate + navigate, + aimedMove } diff --git a/2021/day-02/navigate.test.js b/2021/day-02/navigate.test.js index b9638e0..45980ff 100644 --- a/2021/day-02/navigate.test.js +++ b/2021/day-02/navigate.test.js @@ -1,6 +1,6 @@ /* eslint-env mocha */ const { expect } = require('chai') -const { move, navigate } = require('./navigate') +const { move, navigate, aimedMove } = require('./navigate') const TestRoute = [ ['forward', 5], @@ -47,4 +47,48 @@ describe('--- Day 2: Dive! ---', () => { }) }) }) + describe('Part 2', () => { + describe('aimedMove()', () => { + it('moves forward when the aim is 0', () => { + expect(aimedMove({ x: 0, d: 0, a: 0 }, 'forward', 5)).to.deep.equal({ + x: 5, + d: 0, + a: 0 + }) + }) + it('aims down without moving', () => { + expect(aimedMove({ x: 0, d: 0, a: 0 }, 'down', 5)).to.deep.equal({ + x: 0, + d: 0, + a: 5 + }) + }) + it('moves forward and down when aimed', () => { + expect(aimedMove({ x: 0, d: 0, a: 5 }, 'forward', 8)).to.deep.equal({ + x: 8, + d: 40, + a: 5 + }) + }) + it('aims up without moving', () => { + expect(aimedMove({ x: 0, d: 0, a: 5 }, 'up', 3)).to.deep.equal({ + x: 0, + d: 0, + a: 2 + }) + }) + it('throws an error for an unexpected direction', () => { + expect(() => { + aimedMove({ x: 0, d: 0, a: 5 }, 'garbage', 5) + }).to.throw('Direction garbage is unsupported') + }) + }) + describe('navigate()', () => { + it('can navigate using aiming', () => { + const destination = navigate({ x: 0, d: 0, a: 0 }, TestRoute, true) + expect(destination.x).to.equal(15) + expect(destination.d).to.equal(60) + }) + }) + }) }) diff --git a/2021/day-02/solution.js b/2021/day-02/solution.js index ca45df8..bbf27d3 100644 --- a/2021/day-02/solution.js +++ b/2021/day-02/solution.js @@ -28,8 +28,8 @@ fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => { const part2 = () => { const data = resetInput() - console.debug(data) - return 'No answer yet' + const destination = navigate({ x: 0, d: 0, a: 0 }, data, true) + return destination.x * destination.d } const answers = [] answers.push(part1()) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy