Added 2018 day 12
This commit is contained in:
parent
dad7e11047
commit
8e1ec78f74
123
2018/day12.py
Normal file
123
2018/day12.py
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
""" https://adventofcode.com/2018/day/5 """
|
||||||
|
|
||||||
|
def readFile():
|
||||||
|
import os.path as p
|
||||||
|
dName = p.dirname(__file__)
|
||||||
|
fName = p.basename(__file__).split(".")[0]
|
||||||
|
|
||||||
|
with open(p.join(dName, "input", f"{fName}.txt"), "r") as f:
|
||||||
|
lines = [line[:-1] for line in f.readlines()]
|
||||||
|
state = list(lines[0][15:])
|
||||||
|
rules = [Rule(line) for line in lines[2:] if line[9] == "#"]
|
||||||
|
return (state, rules)
|
||||||
|
|
||||||
|
def getTest():
|
||||||
|
stateString = "initial state: ...#..#.#..##......###...###..........."
|
||||||
|
ruleStrings = ["...## => #", "..#.. => #", ".#... => #", ".#.#. => #",
|
||||||
|
".#.## => #", ".##.. => #", ".#### => #", "#.#.# => #", "#.### => #",
|
||||||
|
"##.#. => #", "##.## => #", "###.. => #", "###.# => #", "####. => #"]
|
||||||
|
state = list(stateString[15:])
|
||||||
|
rules = [Rule(rule) for rule in ruleStrings]
|
||||||
|
return (state, rules)
|
||||||
|
|
||||||
|
class Rule:
|
||||||
|
def __init__(self, string):
|
||||||
|
self.left = string[:2]
|
||||||
|
self.center = string[2]
|
||||||
|
self.right = string[3:5]
|
||||||
|
self.rule = list(self.left + self.center + self.right)
|
||||||
|
self.result = string[9]
|
||||||
|
|
||||||
|
def compare(self, state):
|
||||||
|
return self.rule == state
|
||||||
|
|
||||||
|
def part1(vals, generations, offset = 0, printGen = False):
|
||||||
|
generation = vals[0]
|
||||||
|
pad = ["."]
|
||||||
|
|
||||||
|
if generation[-1] == "#":
|
||||||
|
generation += [".", "."]
|
||||||
|
elif generation[-2] == "#":
|
||||||
|
generation.append(".")
|
||||||
|
|
||||||
|
if printGen:
|
||||||
|
print(f" 0: {''.join(generation)}")
|
||||||
|
|
||||||
|
for i in range(generations):
|
||||||
|
size = len(generation)
|
||||||
|
cur = ["." for j in range(size)]
|
||||||
|
for j in range(size):
|
||||||
|
if j < 2: # pad left side with empty pods
|
||||||
|
temp = pad*(2 - j) + generation[:(3 + j)]
|
||||||
|
elif j > size - 3: # pad right side with empty pods
|
||||||
|
diff = size - j
|
||||||
|
temp = generation[(size-2-diff):] + pad*(3-diff)
|
||||||
|
else:
|
||||||
|
temp = generation[j-2:j+3]
|
||||||
|
|
||||||
|
for rule in vals[1]:
|
||||||
|
if rule.compare(temp):
|
||||||
|
cur[j] = rule.result
|
||||||
|
break
|
||||||
|
|
||||||
|
if cur[-1] == "#":
|
||||||
|
cur += [".", "."]
|
||||||
|
elif cur[-2] == "#":
|
||||||
|
cur.append(".")
|
||||||
|
|
||||||
|
generation = cur
|
||||||
|
|
||||||
|
if printGen:
|
||||||
|
print(f"{i + 1 if i + 1 > 9 else f' {i + 1}'}: {''.join(generation)}")
|
||||||
|
|
||||||
|
return sum(i - offset for i in range(len(generation)) if generation[i] == "#")
|
||||||
|
|
||||||
|
def part2(vals, generations, offset = 0):
|
||||||
|
generation = vals[0]
|
||||||
|
pad = ["."]
|
||||||
|
|
||||||
|
genSum = sum(i - offset for i in range(len(generation)) if generation[i] == "#")
|
||||||
|
|
||||||
|
if generation[-1] == "#":
|
||||||
|
generation += [".", "."]
|
||||||
|
elif generation[-2] == "#":
|
||||||
|
generation.append(".")
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while True:
|
||||||
|
i += 1
|
||||||
|
size = len(generation)
|
||||||
|
cur = ["." for j in range(size)]
|
||||||
|
for j in range(size):
|
||||||
|
if j < 2: # pad left side with empty pods
|
||||||
|
temp = pad*(2 - j) + generation[:(3 + j)]
|
||||||
|
elif j > size - 3: # pad right side with empty pods
|
||||||
|
diff = size - j
|
||||||
|
temp = generation[(size-2-diff):] + pad*(3-diff)
|
||||||
|
else:
|
||||||
|
temp = generation[j-2:j+3]
|
||||||
|
|
||||||
|
for rule in vals[1]:
|
||||||
|
if rule.compare(temp):
|
||||||
|
cur[j] = rule.result
|
||||||
|
break
|
||||||
|
|
||||||
|
if cur[-1] == "#":
|
||||||
|
cur += [".", "."]
|
||||||
|
elif cur[-2] == "#":
|
||||||
|
cur.append(".")
|
||||||
|
|
||||||
|
generation = cur
|
||||||
|
|
||||||
|
curSum = sum(i - offset for i in range(len(cur)) if cur[i] == "#")
|
||||||
|
if curSum - genSum == 52:
|
||||||
|
break
|
||||||
|
genSum = curSum
|
||||||
|
|
||||||
|
return curSum + 52*(generations - i)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(f"Test: {part1(getTest(), generations=20, offset=3, printGen=True)}")
|
||||||
|
vals = readFile()
|
||||||
|
print(f"Part 1: {part1(vals, generations=20)}")
|
||||||
|
print(f"Part 2: {part2(vals, generations=5*10**10)}")
|
34
2018/input/day12.txt
Normal file
34
2018/input/day12.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
initial state: ###.......##....#.#.#..###.##..##.....#....#.#.....##.###...###.#...###.###.#.###...#.####.##.#....#
|
||||||
|
|
||||||
|
..... => .
|
||||||
|
#..## => .
|
||||||
|
..### => #
|
||||||
|
..#.# => #
|
||||||
|
.#.#. => .
|
||||||
|
####. => .
|
||||||
|
##.## => #
|
||||||
|
#.... => .
|
||||||
|
#...# => .
|
||||||
|
...## => .
|
||||||
|
##..# => .
|
||||||
|
.###. => #
|
||||||
|
##### => #
|
||||||
|
#.#.. => #
|
||||||
|
.##.. => #
|
||||||
|
.#.## => .
|
||||||
|
...#. => #
|
||||||
|
#.##. => #
|
||||||
|
..#.. => #
|
||||||
|
##... => #
|
||||||
|
....# => .
|
||||||
|
###.# => #
|
||||||
|
#..#. => #
|
||||||
|
#.### => #
|
||||||
|
##.#. => .
|
||||||
|
###.. => #
|
||||||
|
.#### => .
|
||||||
|
.#... => #
|
||||||
|
..##. => .
|
||||||
|
.##.# => .
|
||||||
|
#.#.# => #
|
||||||
|
.#..# => .
|
Loading…
x
Reference in New Issue
Block a user