Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2017-12-15 - Dueling Generators

(original .ipynb)
from math import remainder
global_modulo = 2147483647


def create_generator(factor, value, multiple=1):
    while True:
        value = (value * factor) % global_modulo
        if value % multiple == 0:
            yield value
        
        
def l16_match(val_a, val_b):
    return 0xffff & val_a == 0xffff & val_b
        

def part_one(start_a, start_b, iterations):
    a = create_generator(16807, start_a)
    b = create_generator(48271, start_b)
    total = 0
    while iterations > 0:
        if l16_match(next(a), next(b)):
            total += 1
        
        iterations -= 1
        
    return total


assert 1 == part_one(65, 8921, 5)
# assert 588 == part_one(65, 8921) #sloooow, but it works

# my puzzle input is:
# Generator A starts with 591
# Generator B starts with 393
print("part one:", part_one(591, 393, 40_000_000))
part one: 619
def part_two(start_a, start_b, iterations):
    a = create_generator(16807, start_a, 4)
    b = create_generator(48271, start_b, 8)
    total = 0
    while iterations > 0:
        if l16_match(next(a), next(b)):
            total += 1
        
        iterations -= 1

    return total
    
    
assert 0 == part_two(65, 8921, 5)
assert 1 == part_two(65, 8921, 1056)

print("part_two:", part_two(591, 393, 5_000_000))
part_two: 290