Skip to content

Commit fad36c7

Browse files
committed
2024 Day 21
1 parent 1f47711 commit fad36c7

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

2024/lib/day22.ex

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
defmodule Day22a do
2+
import Bitwise
3+
4+
def prune(sec) do
5+
rem(sec, 16_777_216)
6+
end
7+
8+
def mix(x, sec) do
9+
bxor(sec, x)
10+
end
11+
12+
def evolve(sec) do
13+
sec = mix(sec * 64, sec) |> prune()
14+
sec = mix(div(sec, 32), sec) |> prune()
15+
sec = mix(sec * 2048, sec) |> prune()
16+
sec
17+
end
18+
19+
def run do
20+
File.read!(".input.txt") |> run
21+
end
22+
23+
def run(input) do
24+
input
25+
|> String.split("\n")
26+
|> Enum.map(&String.to_integer/1)
27+
|> Enum.map(fn sec ->
28+
1..2000
29+
|> Enum.reduce(sec, fn _, sec ->
30+
evolve(sec)
31+
end)
32+
end)
33+
|> Enum.sum()
34+
end
35+
end
36+
37+
defmodule Day22b do
38+
import Bitwise
39+
40+
def prune(sec) do
41+
rem(sec, 16_777_216)
42+
end
43+
44+
def mix(x, sec) do
45+
bxor(sec, x)
46+
end
47+
48+
def evolve(sec) do
49+
sec = mix(sec * 64, sec) |> prune()
50+
sec = mix(div(sec, 32), sec) |> prune()
51+
sec = mix(sec * 2048, sec) |> prune()
52+
sec
53+
end
54+
55+
def run do
56+
File.read!(".input.txt") |> run
57+
end
58+
59+
def run(input) do
60+
maps =
61+
input
62+
|> String.split("\n")
63+
|> Enum.map(&String.to_integer/1)
64+
|> Enum.map(fn sec ->
65+
{diffs, _} =
66+
1..2000
67+
|> Enum.map_reduce(sec, fn _, sec ->
68+
secp = evolve(sec)
69+
{{rem(secp, 10) - rem(sec, 10), secp}, secp}
70+
end)
71+
72+
Enum.zip(0..3 |> Enum.map(&Enum.drop(diffs, &1)))
73+
|> Enum.map(fn x ->
74+
{
75+
x |> Tuple.to_list() |> Enum.map(&elem(&1, 0)) |> List.to_tuple(),
76+
rem(x |> elem(3) |> elem(1), 10)
77+
}
78+
end)
79+
|> Enum.reverse()
80+
|> Map.new()
81+
end)
82+
83+
maps
84+
|> Enum.reduce(fn a, b ->
85+
Map.merge(a, b, fn _, a, b -> a + b end)
86+
end)
87+
|> Map.values()
88+
|> Enum.max()
89+
end
90+
end

2024/test/day22_test.exs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
defmodule Day22Test do
2+
use ExUnit.Case
3+
4+
def example, do: "1
5+
10
6+
100
7+
2024"
8+
9+
test "Part 1 Example" do
10+
assert Day22a.run(example()) == 37_327_623
11+
end
12+
13+
# test "Part 2 Example" do
14+
# assert Day22b.run(example()) == 24
15+
# end
16+
end

0 commit comments

Comments
 (0)