示例#1
0
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) )
示例#2
0
def part_1():
    return get_multi(FileUtils.int_input(), 2)
示例#3
0
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) )