Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 2: Dive!

day2/solution.livemd

Day 2: Dive!

Part 1

We are fed a list of commands, one per line, so we need to first parse this. I want to end up with a list of tuples, where each tuple is an {atom, int} pair.

For example: [{"forward", 10}, {"down", 1}, ...]

input = """
forward 5
down 5
forward 8
up 3
down 8
forward 2
"""

sample_input =
  input
  |> String.split("\n", trim: true)
  |> Enum.map(fn e -> String.split(e, " ") end)
  |> Enum.map(fn [cmd, val] -> {String.to_atom(cmd), String.to_integer(val)} end)

Now that we have our data structure properly formatted, let’s do a recursive solution to get the final position.

defmodule Part1 do
  # final case
  def move([{:forward, val} | []], h, d), do: {h + val, d}
  # final case
  def move([{:down, val} | []], h, d, []), do: {h, d + val}
  # final case
  def move([{:up, val} | []], h, d), do: {h, d - val}

  def move([{:forward, val} | cmds], h, d), do: move(cmds, h + val, d)
  def move([{:down, val} | cmds], h, d), do: move(cmds, h, d + val)
  def move([{:up, val} | cmds], h, d), do: move(cmds, h, d - val)
end

{final_h, final_d} = Part1.move(sample_input, 0, 0)

IO.inspect({final_h, final_d})

final_h * final_d

Now solving for our particular input:

