-
Notifications
You must be signed in to change notification settings - Fork 0
/
14.ex
executable file
·44 lines (38 loc) · 1.16 KB
/
14.ex
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
#! /usr/bin/env elixir
defmodule Day do
import Bitwise
def run() do
instr =
File.read!("14.csv")
|> String.split("\n", trim: true)
|> Enum.map(fn row -> String.split(row, " = ") end)
{_, _, map} =
Enum.reduce(instr, {0, 0, %{}}, fn [assign, num], {mask0, mask1, map} ->
case assign do
"mask" ->
{mask0, mask1, _} =
String.to_charlist(num)
|> Enum.reverse()
|> Enum.reduce({0, 0, 1}, fn x, {mask0, mask1, bit} ->
case x do
?X -> {mask0, mask1, bit * 2}
?1 -> {mask0, mask1 ||| bit, bit * 2}
?0 -> {mask0 ||| bit, mask1, bit * 2}
end
end)
{mask0, mask1, map}
_ ->
["mem", index] = String.split(String.trim_trailing(assign, "]"), "[")
index = String.to_integer(index)
num = String.to_integer(num)
value = (num ||| mask1) &&& Bitwise.bnot(mask0)
{mask0, mask1, Map.put(map, index, value)}
end
end)
map
|> Map.values()
|> Enum.sum()
|> IO.inspect()
end
end
Day.run()