Day 16
This commit is contained in:
86
day16/generator.py
Normal file
86
day16/generator.py
Normal file
@@ -0,0 +1,86 @@
|
||||
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)
|
||||
])
|
||||
])
|
||||
))
|
||||
Reference in New Issue
Block a user