|
1 | 1 | from advent_of_code.utils.input_handling import read_input |
2 | 2 |
|
| 3 | + |
3 | 4 | def parse_battery_bank_to_ints_list(battery_bank_str): |
4 | 5 | return [int(x) for x in battery_bank_str] |
5 | 6 |
|
6 | 7 |
|
7 | | -def combine_joltages(j1, j2): |
8 | | - return int(f"{j1}{j2}") |
| 8 | +def combine_joltages(list_of_joltages): |
| 9 | + return int("".join([str(x) for x in list_of_joltages])) |
| 10 | + |
| 11 | + |
| 12 | +def find_max_and_leftmost_index(input_list): |
| 13 | + max_value = max(input_list) |
| 14 | + leftmost_index = input_list.index(max_value) |
| 15 | + return max_value, leftmost_index |
| 16 | + |
9 | 17 |
|
| 18 | +def calculate_largest_joltage(battery_bank_as_ints, n_batteries): |
10 | 19 |
|
11 | | -def calculate_largest_joltage(battery_bank_as_ints): |
12 | | - largest_joltage_1 = 0 |
13 | | - |
| 20 | + batteries_remaining = n_batteries |
| 21 | + bank_len = len(battery_bank_as_ints) |
| 22 | + list_of_joltages = [] |
| 23 | + start_ix = 0 |
14 | 24 |
|
15 | | - print(f"Calculating largest joltage for battery bank: {battery_bank_as_ints}") |
| 25 | + while batteries_remaining > 0: |
| 26 | + end_ix = bank_len - batteries_remaining + 1 |
| 27 | + window_to_check = battery_bank_as_ints[start_ix:end_ix] |
16 | 28 |
|
17 | | - for battery_index, battery_value in enumerate(battery_bank_as_ints): |
18 | | - print(f"battery_value={battery_value}, battery_index={battery_index}") |
19 | | - if (battery_value > largest_joltage_1) and (battery_index < len(battery_bank_as_ints) - 1): |
20 | | - largest_joltage_1 = battery_value |
21 | | - largest_joltage_2 = 0 |
22 | | - print(f"Larger value found! Setting largest_joltage_1 to {largest_joltage_1}") |
23 | | - for second_battery_value in battery_bank_as_ints[battery_index+1:]: |
24 | | - print(f"second_battery_value={second_battery_value}") |
25 | | - if second_battery_value > largest_joltage_2: |
26 | | - largest_joltage_2 = second_battery_value |
27 | | - print(f"Larger value found! Setting largest_joltage_2 to {largest_joltage_2}") |
| 29 | + # find largest value in window and the left-most index for dupes |
| 30 | + max_value, leftmost_index_window = find_max_and_leftmost_index(window_to_check) |
| 31 | + leftmost_index = leftmost_index_window + start_ix |
| 32 | + list_of_joltages.append(max_value) |
28 | 33 |
|
29 | | - print(f"Largest joltage combination: {largest_joltage_1}, {largest_joltage_2}") |
30 | | - |
31 | | - return combine_joltages(largest_joltage_1, largest_joltage_2) |
| 34 | + # reassign start_ix and update remaining batteries |
| 35 | + start_ix = leftmost_index + 1 |
| 36 | + batteries_remaining -= 1 |
32 | 37 |
|
33 | | -def solve_part_1(input): |
| 38 | + print(f"list_of_joltages={list_of_joltages}") |
| 39 | + return combine_joltages(list_of_joltages) |
| 40 | + |
| 41 | + |
| 42 | +def solve_part(input, n_batteries): |
34 | 43 | joltage_list = [] |
| 44 | + |
35 | 45 | for battery_bank_str in input: |
36 | 46 | battery_bank_as_ints = parse_battery_bank_to_ints_list(battery_bank_str) |
37 | | - largest_joltage = calculate_largest_joltage(battery_bank_as_ints) |
| 47 | + largest_joltage = calculate_largest_joltage(battery_bank_as_ints, n_batteries) |
38 | 48 | joltage_list.append(largest_joltage) |
39 | 49 |
|
40 | 50 | return sum(joltage_list) |
41 | 51 |
|
| 52 | + |
42 | 53 | def solve(input): |
43 | | - part_1_solution = solve_part_1(input) |
44 | | - part_2_solution = None |
| 54 | + part_1_solution = solve_part(input, n_batteries=2) |
| 55 | + part_2_solution = solve_part(input, n_batteries=12) |
45 | 56 | return (part_1_solution, part_2_solution) |
46 | 57 |
|
47 | 58 |
|
|
0 commit comments