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 Regex.named_captures(~r/move (?<count>\d+) from (?<from>\d) to (?<to>\d)/, move)
41 |> Map.new(fn {k, v} -> {String.to_atom(k), String.to_integer(v)} end)
42 end)
43
44crates =
45 crates
46 |> String.split("\n")
47 |> Enum.drop(-1)
48 |> Enum.map(fn line ->
49 line
50 |> String.to_charlist()
51 |> Enum.chunk_every(4)
52 |> Enum.map(fn
53 [?[, n, ?] | _] -> n
54 _ -> nil
55 end)
56 end)
57 |> Enum.zip()
58 |> Enum.map(fn column -> column |> Tuple.to_list() |> Enum.drop_while(&is_nil/1) end)
59 |> Enum.with_index(1)
60 |> Map.new(fn {v, k} -> {k, v} end)
61```
62
63<!-- livebook:{"output":true} -->
64
65```
66%{
67 1 => 'NWFRZSMD',
68 2 => 'SGQPW',
69 3 => 'CJNFQVRW',
70 4 => 'LDGCPZF',
71 5 => 'SPT',
72 6 => 'LRWFDH',
73 7 => 'CDNZ',
74 8 => 'QJSVFRNW',
75 9 => 'VWZGSMR'
76}
77```
78
79```elixir
80defmodule Day05 do
81 def move(%{count: count, from: from, to: to}, columns, reverse? \\ true) do
82 {moved, columns} = Access.get_and_update(columns, from, &Enum.split(&1, count))
83
84 moved = if reverse?, do: Enum.reverse(moved), else: moved
85
86 Map.update!(columns, to, &(moved ++ &1))
87 end
88
89 def eval(crates, moves, reverse? \\ true) do
90 moves
91 |> Enum.reduce(crates, &Day05.move(&1, &2, reverse?))
92 |> Enum.sort()
93 |> Enum.map(fn {_, v} -> hd(v) end)
94 end
95end
96```
97
98<!-- livebook:{"output":true} -->
99
100```
101{:module, Day05, <<70, 79, 82, 49, 0, 0, 13, ...>>, {:eval, 3}}
102```
103
104## Task 1
105
106```elixir
107Day05.eval(crates, moves)
108```
109
110<!-- livebook:{"output":true} -->
111
112```
113'FWNSHLDNZ'
114```
115
116## Task 2
117
118```elixir
119Day05.eval(crates, moves, false)
120```
121
122<!-- livebook:{"output":true} -->
123
124```
125'RNRGDNFQG'
126```