-
Notifications
You must be signed in to change notification settings - Fork 0
/
day4.exs
106 lines (93 loc) · 2.36 KB
/
day4.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Title: Day4
# ── Untitled ──
numbers =
"input"
|> IO.gets()
|> String.trim()
|> String.split(",")
|> Enum.map(&String.to_integer/1)
|> IO.inspect()
data =
"input"
|> IO.getn(1_000_000)
|> String.split(["\r\n", "\n"], trim: true)
|> Enum.chunk_every(5)
|> Enum.map(fn rows ->
Enum.map(rows, fn row ->
row
|> String.split()
|> Enum.map(&String.to_integer/1)
end)
end)
boards =
for board <- data do
for {row, ri} <- Enum.with_index(board) do
for {col, ci} <- Enum.with_index(row) do
{col, {ri, ci}}
end
end
|> List.flatten()
|> Map.new()
|> then(&{&1, MapSet.new(), MapSet.new()})
end
defmodule P1 do
def calc(boards, [n | numbers]) do
boards =
Enum.map(boards, fn {map, coords, ns} = original ->
if where = Map.get(map, n) do
{map, MapSet.put(coords, where), MapSet.put(ns, n)}
else
original
end
end)
if winner =
Enum.find(boards, fn {_map, coords, _} ->
[Enum.group_by(coords, &elem(&1, 0)), Enum.group_by(coords, &elem(&1, 1))]
|> Enum.any?(fn map ->
Enum.any?(map, fn {_, v} -> length(v) == 5 end)
end)
end) do
{map, _, ns} = winner
map
|> Map.keys()
|> Kernel.--(ns |> Enum.to_list() |> IO.inspect(label: "ns"))
|> Enum.sum()
|> IO.inspect(label: "sum")
|> Kernel.*(n)
else
calc(boards, numbers)
end
end
end
P1.calc(boards, numbers)
defmodule P2 do
def calc(boards, [n | numbers]) do
boards =
Enum.map(boards, fn {map, coords, ns} = original ->
if where = Map.get(map, n) do
{map, MapSet.put(coords, where), MapSet.put(ns, n)}
else
original
end
end)
winners =
Enum.filter(boards, fn {_map, coords, _} ->
[Enum.group_by(coords, &elem(&1, 0)), Enum.group_by(coords, &elem(&1, 1))]
|> Enum.any?(fn map ->
Enum.any?(map, fn {_, v} -> length(v) == 5 end)
end)
end)
if match?(^winners, boards) do
{map, _, ns} = List.first(boards)
map
|> Map.keys()
|> Kernel.--(ns |> Enum.to_list() |> IO.inspect(label: "ns"))
|> Enum.sum()
|> IO.inspect(label: "sum")
|> Kernel.*(n)
else
calc(boards -- winners, numbers)
end
end
end
P2.calc(boards, numbers)