-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path22.exs
76 lines (69 loc) · 1.49 KB
/
22.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
defmodule TwentyTwo do
import Bitwise
def part_one(input) do
input
|> parse()
|> Enum.map(fn n ->
Stream.iterate(n, &step/1)
|> Enum.at(2000)
end)
|> Enum.sum()
end
def part_two(input) do
input
|> parse()
|> Enum.map(fn n ->
Stream.iterate(n, &step/1)
|> Enum.take(2000)
|> Enum.map(&rem(&1, 10))
|> Enum.chunk_every(5, 1, :discard)
|> Enum.map(fn sequence ->
key =
sequence
|> Enum.chunk_every(2, 1, :discard)
|> Enum.map(fn [a, b] -> b - a end)
{key, List.last(sequence)}
end)
|> Enum.reduce(%{}, fn {k, v}, acc ->
Map.put_new(acc, k, v)
end)
end)
|> Enum.reduce(%{}, fn m, acc ->
Map.merge(acc, m, fn _, v1, v2 -> v1 + v2 end)
end)
|> Enum.max_by(&elem(&1, 1))
|> elem(1)
end
defp parse(text) do
text
|> String.trim()
|> String.split(~r/\R/)
|> Enum.map(&String.to_integer/1)
end
defp step(n) do
n
|> then(fn s ->
s
|> Kernel.*(64)
|> mix(s)
|> prune()
end)
|> then(fn s ->
s
|> div(32)
|> mix(s)
|> prune()
end)
|> then(fn s ->
s
|> Kernel.*(2048)
|> mix(s)
|> prune()
end)
end
defp mix(a, b), do: bxor(a, b)
defp prune(a), do: rem(a, 16777216)
end
input = File.read!("input/22.txt")
input |> TwentyTwo.part_one() |> IO.inspect(label: "part 1")
input |> TwentyTwo.part_two() |> IO.inspect(label: "part 2")