Optimized day 16

master
Tibor Bizjak 2023-03-20 18:37:27 +01:00
parent a6ac23f5c7
commit 8c27fca769
1 changed files with 23 additions and 18 deletions

View File

@ -1,8 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from intcode import defaultlist
from operator import mul
def str_of_signal(signal): def str_of_signal(signal):
return ''.join(map(str, signal)) return ''.join(map(str, signal))
@ -12,32 +9,40 @@ def apply_pattern(signal, offset=0):
for i in range(len(signal)-2, -1, -1): for i in range(len(signal)-2, -1, -1):
sums[i] = sums[i+1] + signal[i] sums[i] = sums[i+1] + signal[i]
sums = defaultlist(sums, lambda : 0) i = 0
new = [] step = offset + 1
for i in range(len(signal)):
step = i + offset + 1 while i + step < len(signal):
n = 0 n = sum(sums[i::4*step])
for block in range(i, len(signal), 4*step): n -= sum(sums[i+step::4*step])
n += sums[block] - sums[block + step] n -= sum(sums[i+2*step::4*step])
n -= sums[block + 2*step] - sums[block + 3*step] n += sum(sums[i+3*step::4*step])
new.append(abs(n)%10)
return new signal[i] = abs(n)%10
i += 1
step += 1
signal[i:] = [s % 10 for s in sums[i:]]
def phase(signal, n, offset=0): def phase(signal, n, offset=0):
signal = signal[offset:]
for i in range(n): for i in range(n):
signal = apply_pattern(signal, offset) apply_pattern(signal, offset)
return signal
def preproc(puzzle_input): def preproc(puzzle_input):
return list(map(int, puzzle_input)) return list(map(int, puzzle_input))
def partI(signal): def partI(signal):
return str_of_signal(phase(signal, 100)[:8]) signal = signal.copy()
phase(signal, 100)
return str_of_signal(signal[:8])
def partII(signal): def partII(signal):
signal = signal * 10**4 signal = signal * 10**4
offset = int(str_of_signal(signal[:7])) offset = int(str_of_signal(signal[:7]))
return str_of_signal(phase(signal, 100, offset)[:8]) signal = signal[offset:]
phase(signal, 100, offset)
return str_of_signal(signal[:8])