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

Day 9

2022/day09.livemd

Day 9

input = """
U 1
R 2
D 1
L 1
U 2
D 1
U 2
L 1
D 1
U 2
R 1
U 1
D 1
R 1
L 2
D 1
U 1
D 1
U 2
D 2
R 2
D 1
R 2
D 2
R 1
L 2
U 2
D 2
R 2
D 1
R 1
L 1
D 2
U 2
L 2
U 2
R 1
L 1
D 1
R 1
D 2
U 1
L 2
R 1
U 1
D 1
U 1
D 2
R 1
L 1
U 1
L 1
R 2
U 1
R 2
L 2
U 1
R 1
L 2
R 2
L 2
U 1
D 1
U 2
R 1
D 1
L 2
D 1
L 1
U 1
R 2
U 1
D 1
L 2
R 2
D 2
R 2
D 1
L 2
D 1
R 2
L 1
D 2
R 2
D 1
U 1
L 1
R 2
L 2
D 1
R 1
L 1
U 1
L 1
R 1
U 2
R 1
D 2
R 1
L 2
R 1
L 1
D 2
R 2
L 1
U 1
D 1
L 2
D 1
L 1
R 1
U 1
R 3
U 2
L 2
R 1
L 1
D 1
R 1
U 2
D 3
L 1
R 1
U 2
R 1
U 1
R 3
L 3
U 2
D 1
L 1
R 1
U 3
D 1
L 3
D 2
U 3
R 3
D 1
L 3
D 1
U 1
R 3
L 2
U 1
R 3
U 3
L 3
D 1
R 2
U 3
R 2
L 1
U 3
L 3
R 3
D 2
U 1
L 1
D 1
U 3
D 1
U 2
R 1
L 2
R 2
L 2
D 3
R 2
D 2
U 1
L 2
R 2
L 1
U 3
D 3
R 1
L 1
D 3
L 2
U 2
R 3
L 1
D 2
L 1
R 2
L 2
U 2
D 3
R 2
U 3
D 1
L 2
D 3
U 1
R 3
U 1
R 2
U 2
D 1
L 1
D 3
L 2
U 1
R 1
L 1
U 2
D 3
U 3
R 3
U 1
R 1
D 2
R 1
L 2
D 2
U 1
R 3
D 2
U 2
L 2
R 3
D 2
U 1
R 1
L 3
R 1
U 1
R 4
L 2
R 3
D 3
L 3
D 3
R 3
L 2
R 4
D 1
R 2
U 3
D 4
U 2
R 4
U 2
R 3
L 2
D 1
U 3
D 1
L 4
U 4
D 4
R 2
U 1
L 2
R 2
L 4
R 3
U 4
D 3
R 2
L 2
R 2
D 2
U 1
R 2
U 3
R 4
D 1
L 4
U 2
R 3
U 3
R 4
L 1
D 3
R 3
D 4
R 2
L 3
R 1
D 4
R 2
L 2
U 3
R 3
U 2
R 3
U 4
R 1
L 1
D 4
U 4
D 3
L 1
D 3
L 2
U 2
R 2
D 3
R 2
U 1
R 4
D 3
L 2
D 1
L 4
D 1
R 4
D 4
R 1
U 3
L 2
U 1
R 3
U 2
L 3
D 1
U 4
L 2
D 1
L 2
R 3
U 4
R 1
U 1
L 3
U 4
D 3
L 2
D 1
L 3
R 2
D 4
L 1
D 5
U 4
D 2
R 1
D 3
L 3
R 1
D 5
U 3
D 5
L 2
D 1
L 3
R 5
U 4
L 3
D 4
U 5
D 5
L 2
U 5
L 2
R 3
L 1
U 2
D 4
R 3
D 4
U 5
D 3
U 4
L 4
R 1
L 5
U 5
R 2
U 4
R 3
D 1
U 1
R 2
U 4
R 2
D 2
U 1
R 1
L 2
D 1
U 5
L 4
R 2
D 1
U 1
D 2
U 2
D 5
L 2
R 5
U 5
L 5
D 2
L 1
U 3
D 1
R 3
D 2
L 3
R 3
D 3
R 2
L 1
D 1
U 2
R 2
L 2
R 5
U 4
D 3
L 4
U 4
D 1
U 4
D 2
U 5
L 4
R 5
D 4
R 2
D 2
R 5
D 4
U 1
D 3
U 5
R 3
D 2
R 5
L 1
U 5
R 5
U 1
R 3
U 3
R 4
U 1
L 4
R 1
U 3
L 2
U 6
D 4
U 3
D 1
R 2
L 6
U 3
D 4
U 1
L 6
U 1
R 1
U 6
D 5
U 5
R 4
U 1
L 4
D 1
U 5
R 3
L 2
U 3
L 6
R 5
U 4
R 5
D 1
L 6
U 3
L 5
U 2
L 5
R 2
U 6
R 6
D 1
R 1
U 3
R 6
U 5
L 4
U 2
R 5
L 2
U 1
D 1
U 5
R 2
U 2
L 4
R 2
D 1
L 4
U 1
L 6
R 6
U 2
D 5
U 5
D 4
L 1
R 3
L 5
U 6
R 4
D 1
U 2
R 1
D 3
R 1
L 5
D 3
R 3
U 5
L 6
R 3
U 5
L 2
U 3
R 3
D 3
U 1
L 2
U 2
L 3
D 6
L 3
D 4
R 4
D 4
U 6
L 6
D 2
R 1
U 3
L 6
R 4
D 1
L 2
U 4
L 6
U 1
L 4
D 1
L 3
R 2
L 1
R 2
L 3
R 1
U 7
D 7
L 7
U 1
R 2
U 6
R 4
L 6
U 3
R 4
U 7
D 5
R 6
U 6
L 6
R 4
D 1
U 3
R 5
L 2
D 2
U 5
L 1
D 3
R 5
L 2
U 4
D 1
R 5
U 2
R 4
L 3
R 4
L 2
D 2
L 4
D 1
U 4
D 4
R 4
L 5
R 2
D 2
L 2
D 1
L 2
D 1
L 4
D 5
R 7
U 7
L 2
D 3
L 4
R 7
D 7
U 2
D 7
L 6
D 3
U 5
R 5
D 3
U 7
D 3
L 5
D 3
R 4
D 4
L 7
D 6
U 2
L 3
R 6
U 5
R 7
U 3
L 1
R 7
U 2
R 4
L 7
U 2
D 4
U 5
D 6
U 4
D 6
U 7
R 1
L 4
R 3
L 6
U 4
R 7
L 6
U 7
D 1
U 7
D 4
L 1
D 3
R 6
U 3
R 5
L 4
R 4
L 4
U 7
R 3
L 4
D 7
R 6
U 2
L 3
U 8
D 3
U 4
D 1
R 4
U 5
R 2
U 4
D 8
L 2
D 8
R 4
L 1
R 7
L 6
U 4
L 4
D 7
L 3
D 2
U 8
R 8
U 6
R 7
D 3
U 7
R 1
L 8
D 2
L 3
R 5
D 3
U 3
R 8
L 1
R 6
L 8
U 2
D 4
R 6
L 6
D 5
U 4
L 6
U 1
L 6
U 3
D 5
U 5
L 6
D 8
R 5
D 4
R 6
U 7
L 1
D 2
R 2
L 7
R 4
D 7
L 3
U 6
R 7
D 3
L 3
D 2
U 1
R 3
L 8
U 8
D 5
L 6
R 3
L 6
D 3
R 4
U 3
L 8
D 7
L 6
R 5
D 6
R 6
D 3
L 4
R 1
D 6
U 3
R 1
D 5
U 4
L 1
R 2
U 6
D 6
R 7
L 1
R 6
U 7
D 8
R 2
U 3
L 6
U 2
D 6
U 8
L 3
U 4
D 6
R 6
L 5
U 9
R 8
L 2
D 6
R 3
L 4
D 2
L 7
D 5
L 7
U 8
D 6
L 9
D 3
L 5
U 3
L 8
D 7
R 8
U 2
L 9
U 7
D 7
U 6
D 5
R 2
D 8
R 9
U 4
R 1
L 3
D 7
R 2
L 6
U 1
L 7
D 8
U 9
R 9
D 1
U 9
D 1
R 1
D 6
R 7
D 1
L 1
R 6
U 3
R 7
U 2
R 5
U 6
R 2
L 7
R 8
D 9
U 5
L 9
R 9
U 2
L 7
R 4
U 3
R 6
L 6
D 7
L 4
R 7
D 5
L 5
D 7
U 8
R 8
L 8
R 5
D 5
U 2
R 1
U 5
R 6
L 8
U 9
R 4
D 9
R 4
D 3
U 8
R 8
U 9
L 6
D 9
R 6
U 5
R 1
U 1
L 9
U 8
L 1
U 5
L 1
D 7
R 6
U 1
D 3
R 2
D 3
R 8
D 2
U 4
R 8
L 9
D 2
U 2
R 4
D 10
L 4
U 3
D 6
R 4
U 8
L 8
U 3
L 10
D 7
U 2
L 6
R 2
U 8
L 10
U 7
D 8
L 7
U 10
R 4
U 1
L 1
D 4
U 10
D 9
U 4
L 10
R 4
D 5
U 8
D 1
R 5
D 10
L 8
D 1
U 2
L 7
U 1
L 6
D 2
R 3
L 3
U 5
R 9
U 10
D 5
U 7
L 3
R 5
U 7
L 4
U 1
D 2
U 8
L 8
U 7
R 9
L 1
D 10
R 8
L 4
U 4
L 10
R 2
L 3
D 7
L 10
R 6
U 5
D 4
U 6
R 10
D 8
U 3
L 1
R 1
D 2
R 1
U 1
R 5
U 9
R 6
U 10
L 2
U 5
L 7
R 8
U 10
D 6
L 3
U 2
L 4
R 6
L 5
D 9
U 3
D 3
R 10
L 10
D 4
R 7
D 7
U 3
L 5
R 5
L 9
R 2
U 8
R 10
U 10
L 4
U 1
D 2
U 5
L 11
R 3
L 10
U 7
D 6
U 11
D 11
U 2
L 7
D 11
U 8
L 5
U 7
L 10
D 7
L 2
U 5
D 4
R 9
L 10
D 1
U 6
R 2
L 7
U 1
R 4
D 11
U 2
R 9
U 11
R 6
U 9
L 9
D 3
R 6
L 4
R 1
L 5
R 2
U 3
R 1
U 7
D 1
R 11
L 2
D 7
L 10
U 1
R 8
L 6
U 7
D 11
R 1
U 11
L 8
D 6
R 6
D 10
U 2
D 1
L 6
R 9
L 8
U 10
R 4
U 4
R 9
D 3
R 8
D 11
L 4
U 8
D 6
R 1
U 5
L 8
U 6
R 9
U 1
R 8
D 6
R 4
D 7
R 7
L 1
D 6
L 3
D 9
L 10
D 5
U 10
L 11
D 5
U 9
R 10
L 11
R 1
U 6
L 4
U 7
R 9
L 10
D 9
R 5
L 2
D 1
U 12
L 7
D 9
U 8
R 12
L 11
D 12
L 4
D 10
U 7
L 5
U 6
L 5
R 3
L 9
U 7
L 8
U 10
L 8
R 1
U 3
D 6
L 12
U 6
D 7
L 7
U 2
D 8
U 10
L 12
R 5
L 7
R 11
D 5
L 2
R 10
L 7
U 9
D 6
R 3
U 9
L 1
U 2
D 9
U 1
D 2
L 11
R 4
D 4
L 6
R 10
L 6
U 10
L 2
D 3
R 12
L 5
R 5
L 9
D 6
R 12
U 6
R 6
D 6
R 3
L 12
D 12
L 10
R 7
U 7
L 8
R 6
L 5
D 3
L 5
U 12
L 6
U 10
D 11
U 11
D 1
U 9
R 8
L 8
U 5
R 3
L 4
R 6
U 10
L 1
D 1
R 7
D 8
L 1
D 6
R 3
U 2
D 4
L 10
D 9
L 12
U 6
D 9
U 8
D 8
L 8
U 1
D 6
U 6
D 4
R 9
L 5
U 6
R 7
U 6
D 3
U 6
D 10
U 1
L 13
D 4
U 6
L 10
R 6
D 7
U 9
R 2
L 5
D 4
U 10
D 7
L 12
D 2
R 1
D 4
R 1
U 6
L 9
D 12
U 8
L 6
U 4
R 2
L 1
D 12
U 12
L 1
D 7
L 3
R 10
L 10
U 2
D 8
R 5
U 2
L 5
R 8
L 5
D 9
L 11
U 1
D 6
R 11
D 11
L 6
R 13
L 8
U 7
R 11
L 9
D 5
L 2
U 1
D 13
R 3
D 2
R 9
U 3
R 8
D 10
U 5
D 3
L 2
D 9
R 10
D 4
U 13
D 10
U 2
R 8
D 9
R 13
U 4
D 3
L 6
U 8
L 3
R 3
D 4
U 6
L 7
R 3
L 1
D 1
R 5
U 8
D 8
U 11
R 5
U 2
R 10
L 3
D 4
U 1
R 9
L 7
R 6
L 13
U 8
L 8
D 5
R 10
L 9
U 7
L 9
U 9
L 7
R 5
L 5
U 7
D 12
U 7
D 6
R 14
D 5
L 11
R 6
L 4
U 8
R 9
U 7
R 12
L 10
U 10
L 11
R 7
D 11
R 7
L 4
D 9
L 13
R 6
L 13
D 2
R 13
D 12
R 4
U 11
R 4
D 3
R 3
L 12
R 3
D 11
R 7
D 7
R 3
U 4
R 12
D 14
R 3
L 10
U 9
L 2
U 14
L 2
D 7
U 10
D 4
U 6
L 1
D 11
R 10
D 1
L 2
U 9
L 6
R 12
D 11
R 8
U 7
D 2
U 4
D 12
L 1
U 8
D 14
R 2
D 13
R 10
D 10
R 14
L 4
D 14
L 6
R 13
L 12
U 4
R 13
L 12
D 14
L 1
U 1
L 4
D 14
R 12
D 6
U 11
L 12
U 2
R 8
D 14
U 13
D 6
L 7
D 4
U 3
L 8
U 2
D 12
L 13
U 8
R 4
D 10
L 10
U 5
D 3
L 10
D 13
R 15
U 9
L 10
D 1
U 11
D 7
U 3
R 6
L 11
D 4
R 8
D 3
U 7
D 6
L 11
D 14
R 15
L 14
D 2
L 11
R 13
U 4
D 13
L 6
D 4
L 15
D 5
L 6
U 8
R 13
L 5
U 4
R 9
L 13
D 3
U 11
R 6
L 14
R 9
U 5
D 5
U 9
D 12
R 11
U 8
D 1
R 2
U 6
R 11
L 4
R 7
D 6
U 6
D 1
L 4
R 14
D 11
R 3
U 9
D 15
L 14
D 9
R 4
U 14
R 3
L 14
D 15
L 12
R 5
D 6
U 15
D 13
U 10
R 4
D 3
R 11
U 11
R 4
L 1
D 11
U 14
D 1
U 14
R 1
L 14
D 4
U 12
D 9
L 13
U 10
D 14
L 4
U 15
L 12
U 3
D 6
U 1
D 2
R 13
L 12
U 2
L 12
D 7
L 3
U 15
L 5
R 9
L 12
U 1
L 16
D 4
L 5
U 16
R 6
D 4
U 6
R 3
L 1
D 7
L 4
D 1
U 5
D 1
L 6
R 2
L 8
R 3
L 12
D 15
R 9
L 5
U 12
L 5
U 9
R 14
D 16
R 13
L 12
U 3
L 16
D 3
R 6
U 2
R 4
D 2
L 6
D 15
L 11
D 6
U 9
D 13
U 7
L 10
D 12
L 4
R 9
U 5
R 9
U 16
R 15
D 10
R 14
L 8
U 8
D 8
R 13
U 6
R 5
D 9
L 11
R 1
D 4
L 3
D 1
U 11
R 2
L 7
R 14
D 5
R 16
U 11
L 2
D 1
U 4
R 15
L 13
R 3
U 1
R 1
U 3
R 16
D 1
L 4
R 9
L 3
D 14
R 15
D 13
U 13
D 5
U 8
L 3
U 6
D 10
U 6
D 2
U 13
R 5
L 16
R 16
U 12
R 10
D 13
L 1
D 13
R 15
D 7
R 7
U 16
R 10
U 7
L 14
D 4
L 6
U 9
L 15
R 6
L 14
D 5
R 6
D 5
L 6
R 1
U 13
L 15
R 14
L 12
D 2
L 1
U 1
R 13
L 11
R 15
D 17
L 13
R 8
D 14
R 2
D 1
R 3
U 8
R 8
L 14
D 6
U 3
D 9
R 12
L 13
U 2
D 8
U 15
D 16
L 5
D 7
U 15
R 7
L 5
R 13
D 4
L 7
R 1
D 7
L 11
R 2
U 17
L 6
U 15
D 5
R 17
D 12
U 17
L 3
R 15
U 7
L 2
R 5
D 17
L 12
U 10
D 5
L 16
R 17
D 2
R 15
D 4
U 1
D 5
U 10
L 8
U 16
D 2
L 11
R 7
U 15
L 15
D 2
L 8
R 3
U 8
R 7
U 6
L 17
U 8
R 6
L 13
R 6
D 13
L 9
U 2
R 7
D 14
L 10
U 8
D 10
U 4
R 3
L 1
D 5
U 18
L 1
U 9
D 4
R 3
D 11
R 9
U 18
D 12
R 13
L 8
D 6
U 13
R 6
U 15
R 14
U 11
R 11
D 15
L 7
R 11
D 16
U 14
R 15
D 16
R 3
D 10
R 6
U 17
L 9
R 1
D 12
R 18
U 11
L 2
R 5
L 10
U 13
L 3
D 15
U 14
D 13
R 5
U 15
L 9
U 6
D 16
L 1
U 1
D 12
R 18
L 13
R 10
U 14
L 13
U 3
L 2
R 11
U 18
D 14
R 4
L 6
R 10
U 18
L 18
R 9
L 11
U 4
D 5
L 15
R 13
L 18
U 16
L 1
R 12
U 17
D 11
U 1
L 13
U 7
D 3
U 5
R 8
D 4
L 7
D 17
U 9
R 1
L 18
U 13
L 7
U 12
D 2
R 18
D 12
U 11
R 13
U 12
L 13
R 7
U 6
D 5
L 13
D 15
R 12
D 8
L 19
U 10
L 4
D 18
U 9
D 5
U 2
L 1
D 2
R 8
U 9
R 1
D 11
U 18
R 11
D 19
U 6
D 14
U 6
D 4
U 2
L 12
D 15
L 10
R 5
U 16
L 3
D 8
L 10
D 7
R 16
D 8
R 6
L 16
R 6
D 8
U 15
D 1
L 14
U 14
R 16
L 14
D 2
R 6
D 5
R 14
L 15
D 2
R 15
L 4
U 18
R 8
D 6
R 7
L 2
U 5
L 19
R 17
L 19
R 13
L 2
U 7
D 19
R 9
L 8
D 18
U 2
R 3
U 7
D 9
R 12
U 13
L 15
U 2
D 6
R 18
D 7
L 10
R 4
L 12
D 6
L 4
D 10
L 7
U 12
L 9
R 12
L 13
R 13
L 18
R 18
U 7
D 5
R 8
D 18
L 11
D 5
L 1
U 6
R 19
U 17
R 16
L 8
R 11
U 17
D 1
R 11
L 12
D 4
U 13
"""

