this repo has no description
at master 6.6 kB view raw
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```