from utils import FileUtils import itertools def get_first_invalid(numbers, preamble=25): for idx, number in enumerate(numbers[preamble:]): is_valid = [sum(num_pair) == number for num_pair in itertools.combinations(numbers[idx:preamble + idx], 2)] if sum(is_valid) == 0: return number def get_encryption_weakness(numbers, invalid_num): sum_num, start_idx, last_idx = 0, -1, 0 while sum_num != invalid_num: sum_num = 0 start_idx += 1 for idx, number in enumerate(numbers[start_idx:]): sum_num += number last_idx = start_idx + idx if sum_num >= invalid_num: break return sum([min(numbers[start_idx:last_idx]), max(numbers[start_idx:last_idx])]) if __name__ == "__main__": invalid_num = get_first_invalid(FileUtils.int_input(), 25) print( invalid_num, get_encryption_weakness(FileUtils.int_input(), invalid_num) )
def part_1(): return get_multi(FileUtils.int_input(), 2)
from utils import FileUtils import collections import numpy as np def get_adapter_chain(adapters, current_jolt = 0): valid_adapters = list(filter(lambda adapter: current_jolt < adapter <= current_jolt + 3, adapters)) if valid_adapters: next_adapter = min(valid_adapters) return [current_jolt] + get_adapter_chain([ad for ad in adapters if ad != next_adapter], current_jolt=next_adapter) else: return [current_jolt, current_jolt + 3] def get_jolt_diff_count(joined_adapters, diff): return list(np.diff(joined_adapters)).count(diff) def get_distinct_list_count(adapters): size = len(adapters) combos_up_to_index = [1] * size for i in range(1, size): combos_up_to_index[i] = combos_up_to_index[i - 1] if i > 1 and adapters[i] - adapters[i - 2] <= 3: combos_up_to_index[i] += combos_up_to_index[i - 2] if i > 2 and adapters[i] - adapters[ i - 3] <= 3: combos_up_to_index[i] += combos_up_to_index[i - 3] return combos_up_to_index[-1] pass if __name__ == "__main__": adapter_chain = get_adapter_chain(FileUtils.int_input()) print( get_jolt_diff_count(adapter_chain, 1) * get_jolt_diff_count(adapter_chain, 3) ) print( get_distinct_list_count(adapter_chain) )