input = """
forward 3
down 7
forward 7
down 4
down 9
down 7
forward 5
forward 9
forward 3
forward 8
down 4
down 6
down 3
forward 7
forward 1
forward 4
down 1
forward 7
forward 9
down 3
down 1
down 5
forward 8
down 2
down 9
forward 3
down 9
down 7
down 6
down 1
forward 4
forward 9
forward 8
down 3
down 9
down 5
forward 5
down 7
down 7
up 1
down 2
up 1
down 7
up 1
up 1
down 8
down 8
forward 2
down 5
forward 9
forward 8
forward 4
up 2
down 9
down 7
forward 4
up 7
up 4
down 4
down 3
forward 8
down 8
up 2
up 1
forward 3
up 6
up 8
down 5
down 4
down 4
forward 1
down 8
forward 3
forward 5
forward 4
forward 2
forward 7
up 5
up 2
forward 2
forward 5
down 4
up 6
forward 3
forward 1
forward 1
forward 6
forward 7
forward 1
forward 8
forward 4
forward 4
forward 8
down 6
down 8
forward 4
forward 1
down 8
forward 3
forward 3
forward 9
forward 9
forward 3
up 1
down 2
down 5
forward 4
forward 5
forward 7
forward 4
forward 4
up 5
forward 1
down 9
down 9
down 1
up 7
down 8
up 6
down 4
forward 7
down 8
down 1
forward 4
forward 5
forward 9
down 2
forward 7
forward 7
up 2
up 1
forward 9
forward 1
forward 7
up 3
forward 8
forward 1
down 6
down 6
down 4
forward 2
forward 1
down 3
down 4
down 2
forward 9
up 8
down 4
down 3
down 1
down 1
forward 6
forward 6
down 7
forward 1
forward 5
forward 9
forward 5
forward 1
up 8
forward 7
up 3
forward 6
down 5
up 8
down 4
down 8
forward 2
up 7
forward 9
down 9
forward 1
down 5
forward 8
down 7
forward 8
forward 1
forward 5
down 4
down 1
forward 4
up 6
down 3
down 1
forward 1
forward 1
up 8
down 9
forward 8
forward 5
down 5
forward 1
up 9
down 6
down 4
up 2
forward 5
down 7
up 1
forward 3
up 5
forward 9
up 6
down 4
forward 6
down 8
down 2
forward 3
forward 4
down 5
down 7
down 4
up 3
up 8
down 8
up 8
down 8
forward 8
down 3
up 3
forward 8
down 6
forward 2
down 8
down 5
up 2
forward 1
forward 4
down 1
forward 5
forward 5
forward 2
forward 2
forward 4
down 7
forward 6
up 6
down 8
forward 4
forward 6
forward 2
down 8
down 2
up 1
down 8
forward 9
up 5
forward 8
up 9
down 1
down 2
forward 6
down 9
forward 3
up 8
up 4
down 8
forward 2
down 1
forward 6
forward 4
down 4
forward 4
up 8
down 6
forward 3
up 2
up 6
down 1
down 3
down 1
up 6
down 9
up 6
forward 9
down 4
forward 3
forward 1
up 7
down 1
forward 5
up 1
up 8
forward 5
down 5
forward 2
up 8
up 7
forward 4
up 7
up 4
forward 5
forward 3
down 9
forward 1
down 8
forward 3
up 3
down 7
forward 4
down 7
down 5
down 8
down 8
forward 6
forward 5
up 4
down 6
forward 4
up 2
up 4
down 4
down 9
forward 7
down 8
forward 6
forward 5
up 8
down 6
forward 1
up 2
forward 5
forward 7
down 4
down 6
forward 9
forward 2
up 6
up 6
forward 1
up 6
forward 8
down 7
forward 1
down 1
up 9
up 1
forward 1
forward 7
forward 5
down 4
forward 6
forward 4
down 8
up 6
up 8
forward 6
forward 3
up 6
forward 6
down 8
down 5
down 5
down 2
down 6
forward 1
forward 4
forward 5
down 5
forward 6
forward 2
forward 2
up 7
up 6
up 7
forward 7
forward 6
down 7
down 7
up 4
forward 5
forward 2
down 6
up 4
forward 8
down 1
down 5
up 6
down 4
down 3
down 8
forward 8
down 9
forward 8
forward 6
down 4
down 3
forward 6
up 4
up 9
forward 3
down 3
down 9
forward 1
down 7
forward 2
up 7
down 6
forward 5
down 8
down 1
forward 8
down 4
up 3
down 5
forward 6
down 7
forward 3
forward 6
forward 8
forward 6
down 4
down 6
forward 9
up 8
forward 2
forward 8
forward 1
forward 1
forward 3
forward 8
forward 6
forward 8
down 5
down 2
down 6
up 4
forward 5
forward 9
forward 1
down 3
down 6
down 7
forward 5
forward 8
up 1
forward 4
up 3
forward 6
down 3
down 7
down 1
down 1
forward 8
forward 3
forward 2
forward 1
forward 3
forward 7
up 6
down 8
forward 3
forward 8
forward 1
forward 4
up 3
down 7
up 9
up 6
forward 1
forward 6
forward 5
down 5
down 2
forward 8
up 8
down 4
forward 6
down 2
forward 1
down 8
forward 2
forward 9
forward 1
down 9
down 1
down 9
down 1
up 9
forward 3
forward 7
forward 3
down 5
up 3
forward 4
up 1
forward 2
down 8
forward 8
down 1
up 9
down 7
forward 9
up 6
down 3
forward 9
down 2
down 3
up 5
up 5
forward 8
down 2
forward 2
up 3
down 8
down 1
down 9
forward 5
down 5
down 5
down 4
down 8
forward 7
up 3
up 4
up 4
up 7
down 2
down 6
up 3
down 9
up 2
forward 6
forward 1
down 7
down 5
forward 6
down 6
up 4
down 4
down 8
up 5
forward 9
down 8
forward 1
forward 2
forward 8
forward 2
forward 3
up 9
up 8
up 9
up 6
down 5
forward 7
up 8
forward 1
down 3
down 8
forward 3
up 6
down 2
forward 2
up 4
up 4
forward 6
forward 1
forward 4
down 3
down 1
up 7
down 9
up 1
down 9
down 4
up 2
forward 8
down 3
forward 7
up 6
forward 7
up 2
forward 5
down 3
up 2
down 3
down 8
forward 5
down 8
forward 7
up 6
down 4
forward 4
down 1
up 3
forward 6
down 1
down 2
down 2
forward 7
down 6
down 2
forward 9
down 2
forward 2
down 2
forward 6
down 9
up 4
up 7
up 6
down 3
forward 3
down 7
down 6
forward 8
down 4
up 3
down 1
forward 8
down 4
forward 5
forward 1
down 7
forward 5
up 3
down 7
forward 3
down 4
up 1
down 5
forward 8
down 2
forward 9
forward 3
up 2
down 9
forward 5
up 7
down 7
down 1
down 7
down 8
forward 1
down 9
down 7
forward 4
down 5
forward 9
down 6
down 1
forward 2
up 4
up 3
down 1
forward 4
up 3
forward 4
up 2
forward 6
down 6
up 8
down 3
forward 5
down 2
forward 9
down 3
down 7
forward 4
down 5
up 9
up 9
down 4
up 5
forward 1
down 8
up 8
up 4
up 2
up 8
forward 5
down 5
up 1
down 6
down 3
up 4
forward 3
forward 1
forward 1
up 4
forward 1
down 6
forward 7
forward 4
forward 4
forward 9
forward 6
down 6
forward 4
up 7
down 5
down 2
forward 3
down 7
forward 8
down 7
forward 4
up 9
down 1
forward 3
forward 1
forward 4
down 2
up 2
down 1
down 4
down 7
forward 5
forward 3
up 5
forward 1
down 4
down 8
up 4
up 1
down 1
down 4
down 2
down 4
up 8
down 3
forward 8
up 5
down 4
forward 9
forward 7
down 4
forward 7
forward 9
forward 6
forward 9
up 9
down 3
up 4
down 8
forward 9
up 2
up 3
forward 8
forward 3
forward 1
forward 7
forward 8
forward 9
down 7
forward 3
forward 3
forward 4
up 8
forward 1
forward 5
up 9
down 2
down 7
forward 5
up 4
forward 9
down 9
up 2
forward 7
down 9
up 8
up 1
up 1
up 5
forward 4
down 2
forward 7
down 1
down 8
down 8
forward 3
forward 8
up 9
forward 7
forward 6
forward 3
forward 7
up 3
up 6
forward 5
forward 5
down 2
down 7
down 7
up 7
forward 6
forward 1
forward 7
up 6
down 9
forward 7
forward 1
up 7
forward 4
forward 9
up 2
down 5
down 6
down 4
forward 1
forward 7
forward 4
forward 5
down 2
forward 5
down 9
forward 7
forward 4
up 5
down 6
forward 2
forward 4
forward 8
up 1
down 2
up 9
forward 6
down 1
forward 6
forward 4
down 6
forward 6
up 4
down 5
forward 8
down 3
up 4
forward 3
down 6
up 7
down 8
down 5
down 7
forward 4
down 1
forward 5
up 9
up 3
down 4
forward 9
forward 6
forward 1
up 5
down 5
forward 1
forward 6
down 4
up 7
forward 5
down 5
forward 1
forward 5
down 4
forward 6
down 6
down 5
down 5
forward 4
down 5
forward 2
down 9
down 6
down 5
forward 5
down 9
down 7
up 8
down 3
forward 6
down 4
forward 8
forward 9
down 1
up 3
forward 4
up 3
forward 7
down 5
up 8
forward 1
up 1
down 2
forward 1
up 9
down 4
forward 1
up 3
down 9
up 8
down 2
up 4
forward 2
forward 8
up 8
forward 9
forward 2
down 4
forward 8
down 4
forward 9
down 1
up 8
forward 6
down 4
down 8
forward 1
forward 1
forward 5
forward 9
up 4
down 7
forward 4
down 5
forward 1
down 4
up 8
up 4
forward 2
forward 9
down 8
down 3
down 2
up 3
down 1
down 8
forward 5
down 6
down 5
forward 8
down 8
down 1
forward 1
forward 3
forward 7
forward 1
up 2
up 3
forward 9
down 2
forward 5
down 8
forward 7
forward 3
up 5
forward 1
forward 1
up 8
down 1
down 2
down 7
down 1
down 9
forward 7
down 8
down 4
up 8
forward 1
down 6
forward 9
forward 7
up 2
forward 3
forward 2
up 3
up 6
up 1
down 1
up 9
forward 8
forward 6
down 6
up 8
down 8
forward 5
forward 7
down 7
forward 3
forward 9
down 8
down 8
forward 2
up 7
down 4
down 7
up 6
down 3
forward 1
forward 8
down 5
down 6
up 5
forward 8
forward 6
up 8
forward 8
up 3
up 6
up 3
forward 1
"""

puzzle_input =
  input
  |> String.split("\n", trim: true)
  |> Enum.map(fn e -> String.split(e, " ") end)
  |> Enum.map(fn [cmd, val] -> {String.to_atom(cmd), String.to_integer(val)} end)
{final_h, final_d} = Part1.move(puzzle_input, 0, 0)

IO.inspect({final_h, final_d})

final_h * final_d

Part 2

Ok, so it turns out commands should be interpreted differently, let’s create a new recursive solution.

defmodule Part2 do
  def move([{:forward, v} | []], h, d, a), do: {h + v, d + a * v}
  def move([_, []], h, d, _), do: {h, d}

  def move([{:forward, v} | cmds], h, d, a), do: move(cmds, h + v, d + a * v, a)
  def move([{:down, v} | cmds], h, d, a), do: move(cmds, h, d, a + v)
  def move([{:up, v} | cmds], h, d, a), do: move(cmds, h, d, a - v)
end

{final_h, final_d} = Part2.move(sample_input, 0, 0, 0)

final_h * final_d

This checks with the example. So let’s move on to our puzzle input.

{final_h, final_d} = Part2.move(puzzle_input, 0, 0, 0)

final_h * final_d