Part 1

moves =
  input
  |> String.split("\n", trim: true)
  |> Enum.map(fn line ->
    [dir, amount] = String.split(line, " ")

    {dir, String.to_integer(amount)}
  end)

do_move = fn
  {x, y}, "U" -> {x, y - 1}
  {x, y}, "D" -> {x, y + 1}
  {x, y}, "L" -> {x - 1, y}
  {x, y}, "R" -> {x + 1, y}
end

do_follow = fn
  {tx, ty}, {hx, hy} when abs(hx - tx) <= 1 and abs(hy - ty) <= 1 ->
    {tx, ty}

  {tx, y}, {hx, y} ->
    if tx > hx do
      {tx - 1, y}
    else
      {tx + 1, y}
    end

  {x, ty}, {x, hy} ->
    if ty > hy do
      {x, ty - 1}
    else
      {x, ty + 1}
    end

  {tx, ty}, {hx, hy} when hx > tx and hy > ty ->
    {tx + 1, ty + 1}

  {tx, ty}, {hx, hy} when hx < tx and hy > ty ->
    {tx - 1, ty + 1}

  {tx, ty}, {hx, hy} when hx > tx and hy < ty ->
    {tx + 1, ty - 1}

  {tx, ty}, {hx, hy} when hx < tx and hy < ty ->
    {tx - 1, ty - 1}
