Solve 2018 day 12
This commit is contained in:
parent
26f523047e
commit
f04f8ed426
138
2018/d12.py
138
2018/d12.py
@ -1,53 +1,12 @@
|
||||
from lib import *
|
||||
|
||||
data = """initial state: #..#.#..##......###...###
|
||||
|
||||
...## => #
|
||||
..#.. => #
|
||||
.#... => #
|
||||
.#.#. => #
|
||||
.#.## => #
|
||||
.##.. => #
|
||||
.#### => #
|
||||
#.#.# => #
|
||||
#.### => #
|
||||
##.#. => #
|
||||
##.## => #
|
||||
###.. => #
|
||||
###.# => #
|
||||
####. => #"""
|
||||
def score(state, offset):
|
||||
r = 0
|
||||
for i in range(len(state)):
|
||||
if state[i] == "#":
|
||||
r += i + offset
|
||||
return r
|
||||
|
||||
|
||||
all = """
|
||||
|
||||
|
||||
1 2 3
|
||||
0 0 0 0
|
||||
0: ...#..#.#..##......###...###...........
|
||||
1: ...#...#....#.....#..#..#..#...........
|
||||
2: ...##..##...##....#..#..#..##..........
|
||||
3: ..#.#...#..#.#....#..#..#...#..........
|
||||
4: ...#.#..#...#.#...#..#..##..##.........
|
||||
5: ....#...##...#.#..#..#...#...#.........
|
||||
6: ....##.#.#....#...#..##..##..##........
|
||||
7: ...#..###.#...##..#...#...#...#........
|
||||
8: ...#....##.#.#.#..##..##..##..##.......
|
||||
9: ...##..#..#####....#...#...#...#.......
|
||||
10: ..#.#..#...#.##....##..##..##..##......
|
||||
11: ...#...##...#.#...#.#...#...#...#......
|
||||
12: ...##.#.#....#.#...#.#..##..##..##.....
|
||||
13: ..#..###.#....#.#...#....#...#...#.....
|
||||
14: ..#....##.#....#.#..##...##..##..##....
|
||||
15: ..##..#..#.#....#....#..#.#...#...#....
|
||||
16: .#.#..#...#.#...##...#...#.#..##..##...
|
||||
17: ..#...##...#.#.#.#...##...#....#...#...
|
||||
18: ..##.#.#....#####.#.#.#...##...##..##..
|
||||
19: .#..###.#..#.#.#######.#.#.#..#.#...#..
|
||||
20: .#....##....#####...#######....#.#..##.
|
||||
"""
|
||||
|
||||
|
||||
def part_1(data):
|
||||
def solve(data, target_i):
|
||||
state = None
|
||||
map = {}
|
||||
for line in data.splitlines():
|
||||
@ -60,72 +19,41 @@ def part_1(data):
|
||||
map[lhs] = rhs
|
||||
|
||||
assert state is not None
|
||||
offset = 50
|
||||
state = "." * offset + state + "." * offset
|
||||
for i in range(20):
|
||||
ns = ".."
|
||||
seen = {}
|
||||
offset = 0
|
||||
for i in range(target_i):
|
||||
while not state.startswith("...."):
|
||||
state = "." + state
|
||||
offset -= 1
|
||||
while not state.endswith("...."):
|
||||
state += "."
|
||||
|
||||
if state in seen:
|
||||
prev_i, prev_score = seen[state]
|
||||
assert (i - prev_i) == 1
|
||||
current_score = score(state, offset)
|
||||
delta_score = current_score - prev_score
|
||||
final_score = current_score + (target_i - i) * delta_score
|
||||
print(final_score)
|
||||
return
|
||||
else:
|
||||
seen[state] = (i, score(state, offset))
|
||||
|
||||
ns = ""
|
||||
for i in range(2, len(state) - 2):
|
||||
s = state[i - 2:i + 3]
|
||||
s = state[i - 2 : i + 3]
|
||||
ns += map[s]
|
||||
ns += ".."
|
||||
state = ns
|
||||
|
||||
r = 0
|
||||
for i in range(2, len(state) - 2):
|
||||
if state[i] == "#":
|
||||
r += (i - offset)
|
||||
print(r)
|
||||
|
||||
|
||||
def part_2(data):
|
||||
state = None
|
||||
map = {}
|
||||
for line in data.splitlines():
|
||||
if "initial state" in line:
|
||||
_, rest = line.split(":")
|
||||
state = rest.strip()
|
||||
if "=>" in line:
|
||||
lhs, rhs = line.split(" => ")
|
||||
assert lhs not in map
|
||||
map[lhs] = rhs
|
||||
|
||||
assert state is not None
|
||||
offset = 55
|
||||
state = "." * offset + state + offset * ".."
|
||||
for i in range(100):
|
||||
# if state.startswith("..."):
|
||||
# assert False
|
||||
# elif state.startswith("..#"):
|
||||
# pass
|
||||
# elif state.startswith(".#"):
|
||||
# state = "." + state
|
||||
# offset += 1
|
||||
# elif state.startswith("#"):
|
||||
# state = ".." + state
|
||||
# offset += 2
|
||||
print(state)
|
||||
|
||||
ns = ".."
|
||||
for i in range(2, len(state) - 2):
|
||||
s = state[i - 2:i + 3]
|
||||
ns += map[s]
|
||||
ns += ".."
|
||||
state = ns
|
||||
# print(state)
|
||||
|
||||
r = 0
|
||||
for i in range(2, len(state) - 2):
|
||||
if state[i] == "#":
|
||||
r += (i - offset)
|
||||
print(r)
|
||||
offset += 2
|
||||
print(score(state, offset))
|
||||
|
||||
|
||||
def main():
|
||||
input_file = __file__.replace(".py", ".txt")
|
||||
with open(input_file) as f:
|
||||
data = f.read()
|
||||
part_1(data)
|
||||
part_2(data)
|
||||
solve(data, 20)
|
||||
solve(data, 50 * 10**9)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
Loading…
Reference in New Issue
Block a user