day 17 python cleanup

main
magical 2022-12-16 22:43:00 -08:00
parent 799fefa59a
commit de987b60db
1 changed files with 44 additions and 34 deletions

View File

@ -7,22 +7,21 @@ rocks = [
0b00011000_00011000,
]
wall = 0b10000000_10000000_10000000_10000000_10000000
jets = ">>><<><>><<<>><>>><<<>>><<<><<<>><>><<>>"
jets = open("input").read().strip()
rocki = itertools.cycle(rocks)
a = 0b11111111
wall = 0b10000000_10000000_10000000_10000000_10000000
stopped = 0
r = 0
def ceil(n):
if n%8 != 0:
n += 8 - n%8
return n
def drop(a, r, jets):
# start falling
h = a.bit_length() + 8*3
if h % 8 != 0:
h += 8 - h%8
h = ceil(a.bit_length()) + 8*3
numjets = 0
while True:
j = next(jets)
@ -48,27 +47,39 @@ def drop(a, r, jets):
a |= (r<<h)
return a, numjets
def head(a):
h = ceil(a.bit_length())
x = 0
while h >= 8 and x < 0x7f:
h -= 8
x |= (a>>h)&0xff
if x >= 0x7f:
return a>>h
return 0
def height(a):
return ceil(a.bit_length())//8
# Part 1
a = 0b11111111
jeti = itertools.cycle(jets)
rocki = itertools.cycle(rocks)
for _ in range(2022):
r = next(rocki)
a, _ = drop(a,r,jeti)
print(height(a>>8))
# Part 2
a = 0b11111111
wall = 0b10000000_10000000_10000000_10000000_10000000
stopped = 0
jeti = itertools.cycle(jets)
rocki = itertools.cycle(rocks)
i = 0
j = 0
seen = dict()
def head(a):
h = a.bit_length()
h -= h % 8
x = (a>>h)&0xff
while h >= 8 and x != 0x7f:
h -= 8
x |= (a>>h)&0xff
if x == 0x7f:
return a>>h
return 0
import math
def height(a):
return math.ceil(a.bit_length()/8)
try:
while True:
r = next(rocki)
@ -82,17 +93,16 @@ try:
#for i in reversed(range(0,a.bit_length(),8)):
# print("{:08b}".format((a>>i)&0xff))
#print()
b, old = seen[(i,j,head(a))]
sdiff = stopped - old
hdiff = height(a) - height(b)
goal = 1000000000000
rounds, extra = divmod(goal - stopped, sdiff)
h = rounds*hdiff
for _ in range(extra):
finally:
pass #print(i, j, stopped)
b, old = seen[(i,j,head(a))]
sdiff = stopped - old
hdiff = height(a) - height(b)
goal = 1000000000000
rounds, extra = divmod(goal - stopped, sdiff)
for _ in range(extra):
r = next(rocki)
a, n = drop(a,r,jeti)
print(rounds*hdiff + height(a)-1)
finally:
print(i, j, stopped)
print(math.ceil((a>>8).bit_length()/8))
print(rounds*hdiff + height(a)-1)