this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 11
4
5```elixir
6Mix.install([:kino_aoc])
7```
8
9## Section
10
11<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIxMSIsInNlc3Npb25fc2VjcmV0IjoiQURWRU5UX09GX0NPREVfU0VTU0lPTiIsInllYXIiOiIyMDI0In0","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
13```elixir
14{:ok, puzzle_input} =
15 KinoAOC.download_puzzle("2024", "11", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16```
17
18<!-- livebook:{"output":true} -->
19
20```
21{:ok, "554735 45401 8434 0 188 7487525 77 7"}
22```
23
24```elixir
25# puzzle_input = "125 17"
26
27stones =
28 puzzle_input
29 |> String.split()
30 |> Enum.map(&String.to_integer/1)
31 |> Enum.frequencies()
32```
33
34<!-- livebook:{"output":true} -->
35
36```
37%{0 => 1, 7 => 1, 77 => 1, 188 => 1, 8434 => 1, 45401 => 1, 554735 => 1, 7487525 => 1}
38```
39
40```elixir
41defmodule Stones do
42 def blink(list), do: Enum.reduce(list, %{}, &alter/2)
43
44 defp alter({0, count}, map), do: update(map, 1, count)
45
46 defp alter({n, count}, map) do
47 len = len(n)
48
49 if rem(len, 2) == 0 do
50 half = 10 ** div(len, 2)
51
52 map
53 |> update(div(n, half), count)
54 |> update(rem(n, half), count)
55 else
56 update(map, n * 2024, count)
57 end
58 end
59
60 defp len(n) when n < 10, do: 1
61 defp len(n) when n < 100, do: 2
62 defp len(n) when n < 1000, do: 3
63 defp len(n) when n < 10000, do: 4
64 defp len(n), do: ceil(:math.log10(n))
65
66 defp update(map, key, val), do: Map.update(map, key, val, &(&1 + val))
67end
68```
69
70<!-- livebook:{"output":true} -->
71
72```
73{:module, Stones, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:update, 3}}
74```
75
76## Part 1
77
78```elixir
791..25
80|> Enum.reduce(stones, fn _, acc ->
81 Stones.blink(acc)
82end)
83|> Map.values()
84|> Enum.sum()
85```
86
87<!-- livebook:{"output":true} -->
88
89```
90209412
91```
92
93## Part 2
94
95```elixir
961..75
97|> Enum.reduce(stones, fn _, acc ->
98 Stones.blink(acc)
99end)
100|> Map.values()
101|> Enum.sum()
102```
103
104<!-- livebook:{"output":true} -->
105
106```
107248967696501656
108```
109
110<!-- livebook:{"offset":1963,"stamp":{"token":"XCP.YCGtDQl3XNWJm5oY1OPI2QDRB7EIjZxBmwK3eswS1ryD28kg8fS_fKGIFJGFbtL1NL7wYrv2ADW60yeAZnCv5KbDelUm_bxkPN4_K56iTJ1toOGfIRYlo2lj5beAjrmbhRw","version":2}} -->