-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday11.exs
62 lines (51 loc) · 1.32 KB
/
day11.exs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
defmodule Day11 do
require Integer
def main(input) do
stones = parse(input)
IO.puts("Part one result: #{part_one(stones)}")
IO.puts("Part two result: #{part_two(stones)}")
end
defp parse(input) do
input
|> String.trim_trailing("\n")
|> String.split(" ")
|> Enum.map(&String.to_integer/1)
|> Enum.frequencies()
end
defp part_one(stones) do
solve(stones, 25)
|> Enum.map(&elem(&1, 1))
|> Enum.sum()
end
defp part_two(stones) do
solve(stones, 75)
|> Enum.map(&elem(&1, 1))
|> Enum.sum()
end
defp solve(stones, 0), do: stones
defp solve(stones, blinks) do
stones
|> Enum.reduce(%{}, fn {stone, freq}, stones ->
handle_stone(stone)
|> Enum.reduce(stones, fn new_stone, stones ->
Map.update(stones, new_stone, freq, &(&1 + freq))
end)
end)
|> solve(blinks - 1)
end
defp handle_stone(0), do: [1]
defp handle_stone(stone) do
stone_digits = Integer.digits(stone)
stone_digits_length = length(stone_digits)
if rem(stone_digits_length, 2) == 0 do
{stone_digits1, stone_digits2} = Enum.split(stone_digits, div(stone_digits_length, 2))
[Integer.undigits(stone_digits1), Integer.undigits(stone_digits2)]
else
[stone * 2024]
end
end
end
System.argv()
|> hd()
|> File.read!()
|> Day11.main()