Skip to content

Commit 6611c8c

Browse files
committed
2025d3-2
1 parent df947fe commit 6611c8c

File tree

2 files changed

+45
-30
lines changed

2 files changed

+45
-30
lines changed

src/advent_of_code/year_2025/day_03.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,49 @@ def parse_battery_bank_to_ints_list(battery_bank_str):
44
return [int(x) for x in battery_bank_str]
55

66

7-
def combine_joltages(j1, j2):
8-
return int(f"{j1}{j2}")
7+
def combine_joltages(list_of_joltages):
8+
return int("".join([str(x) for x in list_of_joltages]))
99

1010

1111
def calculate_largest_joltage(battery_bank_as_ints):
1212
largest_joltage_1 = 0
1313

14-
15-
print(f"Calculating largest joltage for battery bank: {battery_bank_as_ints}")
16-
1714
for battery_index, battery_value in enumerate(battery_bank_as_ints):
18-
print(f"battery_value={battery_value}, battery_index={battery_index}")
1915
if (battery_value > largest_joltage_1) and (battery_index < len(battery_bank_as_ints) - 1):
2016
largest_joltage_1 = battery_value
2117
largest_joltage_2 = 0
22-
print(f"Larger value found! Setting largest_joltage_1 to {largest_joltage_1}")
2318
for second_battery_value in battery_bank_as_ints[battery_index+1:]:
24-
print(f"second_battery_value={second_battery_value}")
2519
if second_battery_value > largest_joltage_2:
2620
largest_joltage_2 = second_battery_value
27-
print(f"Larger value found! Setting largest_joltage_2 to {largest_joltage_2}")
28-
29-
print(f"Largest joltage combination: {largest_joltage_1}, {largest_joltage_2}")
3021

31-
return combine_joltages(largest_joltage_1, largest_joltage_2)
22+
return combine_joltages([largest_joltage_1, largest_joltage_2])
23+
3224

33-
def solve_part_1(input):
25+
def calculate_largest_joltage_part_2(battery_bank_as_ints, n_batteries=12):
26+
sorted_batteries = sorted(battery_bank_as_ints, reverse=True)
27+
return combine_joltages(sorted_batteries[:n_batteries])
28+
29+
30+
def solve_part(input, part=1):
3431
joltage_list = []
32+
33+
if part == 1:
34+
calculate_largest_joltage_function = calculate_largest_joltage
35+
elif part == 2:
36+
calculate_largest_joltage_function = calculate_largest_joltage_part_2
37+
else:
38+
raise ValueError("Part must be 1 or 2")
39+
3540
for battery_bank_str in input:
3641
battery_bank_as_ints = parse_battery_bank_to_ints_list(battery_bank_str)
37-
largest_joltage = calculate_largest_joltage(battery_bank_as_ints)
42+
largest_joltage = calculate_largest_joltage_function(battery_bank_as_ints)
3843
joltage_list.append(largest_joltage)
3944

4045
return sum(joltage_list)
4146

4247
def solve(input):
43-
part_1_solution = solve_part_1(input)
44-
part_2_solution = None
48+
part_1_solution = solve_part(input, part=1)
49+
part_2_solution = solve_part(input, part=2)
4550
return (part_1_solution, part_2_solution)
4651

4752

tests/year_2025/test_day_03.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
calculate_largest_joltage,
66
parse_battery_bank_to_ints_list,
77
combine_joltages,
8+
calculate_largest_joltage_part_2,
89
)
910

1011

@@ -20,29 +21,38 @@ def day_03_test_input():
2021

2122
@pytest.fixture
2223
def day_03_expected_output():
23-
return (357, None)
24+
return (357, 3121910778619)
2425

2526

2627
def test_solver(day_03_test_input, day_03_expected_output):
2728
result = solve(day_03_test_input)
2829
assert result == day_03_expected_output
2930

30-
@pytest.mark.parametrize(
31-
"input, expected_output",
32-
[
33-
[[9,8,7,6,5,4,3,2,1,1,1,1,1,1,1],98],
34-
[[8,1,1,1,1,1,1,1,1,1,1,1,1,1,9],89],
35-
[[2,3,4,2,3,4,2,3,4,2,3,4,2,7,8],78],
36-
[[8,1,8,1,8,1,9,1,1,1,1,2,1,1,1],92],
37-
],
38-
)
39-
def test_calculate_largest_joltage(input, expected_output):
40-
parsed_inputs = parse_battery_bank_to_ints_list(input)
41-
assert expected_output == calculate_largest_joltage(parsed_inputs)
31+
32+
33+
@pytest.fixture
34+
def test_calculate_largest_joltage_params():
35+
return [
36+
("987654321111111", 98, 987654321111),
37+
("811111111111119", 89, 811111111119),
38+
("234234234234278", 78, 434234234278),
39+
("818181911112111", 92, 888911112111),
40+
]
41+
42+
def test_calculate_largest_joltage_part_1(test_calculate_largest_joltage_params):
43+
for input_str, expected_output, _ in test_calculate_largest_joltage_params:
44+
parsed_inputs = parse_battery_bank_to_ints_list(input_str)
45+
assert expected_output == calculate_largest_joltage(parsed_inputs)
46+
47+
48+
def test_calculate_largest_joltage_part_2(test_calculate_largest_joltage_params):
49+
for input_str, _, expected_output in test_calculate_largest_joltage_params:
50+
parsed_inputs = parse_battery_bank_to_ints_list(input_str)
51+
assert expected_output == calculate_largest_joltage_part_2(parsed_inputs)
4252

4353

4454
def test_parse_battery_bank_to_ints_list():
4555
assert parse_battery_bank_to_ints_list("98765") == [9,8,7,6,5]
4656

4757
def test_combine_joltages():
48-
assert combine_joltages(9, 8) == 98
58+
assert combine_joltages([9, 8, 7]) == 987

0 commit comments

Comments
 (0)