this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 05
4
5```elixir
6Mix.install([
7 {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"}
8])
9```
10
11<!-- livebook:{"output":true} -->
12
13```
14:ok
15```
16
17## Setup
18
19<!-- livebook:{"attrs":{"day":"5","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
20
21```elixir
22{:ok, puzzle_input} =
23 KinoAOC.download_puzzle("2022", "5", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
24```
25
26<!-- livebook:{"output":true} -->
27
28```
29{:ok,
30 "[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" <> ...}
31```
32
33```elixir
34[crates, moves] = String.split(puzzle_input, "\n\n")
35
36moves =
37 moves
38 |> String.split("\n", trim: true)
39 |> Enum.map(fn move ->
40 result = Regex.named_captures(~r/move (?<count>\d+) from (?<from>\d) to (?<to>\d)/, move)
41
42 %{
43 count: String.to_integer(result["count"]),
44 from: String.to_integer(result["from"]),
45 to: String.to_integer(result["to"])
46 }
47 end)
48
49crates =
50 crates
51 |> String.split("\n")
52 |> Enum.drop(-1)
53 |> Enum.map(fn line ->
54 line
55 |> String.to_charlist()
56 |> Enum.chunk_every(4)
57 |> Enum.map(fn
58 [?[, n, ?] | _] -> n
59 _ -> nil
60 end)
61 end)
62 |> Enum.zip()
63 |> Enum.map(&Tuple.to_list/1)
64 |> Enum.map(fn column -> Enum.drop_while(column, &is_nil/1) end)
65 |> Enum.with_index(1)
66 |> Map.new(fn {v, k} -> {k, v} end)
67```
68
69<!-- livebook:{"output":true} -->
70
71```
72%{
73 1 => 'NWFRZSMD',
74 2 => 'SGQPW',
75 3 => 'CJNFQVRW',
76 4 => 'LDGCPZF',
77 5 => 'SPT',
78 6 => 'LRWFDH',
79 7 => 'CDNZ',
80 8 => 'QJSVFRNW',
81 9 => 'VWZGSMR'
82}
83```
84
85```elixir
86defmodule Day05 do
87 def move(%{count: count, from: from, to: to}, columns, reverse? \\ true) do
88 {moved, columns} = Access.get_and_update(columns, from, &Enum.split(&1, count))
89
90 moved = if reverse?, do: Enum.reverse(moved), else: moved
91
92 Map.update!(columns, to, &(moved ++ &1))
93 end
94end
95```
96
97<!-- livebook:{"output":true} -->
98
99```
100{:module, Day05, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:move, 3}}
101```
102
103## Task 1
104
105```elixir
106moves
107|> Enum.reduce(crates, &Day05.move/2)
108|> Enum.sort()
109|> Enum.map(fn {_, v} -> hd(v) end)
110```
111
112<!-- livebook:{"output":true} -->
113
114```
115'FWNSHLDNZ'
116```
117
118## Task 2
119
120```elixir
121moves
122|> Enum.reduce(crates, &Day05.move(&1, &2, false))
123|> Enum.sort()
124|> Enum.map(fn {_, v} -> hd(v) end)
125```
126
127<!-- livebook:{"output":true} -->
128
129```
130'RNRGDNFQG'
131```