-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathday_05.ex
52 lines (43 loc) · 1.32 KB
/
day_05.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
defmodule AdventOfCode.Y2024.Day05 do
@moduledoc """
--- Day 5: Print Queue ---
Problem Link: https://adventofcode.com/2024/day/5
Difficulty: xs
Tags: set sort
"""
alias AdventOfCode.Helpers.{InputReader, Transformers}
def input, do: InputReader.read_from_file(2024, 5)
def run(input \\ input()) do
input = parse(input)
{run_1(input), run_2(input)}
end
defp run_1(input) do
input
|> Enum.filter(fn {a, b} -> a == b end)
|> Enum.sum_by(fn {a, _} -> a |> Enum.at(div(length(a), 2)) end)
end
defp run_2(input) do
input
|> Enum.filter(fn {a, b} -> a != b end)
|> Enum.sum_by(fn {_, b} -> b |> Enum.at(div(length(b), 2)) end)
end
def parse(data \\ input()) do
[deps, updates] = Transformers.sections(data)
given_sorted_pair({parse_deps(deps), parse_updates(updates)})
end
defp parse_deps(deps) do
for line <- Transformers.lines(deps),
into: MapSet.new(),
do: String.split(line, "|") |> Enum.map(&String.to_integer/1) |> List.to_tuple()
end
defp parse_updates(updates) do
for line <- Transformers.lines(updates) do
for update <- String.split(line, ","), do: String.to_integer(update)
end
end
defp given_sorted_pair({deps, updates}) do
for update <- updates do
{update, Enum.sort(update, &({&1, &2} in deps))}
end
end
end