Skip to content

Commit 450a909

Browse files
committed
day 2 (first make it work)
1 parent aa73378 commit 450a909

4 files changed

Lines changed: 184 additions & 10 deletions

File tree

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,52 @@
11
defmodule AdventOfCode.Day02 do
2-
def part1(_args) do
2+
import AdventOfCode.Parsing
3+
4+
def part1(input) do
5+
input
6+
|> parse_rows_ints
7+
|> Enum.count(fn row -> safe_increasing(row) or safe_decreasing(row) end)
8+
end
9+
10+
def part2(input) do
11+
parse_rows_ints(input)
12+
|> Enum.count(fn row ->
13+
safe_ish_increasing(row, []) or safe_ish_decreasing(row, [])
14+
end)
15+
end
16+
17+
defp safe_increasing([_]), do: true
18+
defp safe_increasing([a, b | _tail]) when a >= b, do: false
19+
defp safe_increasing([a, b | _tail]) when b - a > 3, do: false
20+
defp safe_increasing([_a, b | tail]), do: safe_increasing([b | tail])
21+
22+
defp safe_decreasing([_]), do: true
23+
defp safe_decreasing([a, b | _tail]) when a <= b, do: false
24+
defp safe_decreasing([a, b | _tail]) when a - b > 3, do: false
25+
defp safe_decreasing([_a, b | tail]), do: safe_decreasing([b | tail])
26+
27+
defp safe_ish_increasing([_], _), do: true
28+
29+
defp safe_ish_increasing([a, b | tail], popped) when a < b and b - a <= 3,
30+
do: safe_ish_increasing([b | tail], [a | popped])
31+
32+
defp safe_ish_increasing([a, b | tail] = _list, []) do
33+
safe_increasing([a | tail]) or safe_increasing([b | tail])
34+
end
35+
36+
defp safe_ish_increasing([a, b | tail] = _list, [last | _]) do
37+
safe_increasing([last, a | tail]) or safe_increasing([last, b | tail])
38+
end
39+
40+
defp safe_ish_decreasing([_], _), do: true
41+
42+
defp safe_ish_decreasing([a, b | tail], popped) when a > b and a - b <= 3,
43+
do: safe_ish_decreasing([b | tail], [a | popped])
44+
45+
defp safe_ish_decreasing([a, b | tail], []) do
46+
safe_decreasing([a | tail]) or safe_decreasing([b | tail])
347
end
448

5-
def part2(_args) do
49+
defp safe_ish_decreasing([a, b | tail], [last | _]) do
50+
safe_decreasing([last, a | tail]) or safe_decreasing([last, b | tail])
651
end
752
end

elixir/2024/test/advent_of_code/day_02_test.exs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,42 @@ defmodule AdventOfCode.Day02Test do
33

44
import AdventOfCode.Day02
55

6-
@tag :skip
76
test "part1" do
8-
input = nil
9-
result = part1(input)
7+
input = """
8+
7 6 4 2 1
9+
1 2 7 8 9
10+
9 7 6 2 1
11+
1 3 2 4 5
12+
8 6 4 4 1
13+
1 3 6 7 9
14+
"""
1015

11-
assert result
16+
2 = part1(input)
1217
end
1318

14-
@tag :skip
1519
test "part2" do
16-
input = nil
17-
result = part2(input)
20+
input1 = """
21+
7 6 4 2 1
22+
1 2 7 8 9
23+
9 7 6 2 1
24+
1 3 2 4 5
25+
8 6 4 4 1
26+
1 3 6 7 9
27+
"""
1828

19-
assert result
29+
4 =
30+
part2(input1)
31+
32+
input2 = """
33+
1 6 7 8 9
34+
4 5 6 7 1
35+
1 7 2 8 3
36+
1 3 2 6 7
37+
1 7 4 6 7
38+
5 3 4 3 2
39+
"""
40+
41+
5 =
42+
part2(input2)
2043
end
2144
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
7 6 4 2 1
2+
1 2 7 8 9
3+
9 7 6 2 1
4+
1 3 2 4 5
5+
8 6 4 4 1
6+
1 3 6 7 9
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# Generated using @xavdid's AoC Python Template: https://github.com/xavdid/advent-of-code-python-template
2+
3+
# puzzle prompt: https://adventofcode.com/2024/day/2
4+
5+
from ...base import StrSplitSolution, answer
6+
from collections import deque
7+
8+
9+
class Solution(StrSplitSolution):
10+
_year = 2024
11+
_day = 2
12+
13+
# @answer(1234)
14+
def part_1(self) -> int:
15+
levels: list[deque[int]] = []
16+
for row in self.input:
17+
levels.append(deque(map(int, row.split())))
18+
19+
safe_levels = list(filter(lambda row:
20+
self.__safe_decreasing(row) or self.__safe_increasing(row),
21+
levels))
22+
return len(safe_levels)
23+
24+
25+
# @answer(1234)
26+
def part_2(self) -> int:
27+
levels: list[deque[int]] = []
28+
for row in self.input:
29+
levels.append(deque(map(int, row.split())))
30+
31+
print(levels)
32+
safe_levels = list(filter(lambda row:
33+
self.__safe_ish_decreasing(row.copy(), []) or self.__safe_ish_increasing(row.copy(), []),
34+
levels))
35+
return len(safe_levels)
36+
37+
38+
39+
def __safe_ish_decreasing(self, values: deque[int], seen: list[int]) -> bool:
40+
try:
41+
a = values.popleft()
42+
b = values.popleft()
43+
if b < a and a - b <= 3:
44+
seen.append(a)
45+
values.appendleft(b)
46+
return self.__safe_ish_decreasing(values, seen)
47+
elif seen == []:
48+
return self.__safe_decreasing(self.__append_head(values, a)) \
49+
or self.__safe_decreasing(self.__append_head(values, b))
50+
else:
51+
last = seen.pop()
52+
return self.__safe_decreasing(self.__append_head(self.__append_head(values, a), last)) \
53+
or self.__safe_decreasing(self.__append_head(self.__append_head(values, b), last))
54+
55+
except IndexError:
56+
return True
57+
58+
def __safe_ish_increasing(self, values: deque[int], seen: list[int]) -> bool:
59+
try:
60+
a = values.popleft()
61+
b = values.popleft()
62+
if b > a and b - a <= 3:
63+
seen.append(a)
64+
values.appendleft(b)
65+
return self.__safe_ish_increasing(values, seen)
66+
elif seen == []:
67+
return self.__safe_increasing(self.__append_head(values, a)) \
68+
or self.__safe_increasing(self.__append_head(values, b))
69+
else:
70+
last = seen.pop()
71+
return self.__safe_increasing(self.__append_head(self.__append_head(values, a), last)) \
72+
or self.__safe_increasing(self.__append_head(self.__append_head(values, b), last))
73+
74+
except IndexError:
75+
return True
76+
77+
def __append_head(self, values: deque[int], head: int) -> deque[int]:
78+
my_copy = values.copy()
79+
my_copy.appendleft(head)
80+
return my_copy
81+
82+
def __safe_decreasing(self, values: deque[int]) -> bool:
83+
last = values.popleft()
84+
for val in values:
85+
if last <= val:
86+
return False
87+
elif last - val > 3:
88+
return False
89+
last = val
90+
return True
91+
92+
def __safe_increasing(self, values: deque[int]) -> bool:
93+
last = values.popleft()
94+
for val in values:
95+
if last >= val:
96+
return False
97+
elif val - last > 3:
98+
return False
99+
last = val
100+
return True

0 commit comments

Comments
 (0)