Skip to content

Commit 156b707

Browse files
committed
Solve 20_2_4
1 parent fc88780 commit 156b707

6 files changed

Lines changed: 1284 additions & 0 deletions

File tree

lib/2024/day_02.ex

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
defmodule AdventOfCode.Y2024.Day02 do
2+
@moduledoc """
3+
--- Day 2: Red-Nosed Reports ---
4+
Problem Link: https://adventofcode.com/2024/day/2
5+
Difficulty: s
6+
Tags: sequence validation
7+
"""
8+
alias AdventOfCode.Helpers.{InputReader, Transformers}
9+
10+
def input, do: InputReader.read_from_file(2024, 2)
11+
12+
def run(input \\ input()) do
13+
reports = parse(input)
14+
15+
{run_1(reports), run_2(reports)}
16+
end
17+
18+
defp run_1(reports) do
19+
Enum.count(reports, &safe?/1)
20+
end
21+
22+
defp run_2(reports) do
23+
Enum.count(reports, fn report ->
24+
safe?(report) or
25+
0..(length(report) - 1)
26+
|> Enum.any?(fn i ->
27+
report |> List.delete_at(i) |> safe?()
28+
end)
29+
end)
30+
end
31+
32+
defp safe?(report) do
33+
diffs =
34+
report
35+
|> Enum.chunk_every(2, 1, :discard)
36+
|> Enum.map(fn [a, b] -> b - a end)
37+
38+
all_increasing = Enum.all?(diffs, fn d -> d >= 1 and d <= 3 end)
39+
all_decreasing = Enum.all?(diffs, fn d -> d <= -1 and d >= -3 end)
40+
41+
all_increasing or all_decreasing
42+
end
43+
44+
def parse(data \\ input()) do
45+
data
46+
|> Transformers.lines()
47+
|> Enum.map(fn line ->
48+
line
49+
|> String.split()
50+
|> Enum.map(&String.to_integer/1)
51+
end)
52+
end
53+
end

lib/2024/day_04.ex

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
defmodule AdventOfCode.Y2024.Day04 do
2+
@moduledoc """
3+
--- Day 4: Ceres Search ---
4+
Problem Link: https://adventofcode.com/2024/day/4
5+
Difficulty: s
6+
Tags: grid word-search
7+
"""
8+
alias AdventOfCode.Helpers.{InputReader, Transformers}
9+
10+
alias Yog.Builder.Grid
11+
12+
def input, do: InputReader.read_from_file(2024, 4)
13+
14+
def run(input \\ input()) do
15+
grid = parse_to_map(input)
16+
17+
{run_1(grid), run_2(grid)}
18+
end
19+
20+
defp run_1(grid) do
21+
for {{x, y}, "X"} <- grid,
22+
{dx, dy} <- Grid.queen(),
23+
xmas?(grid, x, y, dx, dy),
24+
reduce: 0 do
25+
acc -> acc + 1
26+
end
27+
end
28+
29+
defp run_2(grid) do
30+
for {{x, y}, "A"} <- grid,
31+
x_mas?(grid, x, y),
32+
reduce: 0 do
33+
acc -> acc + 1
34+
end
35+
end
36+
37+
defp xmas?(grid, x, y, dx, dy) do
38+
grid[{x + dx, y + dy}] == "M" and
39+
grid[{x + 2 * dx, y + 2 * dy}] == "A" and
40+
grid[{x + 3 * dx, y + 3 * dy}] == "S"
41+
end
42+
43+
defp x_mas?(grid, x, y) do
44+
d1 = {grid[{x - 1, y - 1}], grid[{x + 1, y + 1}]}
45+
d2 = {grid[{x + 1, y - 1}], grid[{x - 1, y + 1}]}
46+
47+
valid_diag?(d1) and valid_diag?(d2)
48+
end
49+
50+
defp valid_diag?({"M", "S"}), do: true
51+
defp valid_diag?({"S", "M"}), do: true
52+
defp valid_diag?(_), do: false
53+
54+
defp parse_to_map(data) do
55+
lines = Transformers.lines(data)
56+
57+
for {line, y} <- Enum.with_index(lines),
58+
{char, x} <- Enum.with_index(String.graphemes(line)),
59+
into: %{} do
60+
{{x, y}, char}
61+
end
62+
end
63+
64+
def parse(data \\ input()) do
65+
data |> Transformers.lines()
66+
end
67+
end

0 commit comments

Comments
 (0)