aoc2021-d2
Part 1
defmodule Part1 do
def solve(input_str) do
input_str
|> parse()
|> calculate({0, 0})
end
defp parse(input_str),
do:
String.split(input_str, "\n", trim: true)
|> Enum.map(
&(String.split(&1, " ", trim: true)
|> then(fn [s, v] -> {s, String.to_integer(v)} end))
)
def calculate(actions, position)
def calculate([], {h, d}), do: h * d
def calculate([action | rest], position) do
calculate(rest, move(action, position))
end
def move({"forward", v}, {h, d}), do: {h + v, d}
def move({"down", v}, {h, d}), do: {h, d + v}
def move({"up", v}, {h, d}), do: {h, d - v}
end
defmodule Part2 do
def solve(input_str) do
input_str
|> parse()
|> calculate({0, 0, 0})
end
defp parse(input_str),
do:
String.split(input_str, "\n", trim: true)
|> Enum.map(
&(String.split(&1, " ", trim: true)
|> then(fn [s, v] -> {s, String.to_integer(v)} end))
)
def calculate(actions, position)
def calculate([], {h, d, _aim}), do: h * d
def calculate([action | rest], position) do
calculate(rest, move(action, position))
end
def move({"forward", v}, {h, d, aim}), do: {h + v, d + aim * v, aim}
def move({"down", v}, {h, d, aim}), do: {h, d, aim + v}
def move({"up", v}, {h, d, aim}), do: {h, d, aim - v}
end
input_str = """
forward 2
down 7
down 8
forward 9
down 8
forward 9
forward 8
down 3
forward 8
forward 5
up 2
down 9
down 4
forward 4
forward 3
down 8
down 9
forward 5
down 1
up 1
forward 4
up 5
forward 2
down 6
forward 9
forward 3
forward 7
down 6
down 1
forward 8
down 3
forward 1
up 6
down 1
down 2
forward 9
down 7
down 1
down 7
down 7
up 5
down 8
forward 6
up 8
up 2
forward 6
up 1
down 9
forward 8
forward 4
up 3
forward 7
down 2
down 8
forward 5
down 9
up 4
forward 7
forward 5
down 5
down 5
forward 3
forward 2
down 2
up 4
up 7
down 8
up 8
forward 1
up 4
forward 4
down 2
forward 5
forward 7
down 4
forward 8
down 2
forward 5
forward 9
forward 6
forward 5
down 5
forward 4
forward 3
down 7
down 8
forward 9
forward 7
down 3
down 6
forward 4
down 7
up 9
down 8
up 7
up 3
forward 6
forward 9
down 2
down 3
down 1
down 3
forward 8
forward 3
forward 9
down 5
up 1
up 2
down 9
up 9
down 5
down 9
forward 1
down 3
down 5
down 1
forward 7
down 6
forward 7
forward 4
up 2
up 1
forward 9
down 2
down 6
down 5
down 6
forward 8
down 5
forward 1
forward 2
down 7
down 5
down 7
up 9
down 9
up 4
down 7
up 8
down 9
forward 3
down 6
down 2
forward 9
down 4
up 7
forward 3
down 5
forward 8
forward 9
down 2
up 5
forward 2
forward 9
up 5
down 2
forward 8
forward 6
down 7
down 3
forward 4
forward 3
forward 9
up 4
up 4
forward 7
up 3
forward 6
down 7
up 8
forward 2
up 1
down 6
forward 4
up 6
up 6
up 3
forward 4
forward 2
forward 5
forward 8
down 9
down 4
down 3
down 1
down 6
down 4
down 5
down 7
down 5
up 4
forward 3
down 4
down 7
down 7
down 2
forward 2
forward 9
up 6
down 3
up 9
forward 8
down 9
up 2
up 2
up 2
up 1
down 6
forward 9
forward 2
forward 2
forward 2
forward 5
up 3
down 7
down 6
down 8
up 3
up 9
down 3
forward 1
forward 7
down 7
down 1
forward 3
down 7
down 9
down 7
down 3
up 2
down 6
up 6
down 1
up 2
forward 7
up 2
down 7
up 2
down 9
down 3
forward 6
down 5
down 1
forward 5
down 2
down 6
down 1
down 3
down 3
down 5
forward 2
forward 4
forward 8
forward 6
forward 4
forward 9
up 8
down 5
forward 1
down 1
forward 1
forward 6
up 1
down 6
down 3
forward 9
forward 5
forward 4
up 3
up 7
down 2
up 4
up 2
down 1
forward 6
forward 9
forward 4
forward 2
down 8
forward 4
forward 3
up 5
down 4
forward 3
down 8
down 5
down 5
forward 1
forward 6
forward 4
forward 5
forward 9
forward 5
down 4
forward 3
forward 8
down 8
down 1
up 4
down 4
up 7
forward 2
forward 6
down 3
down 5
down 5
down 8
up 3
down 2
forward 4
forward 2
forward 4
forward 9
up 2
down 7
up 7
down 2
forward 4
up 7
forward 4
down 2
forward 7
up 2
down 3
forward 5
down 7
down 2
up 2
up 1
up 7
up 9
down 3
forward 1
forward 3
down 2
down 3
forward 6
down 7
forward 9
down 9
forward 3
forward 2
down 1
up 9
down 4
forward 4
up 4
forward 7
up 3
down 4
down 9
down 3
forward 7
down 6
down 7
down 6
up 5
forward 3
forward 9
up 2
up 4
up 9
down 2
forward 5
up 1
down 7
down 5
up 2
forward 8
down 8
up 3
forward 4
down 9
forward 6
down 9
down 5
forward 6
down 8
up 6
down 3
forward 6
forward 3
down 3
down 5
down 7
down 1
down 5
down 7
down 5
forward 3
down 2
forward 4
up 4
up 1
up 7
forward 1
forward 5
down 4
down 8
down 3
forward 4
down 3
up 7
down 6
forward 9
up 8
forward 2
forward 5
down 6
up 4
forward 8
forward 5
down 6
forward 2
down 7
forward 3
forward 1
forward 6
down 9
up 6
down 4
down 2
up 8
forward 4
down 8
forward 8
up 9
forward 7
down 6
up 9
down 4
up 6
down 4
down 3
up 7
up 4
forward 5
up 9
down 9
up 6
down 3
forward 8
down 9
forward 7
up 3
up 9
forward 8
down 3
forward 3
forward 5
down 6
forward 3
down 4
up 6
forward 3
forward 7
down 1
down 6
down 4
forward 6
up 6
down 5
down 6
down 4
up 2
down 7
down 9
down 2
down 6
forward 3
forward 4
down 5
up 5
down 5
forward 3
forward 6
down 4
down 7
up 2
forward 7
down 7
up 6
up 3
forward 9
forward 8
up 6
forward 2
down 2
forward 8
forward 4
up 6
forward 6
down 8
up 3
up 5
forward 6
up 8
down 1
down 4
up 9
forward 6
up 5
down 6
down 8
down 9
forward 5
up 3
down 7
forward 3
forward 6
down 3
down 1
down 9
up 9
down 4
down 7
forward 2
forward 4
down 7
forward 7
up 5
down 9
up 7
down 4
forward 6
down 5
forward 4
up 8
down 4
down 7
forward 3
down 6
down 1
forward 3
down 4
up 6
up 5
up 7
forward 5
down 4
forward 7
up 1
down 4
forward 4
down 2
down 6
forward 1
up 3
up 8
forward 6
forward 6
down 5
forward 7
down 6
down 8
forward 6
down 6
forward 3
forward 5
down 9
down 5
up 4
down 5
down 1
forward 1
forward 5
down 2
forward 5
forward 2
forward 5
up 3
forward 5
up 8
forward 9
forward 3
down 2
up 2
forward 7
down 5
up 1
down 3
down 7
up 2
forward 8
forward 6
forward 1
forward 6
forward 6
down 5
forward 4
down 5
forward 9
forward 7
down 7
down 7
down 9
forward 4
down 4
forward 3
down 6
forward 5
down 9
forward 6
up 7
down 3
up 4
up 4
down 1
down 2
up 5
forward 6
forward 2
down 7
up 6
up 3
down 8
forward 1
down 3
up 9
down 2
forward 6
forward 1
forward 4
up 1
down 8
down 2
down 9
down 5
forward 3
down 1
down 6
down 5
down 3
forward 1
forward 9
up 2
down 3
down 3
down 9
down 7
forward 6
forward 8
forward 4
up 7
down 2
forward 3
forward 1
up 4
forward 8
up 9
forward 8
forward 2
down 5
forward 2
down 6
down 6
down 4
forward 8
down 6
forward 2
forward 8
down 7
down 6
forward 2
down 1
down 8
forward 2
forward 9
up 6
forward 6
down 3
down 2
up 5
up 6
down 6
up 7
forward 5
forward 7
down 1
forward 7
forward 9
down 3
forward 4
forward 5
down 1
up 3
forward 2
up 5
forward 2
forward 1
down 5
down 4
down 8
up 8
forward 3
down 3
forward 4
down 6
up 8
down 5
up 2
down 1
up 3
forward 8
up 6
forward 9
up 9
down 5
forward 2
forward 9
up 6
forward 1
down 2
forward 4
forward 4
forward 1
forward 5
forward 1
forward 4
down 5
down 1
down 2
down 2
forward 7
down 7
down 7
down 4
down 7
down 4
down 3
up 7
up 1
forward 2
forward 3
down 4
down 5
forward 9
up 7
forward 6
down 1
forward 6
forward 6
forward 8
down 3
forward 2
down 6
forward 9
up 6
up 6
forward 7
down 5
down 6
up 3
down 5
up 4
forward 3
down 7
forward 9
up 1
down 1
up 6
down 3
up 2
down 5
forward 3
forward 6
down 9
down 4
forward 7
down 1
up 1
forward 3
forward 5
up 7
down 3
up 9
up 9
down 4
up 4
forward 8
up 9
down 8
forward 6
forward 4
forward 9
forward 8
down 2
forward 3
forward 2
down 3
up 1
forward 6
down 3
down 7
down 3
down 5
down 9
up 9
forward 8
forward 6
down 8
forward 3
down 4
down 2
down 9
forward 4
forward 2
up 4
forward 1
up 8
up 1
down 4
up 2
down 1
up 7
down 2
down 4
up 4
forward 2
down 3
forward 2
forward 3
down 5
forward 9
forward 7
down 1
up 3
down 3
forward 3
down 6
forward 5
up 3
up 3
up 1
forward 7
forward 1
forward 2
forward 2
down 4
up 7
forward 1
forward 1
forward 6
down 8
up 8
down 8
down 4
down 6
forward 8
forward 4
forward 5
down 2
down 3
forward 7
down 6
forward 4
forward 1
up 7
up 5
up 2
forward 1
forward 8
forward 2
up 9
forward 4
forward 5
down 2
forward 5
forward 7
down 3
forward 1
down 3
up 5
up 2
up 2
up 2
forward 4
forward 4
forward 8
forward 2
down 3
up 7
down 4
down 2
down 7
forward 2
down 2
forward 7
up 9
up 7
forward 7
forward 7
down 3
down 4
up 4
down 2
down 8
forward 4
down 1
up 6
forward 4
down 2
up 8
down 1
down 8
down 6
up 9
forward 4
up 1
down 2
down 9
down 7
down 4
down 8
down 8
up 1
down 5
up 5
down 7
up 7
forward 5
down 3
forward 7
up 5
down 3
forward 9
up 5
down 7
forward 8
forward 8
down 2
forward 7
forward 8
down 4
up 7
down 2
up 7
forward 5
down 1
down 3
forward 9
up 4
forward 6
forward 4
down 5
down 7
forward 2
forward 4
down 2
forward 1
down 5
up 2
down 8
down 1
down 4
down 8
down 6
forward 9
forward 2
forward 6
forward 4
down 1
forward 8
up 4
forward 6
down 4
forward 4
forward 3
forward 6
forward 9
forward 8
down 1
forward 5
down 8
forward 7
up 1
down 3
up 6
forward 5
forward 8
forward 8
forward 5
forward 5
forward 1
up 9
forward 7
up 3
down 2
down 4
forward 6
up 2
forward 5
up 8
forward 8
forward 2
forward 6
forward 3
up 4
forward 3
forward 6
"""
Part1.solve(input_str)
Part2.solve(input_str)