tangled
alpha
login
or
join now
hauleth.dev
/
advent-of-code
3
fork
atom
this repo has no description
3
fork
atom
overview
issues
pulls
pipelines
2024 day 11
hauleth.dev
1 year ago
ecbbff54
987d2410
verified
This commit was signed with the committer's
known signature
.
hauleth.dev
SSH Key Fingerprint:
SHA256:1hEP8QO8nM2KQfQ8jK4Q19y/CmqVZQI/cNSht3c1QlI=
+110
1 changed file
expand all
collapse all
unified
split
2024
day11.livemd
+110
2024/day11.livemd
···
1
1
+
<!-- livebook:{"persist_outputs":true} -->
2
2
+
3
3
+
# Day 11
4
4
+
5
5
+
```elixir
6
6
+
Mix.install([:kino_aoc])
7
7
+
```
8
8
+
9
9
+
## Section
10
10
+
11
11
+
<!-- livebook:{"attrs":"eyJhc3NpZ25fdG8iOiJwdXp6bGVfaW5wdXQiLCJkYXkiOiIxMSIsInNlc3Npb25fc2VjcmV0IjoiQURWRU5UX09GX0NPREVfU0VTU0lPTiIsInllYXIiOiIyMDI0In0","chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
12
+
13
13
+
```elixir
14
14
+
{:ok, puzzle_input} =
15
15
+
KinoAOC.download_puzzle("2024", "11", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16
16
+
```
17
17
+
18
18
+
<!-- livebook:{"output":true} -->
19
19
+
20
20
+
```
21
21
+
{:ok, "554735 45401 8434 0 188 7487525 77 7"}
22
22
+
```
23
23
+
24
24
+
```elixir
25
25
+
# puzzle_input = "125 17"
26
26
+
27
27
+
stones =
28
28
+
puzzle_input
29
29
+
|> String.split()
30
30
+
|> Enum.map(&String.to_integer/1)
31
31
+
|> Enum.frequencies()
32
32
+
```
33
33
+
34
34
+
<!-- livebook:{"output":true} -->
35
35
+
36
36
+
```
37
37
+
%{0 => 1, 7 => 1, 77 => 1, 188 => 1, 8434 => 1, 45401 => 1, 554735 => 1, 7487525 => 1}
38
38
+
```
39
39
+
40
40
+
```elixir
41
41
+
defmodule Stones do
42
42
+
def blink(list), do: Enum.reduce(list, %{}, &alter/2)
43
43
+
44
44
+
defp alter({0, count}, map), do: update(map, 1, count)
45
45
+
46
46
+
defp alter({n, count}, map) do
47
47
+
len = len(n)
48
48
+
49
49
+
if rem(len, 2) == 0 do
50
50
+
half = 10 ** div(len, 2)
51
51
+
52
52
+
map
53
53
+
|> update(div(n, half), count)
54
54
+
|> update(rem(n, half), count)
55
55
+
else
56
56
+
update(map, n * 2024, count)
57
57
+
end
58
58
+
end
59
59
+
60
60
+
defp len(n) when n < 10, do: 1
61
61
+
defp len(n) when n < 100, do: 2
62
62
+
defp len(n) when n < 1000, do: 3
63
63
+
defp len(n) when n < 10000, do: 4
64
64
+
defp len(n), do: ceil(:math.log10(n))
65
65
+
66
66
+
defp update(map, key, val), do: Map.update(map, key, val, &(&1 + val))
67
67
+
end
68
68
+
```
69
69
+
70
70
+
<!-- livebook:{"output":true} -->
71
71
+
72
72
+
```
73
73
+
{:module, Stones, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:update, 3}}
74
74
+
```
75
75
+
76
76
+
## Part 1
77
77
+
78
78
+
```elixir
79
79
+
1..25
80
80
+
|> Enum.reduce(stones, fn _, acc ->
81
81
+
Stones.blink(acc)
82
82
+
end)
83
83
+
|> Map.values()
84
84
+
|> Enum.sum()
85
85
+
```
86
86
+
87
87
+
<!-- livebook:{"output":true} -->
88
88
+
89
89
+
```
90
90
+
209412
91
91
+
```
92
92
+
93
93
+
## Part 2
94
94
+
95
95
+
```elixir
96
96
+
1..75
97
97
+
|> Enum.reduce(stones, fn _, acc ->
98
98
+
Stones.blink(acc)
99
99
+
end)
100
100
+
|> Map.values()
101
101
+
|> Enum.sum()
102
102
+
```
103
103
+
104
104
+
<!-- livebook:{"output":true} -->
105
105
+
106
106
+
```
107
107
+
248967696501656
108
108
+
```
109
109
+
110
110
+
<!-- livebook:{"offset":1963,"stamp":{"token":"XCP.YCGtDQl3XNWJm5oY1OPI2QDRB7EIjZxBmwK3eswS1ryD28kg8fS_fKGIFJGFbtL1NL7wYrv2ADW60yeAZnCv5KbDelUm_bxkPN4_K56iTJ1toOGfIRYlo2lj5beAjrmbhRw","version":2}} -->