end

head_position = {0, 0}
tail_position = {0, 0}
tail_position_list = MapSet.new([tail_position])

moves
|> Enum.reduce(
  {head_position, tail_position, tail_position_list},
  fn {dir, count}, acc ->
    for _ <- 1..count//1, reduce: acc do
      {head_loc, tail_loc, tail_set} ->
        new_head_loc = do_move.(head_loc, dir)
        new_tail_loc = do_follow.(tail_loc, new_head_loc)
        tail_set = MapSet.put(tail_set, new_tail_loc)

        {new_head_loc, new_tail_loc, tail_set}
    end
  end
)
|> elem(2)
|> MapSet.size()

Part 2

starting_positions = List.duplicate({0, 0}, 10)
tail_position_list = MapSet.new([List.last(starting_positions)])

moves
|> Enum.reduce(
  {starting_positions, tail_position_list},
  fn {dir, count}, acc ->
    for _ <- 1..count//1, reduce: acc do
      {[head | followers], tail_set} ->
        new_head = do_move.(head, dir)

        [new_tail | _] =
          new_list =
          Enum.reduce(followers, [new_head], fn follower, [followed | _] = done ->
            [do_follow.(follower, followed) | done]
          end)

        tail_set = MapSet.put(tail_set, new_tail)

        {Enum.reverse(new_list), tail_set}
    end
  end
)
|> elem(1)
|> MapSet.size()