Day 16 - Advent of Code 2016

Working solution for the day 16 puzzles.

Parts One and Two

""" day_16_01_02.py """

# usage: python3 day_16_01_02.py 272 10001110011110000
# usage: python3 day_16_01_02.py 35651584 10001110011110000

import sys


disk_size = int(sys.argv[1])
state = sys.argv[2]

disk = ['0' for _ in range(disk_size)]
for i, data in enumerate(state):
    if i == disk_size:
        break
    disk[i] = data

index = len(state)
while index < disk_size:
    disk[index] = '0'
    index += 1
    for data in reversed(disk[:index - 1]):
        if index == disk_size:
            break
        disk[index] = '1' if data == '0' else '0'
        index += 1

data = ''.join(disk)
while True:
    checksum = []
    for i in range(0, len(data) - 1, 2):
        chunk = data[i:i + 2]
        checksum.append('1' if chunk in ['00', '11'] else '0')
    checksum = ''.join(checksum)
    if len(checksum) % 2 != 0:
        break
    data = checksum

print(checksum)