-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2.ex
59 lines (50 loc) · 1.15 KB
/
2.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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
defmodule Checksum do
def calculate do
input =
"2.input"
|> File.read!()
|> String.trim()
|> String.split("\n")
|> Enum.map(fn row -> String.split(row, "\t") |> Enum.map(&String.to_integer/1) end)
Enum.reduce(input, 0, fn row, sum ->
{min, max} = Enum.min_max(row)
sum + (max - min)
end)
end
end
defmodule Checksum2 do
def calculate do
input =
"2.input"
|> File.read!()
|> String.trim()
|> String.split("\n")
|> Enum.map(fn row -> String.split(row, "\t") |> Enum.map(&String.to_integer/1) end)
Enum.reduce(input, 0, fn row, sum ->
sum + get_result(Enum.sort(row))
end)
end
defp get_result([x, y]) do
div(y, x)
end
defp get_result([min | rest]) do
case get_result(min, rest) do
{:ok, result} -> result
_ -> get_result(rest)
end
end
defp get_result(_, []) do
:error
end
defp get_result(min, [next | rest]) do
if is_integer?(next / min) do
{:ok, div(next, min)}
else
get_result(min, rest)
end
end
defp is_integer?(num) do
trunc(num) == num
end
end
IO.inspect Checksum2.calculate()