···11+<!-- livebook:{"persist_outputs":true} -->
22+33+# Day 05
44+55+```elixir
66+Mix.install([
77+ {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
88+])
99+```
1010+1111+<!-- livebook:{"output":true} -->
1212+1313+```
1414+:ok
1515+```
1616+1717+## Setup
1818+1919+<!-- livebook:{"attrs":{"day":"5","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
2020+2121+```elixir
2222+{:ok, puzzle_input} =
2323+ KinoAOC.download_puzzle("2022", "5", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
2424+```
2525+2626+<!-- livebook:{"output":true} -->
2727+2828+```
2929+{:ok,
3030+ "[N] [C] [Q] \n[W] [J] [L] [J] [V]\n[F] [N] [D] [L] [S] [W]\n[R] [S] [F] [G] [R] [V] [Z]\n[Z] [G] [Q] [C] [W] [C] [F] [G]\n[S] [Q] [V] [P] [S] [F] [D] [R] [S]\n[M] [P] [R] [Z] [P] [D] [N] [N] [M]\n[D] [W] [W] [F] [T] [H] [Z] [W] [R]\n 1 2 3 4 5 6 7 8 9 \n\nmove 1 from 3 to 9\nmove 3 from 5 to 3\nmove 4 from 2 to 5\nmove 4 from 1 to 2\nmove 3 from 5 to 7\nmove 3 from 1 to 2\nmove 4 from 8 to 7\nmove 4 from 9 to 7\nmove 4 from 2 to 7\nmove 2 from 3 to 6\nmove 3 from 6 to 2\nmove 5 from 4 to 7\nmove 7 from 3 to 7\nmove 5 from 6 to 9\nmove 2 from 4 to 8\nmove 1 from 3 to 2\nmove 4 from 2 to 7\nmove 2 from 2 to 8\nmove 8 from 8 to 5\nmove 1 from 2 to 4\nmove 1 from 2 to 9\nmove 7 from 5 to 4\nmove 31 from 7 to 1\nmove 9 from 9 to 3\nmove 12 from 1 to 9\nmove 15 from 1 to 7\nmove 4 from 3 to 8\nmove 2 from 5 to 1\nmove 12 from 7 to 5\nmove 2 from 8 to 2\nmove 12 from 5 to 4\nmove 1 from 3 to 5\nmove 6 from 1 to 3\nmove 1 from 1 to 5\nmove 1 from 8 to 7\nmove 1 from 8 to 5\nmove 7 from 7 to 8\nmove 5 from 8 to 2\nmove 11 from 4 to 2\nmove 10 from 3 to 1\nmove 1 from 7 to 5\nmove 10 from 1 to 3\nmove 5 from 4 to 2\nmove 1 from 4 to 6\nmove 7 from 2 to 3\nmove 9 from 9 to 5\nmove 15 from 2 to 3\nmove 1 from 9 to 1\nmove 7 from 5 to 3\nmove 1 from 2 to 4\nmove 2 from 9 to 2\nmove 1 from 8 to 9\nmove 5 from 5 to 3\nmove 1 from 8 to 7\nmove 1 from 2 to 4\nmove 1 from 7 to 6\nmove 1 from 1 to 6\nmove 1 from 6 to 9\nmove 1 from 5 to 4\nmove 1 from 6 to 4\nmove 1 from 6 to 8\nmove 2 from 9 to 4\nmove 12 from 3 to 1\nmove 8 from 4 to 8\nmove 1 from 9 to 8\nmove 10 from 8 to 6\nmove 1 from 6 to 7\nmove 6 from 6 to 9\nmove 1 from 2 to 7\nmove 1 from 4 to 7\nmove 2 from 7 to 3\nmove 1 from 1 to 3\nmove 6 from 9 to 1\nmove 2 from 6 to 7\nmove 12 from 1 to 3\nmove 5 from 1 to 9\nmove 1 from 7 to 3\nmove 38 from 3 to 7\nmove 19 from 7 to 8\nmove 19 from 8 to 2\nmove 1 from 9 to 6\nmove 5 from 3 to 7\nmove 2 from 6 to 7\nmove 1 from 3 to 9\nmove 2 from 3 to 6\nmove 4 from 2 to 6\nmove 6 from 2 to 4\nmove 14 from 7 to 9\nmove 8 from 2 to 5\nmove 19 from 9 to 3\nmove 6 from 4 to 1\nmove 6 from 1 to 4\nmove 4 from 4 to 3\nmove 10 from 7 to 6\nmove 1 from 6 to 4\nmove 22 from 3 to 1\nmove 5 from 1 to 6\nmove 5 from 5 to 8\nmove 1 from 7 to 4\nmove 1 from 2 to 3\nmove 15 from 6 to 9\nmove 3 from 8 to 4\nmove 2 from 3 to 1\nmove 6 from 9 to 1\nmove 1 from 3 to 9\nmove 1 from 3 to 1\nmove 1 from 5 to 9\nmove 1 from 7 to 1\nmove 1 from 8 to 2\nmove 6 from 9 to 2\nmove 2 from 9 to 1\nmove 3 from 6 to 3\nmove 2 from 9 to 5\nmove 1 from 6 to 7\nmove 2 from 2 to 7\nmove 3 from 3 to 5\nmove 1 from 8 to 9\nmove 7 from 4 to 7\nmove 1 from 6 to 3\nmove 2 from 9 to 5\nmove 10 from 1 to 5\nmove 19 from 1 to 8\nmove 9 from 7 to 1\nmove 1 from 3 to 5\nmove 2 from 2 to 4\nmove 2 from 2 to 6\nmove 2 from 6 to 4\nmove 7 from 1 to 7\nmove 3 from 7 to 3\nmove 2 from 4 to 1\nmove 3 from 3 to 4\nmove 1 from 2 to 4\nmove 2 from 4 to 1\nmove 2 from 4 to 8\nmove 20 from 8 to 2\nmove 1 from 8 to 3\nmove 4 from 7 to 8\nmove 14 from 2 to 6\nmove 3 from 1 to 2\nmove 2 from 1 to 7\nmove 1 from 4 to 6\nmove 1 from 1 to 5\nmove 4 from 2 to 8\nmove 3 from 7 to 6\nmove 1 from 4 to 6\nmove 2 from 7 to 9\nmove 1 from 2 to 6\nmove 1 from 3 to 1\nmove 3 from 5 to 8\nmove 1 from 1 to 4\nmove 2 from 9 to 5\nmove 4 from 6 to 7\nmove 1 from 4 to 1\nmove 1 from 8 to 5\nmove 1 from 7 to 6\nmove 1 from 2 to 9\nmove 2 from 7 to 1\nmove 1 from 1 to 3\nmove 1 from 7 to 2\nmove 4 from 2 to 7\nmove 1 from 1 to 3\nmove 2 from 3 to 2\nmove 9 from 8 to 3\nmove 1 from 8 to 6\nmove 2 from 7 to 3\nmove 1 from 7 to 4\nmove 1 from 9 to 7\nmove 1 from 7 to 2\nmove 2 from 2 to 8\nmove 6 from 5 to 2\nmove 5 from 3 to 7\nmove 1 from 4 to 7\nmove 3 from 7 to 1\nmove 11 from 5 to 8\nmove 2 from 1 to 6\nmove 2 from 1 to 8\nmove 2 from 5 to 9\nmove 1 from 7 to 2\nmove 2 from 5 to 4\nmove 17 from 6 to 7\nmove 1 from 4 to 1\nmove 1 from 1 to 7\nmove 1 from 6 to 5\nmove 1 from 6 to 2\nmove 9 from 2 to 5\nmove 1 from 6 to 7\nmove 9 from 7 to 4\nmove 3 from 7 to 8\nmove 3 from 3 to 4\nmove 8 from 7 to 9\nmove 11 from 8 to 1\nmove 1 from 4 to 3\nmove 1 from 7 to 4\nmove 9 from 9 to 4\nmove 5 from 1 to 7\nmove 8 from 5 to 1\nmove 3 from 3 to 4\nm" <> ...}
3131+```
3232+3333+```elixir
3434+[crates, moves] = String.split(puzzle_input, "\n\n")
3535+3636+moves =
3737+ moves
3838+ |> String.split("\n", trim: true)
3939+ |> Enum.map(fn move ->
4040+ result = Regex.named_captures(~r/move (?<count>\d+) from (?<from>\d) to (?<to>\d)/, move)
4141+4242+ %{
4343+ count: String.to_integer(result["count"]),
4444+ from: String.to_integer(result["from"]),
4545+ to: String.to_integer(result["to"])
4646+ }
4747+ end)
4848+4949+crates =
5050+ crates
5151+ |> String.split("\n")
5252+ |> Enum.drop(-1)
5353+ |> Enum.map(fn line ->
5454+ line
5555+ |> String.to_charlist()
5656+ |> Enum.chunk_every(4)
5757+ |> Enum.map(fn
5858+ [?[, n, ?] | _] -> n
5959+ _ -> nil
6060+ end)
6161+ end)
6262+ |> Enum.zip()
6363+ |> Enum.map(&Tuple.to_list/1)
6464+ |> Enum.map(fn column -> Enum.drop_while(column, &is_nil/1) end)
6565+ |> Enum.with_index(1)
6666+ |> Map.new(fn {v, k} -> {k, v} end)
6767+```
6868+6969+<!-- livebook:{"output":true} -->
7070+7171+```
7272+%{
7373+ 1 => 'NWFRZSMD',
7474+ 2 => 'SGQPW',
7575+ 3 => 'CJNFQVRW',
7676+ 4 => 'LDGCPZF',
7777+ 5 => 'SPT',
7878+ 6 => 'LRWFDH',
7979+ 7 => 'CDNZ',
8080+ 8 => 'QJSVFRNW',
8181+ 9 => 'VWZGSMR'
8282+}
8383+```
8484+8585+```elixir
8686+defmodule Day05 do
8787+ def move(%{count: count, from: from, to: to}, columns, reverse? \\ true) do
8888+ {moved, columns} = Access.get_and_update(columns, from, &Enum.split(&1, count))
8989+9090+ moved = if reverse?, do: Enum.reverse(moved), else: moved
9191+9292+ Map.update!(columns, to, &(moved ++ &1))
9393+ end
9494+end
9595+```
9696+9797+<!-- livebook:{"output":true} -->
9898+9999+```
100100+{:module, Day05, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:move, 3}}
101101+```
102102+103103+## Task 1
104104+105105+```elixir
106106+moves
107107+|> Enum.reduce(crates, &Day05.move/2)
108108+|> Enum.sort()
109109+|> Enum.map(fn {_, v} -> hd(v) end)
110110+```
111111+112112+<!-- livebook:{"output":true} -->
113113+114114+```
115115+'FWNSHLDNZ'
116116+```
117117+118118+## Task 2
119119+120120+```elixir
121121+moves
122122+|> Enum.reduce(crates, &Day05.move(&1, &2, false))
123123+|> Enum.sort()
124124+|> Enum.map(fn {_, v} -> hd(v) end)
125125+```
126126+127127+<!-- livebook:{"output":true} -->
128128+129129+```
130130+'RNRGDNFQG'
131131+```