Powered by AppSignal & Oban Pro

Advent of Code 2015 - Day 3

2015/day03.livemd

Advent of Code 2015 - Day 3

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
:ok
input = Kino.Input.textarea("Please enter the input:")

Part 1

input
|> Kino.Input.read()
|> String.to_charlist()
|> Enum.reduce({{0, 0}, %{}}, fn direction, {{x, y}, houses} ->
  {x, y} =
    case direction do
      ?v -> {x, y - 1}
      ?^ -> {x, y + 1}
      ?< -> {x - 1, y}
      ?> -> {x + 1, y}
    end

  houses = Map.update(houses, {x, y}, 1, &amp;(&amp;1 + 1))
  {{x, y}, houses}
end)
|> then(fn {_pos, houses} -> houses end)
|> Enum.count()
2572

Part 2

input
|> Kino.Input.read()
|> String.to_charlist()
|> Enum.reduce(
  {%{santa: {0, 0}, robo_santa: {0, 0}}, :santa, %{{0, 0} => 2}},
  fn direction, {positions, whose_turn, houses} ->
    {x, y} = Map.get(positions, whose_turn)

    position =
      case direction do
        ?v -> {x, y - 1}
        ?^ -> {x, y + 1}
        ?< -> {x - 1, y}
        ?> -> {x + 1, y}
      end

    houses = Map.update(houses, position, 1, &amp;(&amp;1 + 1))
    positions = Map.put(positions, whose_turn, position)

    whose_turn =
      case whose_turn do
        :santa -> :robo_santa
        :robo_santa -> :santa
      end

    {positions, whose_turn, houses}
  end
)
|> then(fn {_positions, _whose_turn, houses} -> houses end)
|> Enum.count()
2631