Are you participating in the Advent of code this year?
If you don't know what the advent of code is, it's a website where you'll find a daily challenge (every day it gets harder). It's a really fun event, you should participate!
I try to solve the exercises using either JavaScript or TypeScript and will share my solutions daily (with one day delay so no one can cheat!). I only share the solution for the second part.
Fun exercise today! I panicked a bit with that "angle" thing, but then I realised it was always 90°, which made it pretty straightforward.
Here is my solution for day #12:
const Command = {
North: 'N',
South: 'S',
East: 'E',
West: 'W',
Left: 'L',
Right: 'R',
Forward: 'F',
}
function addTo(state, command, value) {
if (command === Command.East) return { ...state, wpx: state.wpx + value }
if (command === Command.West) return { ...state, wpx: state.wpx - value }
if (command === Command.North) return { ...state, wpy: state.wpy - value }
if (command === Command.South) return { ...state, wpy: state.wpy + value }
}
function rotate(state, command, param) {
if (param === 0) return state
if (command === Command.Left) return rotate({ ...state, wpy: 0 - state.wpx, wpx: state.wpy }, command, param - 90)
if (command === Command.Right) return rotate({ ...state, wpx: 0 - state.wpy, wpy: state.wpx }, command, param - 90)
}
function execute([command, param], state) {
if (command === Command.Forward) return { ...state, x: state.x + param * state.wpx, y: state.y + param * state.wpy }
if (command === Command.Right || command === Command.Left) return rotate(state, command, param)
return addTo(state, command, param)
}
const resultState = input.reduce(
(state, command) => {
return execute(command, state)
},
{
x: 0,
y: 0,
wpx: 10,
wpy: -1,
},
)
Feel free to share your solution in the comments!
Photo by Markus Spiske on Unsplash
Top comments (0)