day 12
This commit is contained in:
parent
3684b721d5
commit
c12f177893
|
@ -0,0 +1,71 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
def printstate(state):
|
||||
skeys = state.keys()
|
||||
for key in range(-30, max(skeys) + 1):
|
||||
try:
|
||||
print("#" if state[key] else ".", end="")
|
||||
except KeyError:
|
||||
print(".", end="")
|
||||
print()
|
||||
|
||||
|
||||
def fmtrule(rule):
|
||||
return "".join(["#" if c else "." for c in rule[0]])
|
||||
|
||||
|
||||
def main():
|
||||
state = {}
|
||||
rules = [] # list of ((True, False, True, False, True), True)
|
||||
with open("input.txt") as f:
|
||||
ogstate = f.readline()[15:-1]
|
||||
for i, c in enumerate(ogstate):
|
||||
state[i] = c == "#"
|
||||
f.readline()
|
||||
for line in f.readlines():
|
||||
tf = []
|
||||
for char in line[0:5]:
|
||||
tf.append(char == "#")
|
||||
rules.append((tuple(tf), line[-2] == "#"))
|
||||
|
||||
printstate(state)
|
||||
|
||||
generations = 0
|
||||
while True:
|
||||
newstate = {}
|
||||
statekeys = state.keys()
|
||||
for scankey in range(min(statekeys) - 2, max(statekeys) + 3):
|
||||
for ruleid, rule in enumerate(rules):
|
||||
matches = True
|
||||
for i, oldgenkey in zip(range(0, 5), range(scankey - 2, scankey + 3)):
|
||||
if (oldgenkey not in state and rule[0][i]):
|
||||
matches = False
|
||||
break
|
||||
elif (oldgenkey in state and rule[0][i] != state[oldgenkey]):
|
||||
matches = False
|
||||
break
|
||||
# try:
|
||||
# if state[oldgenkey] != rule[0][i]:
|
||||
# matches = False
|
||||
# print("b1")
|
||||
# break
|
||||
# except KeyError as e:
|
||||
# if rule[0][i]:
|
||||
# print("b2")
|
||||
# matches = False
|
||||
# break
|
||||
if matches and rule[1]:
|
||||
newstate[scankey] = rule[1]
|
||||
break
|
||||
printstate(newstate)
|
||||
state = newstate
|
||||
generations += 1
|
||||
if generations >= 20:
|
||||
break
|
||||
|
||||
print(sum(state.keys()))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
def main():
|
||||
state = {}
|
||||
rules = [] # list of ((True, False, True, False, True), True)
|
||||
with open("input.txt") as f:
|
||||
ogstate = f.readline()[15:-1]
|
||||
for i, c in enumerate(ogstate):
|
||||
state[i] = c == "#"
|
||||
f.readline()
|
||||
for line in f.readlines():
|
||||
tf = []
|
||||
for char in line[0:5]:
|
||||
tf.append(char == "#")
|
||||
|
||||
if line[-2] != "#": # turns out these didn't matter...?
|
||||
continue
|
||||
rules.append((tuple(tf), line[-2] == "#"))
|
||||
|
||||
generations = 0
|
||||
target = 50000000000
|
||||
lastvalues = []
|
||||
lastvalue = 0
|
||||
|
||||
while True:
|
||||
newstate = {}
|
||||
statekeys = state.keys()
|
||||
for scankey in range(min(statekeys) - 2, max(statekeys) + 3):
|
||||
for ruleid, rule in enumerate(rules):
|
||||
matches = True
|
||||
for i, oldgenkey in zip(range(0, 5), range(scankey - 2, scankey + 3)):
|
||||
if (oldgenkey not in state and rule[0][i]):
|
||||
matches = False
|
||||
break
|
||||
elif (oldgenkey in state and rule[0][i] != state[oldgenkey]):
|
||||
matches = False
|
||||
break
|
||||
if matches:
|
||||
newstate[scankey] = rule[1]
|
||||
break
|
||||
state = newstate
|
||||
|
||||
value = sum(state.keys())
|
||||
lastvalues.append(value - lastvalue)
|
||||
lastvalue = value
|
||||
if len(lastvalues) > 5:
|
||||
if len(set(lastvalues)) == 1:
|
||||
print("Convergence on delta", lastvalues[0], "at generation", generations)
|
||||
remaining = target - generations
|
||||
print(value + lastvalues[0] * (remaining - 1))
|
||||
break
|
||||
lastvalues.pop(0)
|
||||
|
||||
generations += 1
|
||||
if generations >= target:
|
||||
break
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -0,0 +1,34 @@
|
|||
initial state: ##.##..#.#....#.##...###.##.#.#..###.#....##.###.#..###...#.##.#...#.#####.###.##..#######.####..#
|
||||
|
||||
.##.. => #
|
||||
#...# => .
|
||||
####. => #
|
||||
##..# => #
|
||||
..##. => .
|
||||
.###. => .
|
||||
..#.# => .
|
||||
##### => .
|
||||
##.#. => #
|
||||
...## => #
|
||||
.#.#. => .
|
||||
##.## => #
|
||||
#.##. => .
|
||||
#.... => .
|
||||
#..## => .
|
||||
..#.. => #
|
||||
.#..# => #
|
||||
.#.## => #
|
||||
...#. => .
|
||||
.#... => #
|
||||
###.# => #
|
||||
#..#. => #
|
||||
.#### => #
|
||||
#.### => #
|
||||
.##.# => #
|
||||
#.#.. => .
|
||||
###.. => #
|
||||
..... => .
|
||||
##... => .
|
||||
....# => .
|
||||
#.#.# => #
|
||||
..### => #
|
Loading…
Reference in New Issue