Files
python-aoc-2021/day16/generator.py
Sebastian Seedorf 6ff4a25bf3 Day 16
2021-12-17 11:29:35 +01:00

87 lines
2.2 KiB
Python

import random
def int_to_bin(num, l):
return bin(num)[2:].zfill(l)
def literal(ver, num):
bin_num = bin(num)[2:]
bin_num = bin_num.zfill((len(bin_num)+3) // 4 * 4)
return int_to_bin(ver, 3) + int_to_bin(4, 3) + ''.join(('1' if i+4 < len(bin_num) else "0") + bin_num[i:i+4] for i in range(0, len(bin_num), 4))
def sub_by_length(ver, op, subs):
bin_sub = ''.join(subs)
bin_len = int_to_bin(len(bin_sub), 15)
return int_to_bin(ver, 3) + int_to_bin(op, 3) + '0' + bin_len + bin_sub
def sub_by_amount(ver, op, subs):
bin_sub = ''.join(subs)
bin_len = int_to_bin(len(subs), 11)
return int_to_bin(ver, 3) + int_to_bin(op, 3) + '1' + bin_len + bin_sub
def bin_to_hex(bin_num):
pad_len = (len(bin_num)+7) // 8 * 8 - len(bin_num)
bin_num = bin_num + '0' * pad_len
return ''.join(hex(int(bin_num[i:i+4], 2))[2:] for i in range(0, len(bin_num), 4)).upper()
print(bin_to_hex(
literal(6, 2021)
) == 'D2FE28')
print(bin_to_hex(
sub_by_length(1, 6, [
literal(6, 10),
literal(2, 20)
])
) == '38006F45291200')
print(bin_to_hex(
sub_by_amount(7, 3, [
literal(2, 1),
literal(4, 2),
literal(1, 3)
])
) == 'EE00D40C823060')
print(bin_to_hex(
sub_by_amount(4, 2, [
sub_by_amount(1, 2, [
sub_by_length(5, 2, [
literal(6, 15)
])
])
])
) == '8A004A801A8002F478')
print(bin_to_hex(
sub_by_amount(3, 0, [
sub_by_length(0, 0, [
literal(0, 10),
literal(5, 11)
]),
sub_by_amount(1, 0, [
literal(0, 12),
literal(3, 13)
])
])
) == '620080001611562C8802118E34')
print(bin_to_hex(
sub_by_length(3, 0, [
sub_by_length(0, 0, [
literal(0, 1000),
literal(5, 51641)
]),
sub_by_length(1, 0, [
literal(0, 65213),
literal(3, 213511)
]),
sub_by_length(1, 0, [
literal(0, 65213),
literal(3, 213511)
]),
sub_by_length(1, 0, [
literal(0, 65213),
literal(3, 213511)
]),
sub_by_length(1, 0, [
literal(0, 65213),
literal(3, 213511)
])
])
))