add day 12
This commit is contained in:
parent
de5d368eba
commit
ea3a38e8e0
34
12/input.txt
Normal file
34
12/input.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
initial state: ######....##.###.#..#####...#.#.....#..#.#.##......###.#..##..#..##..#.##..#####.#.......#.....##..
|
||||||
|
|
||||||
|
...## => #
|
||||||
|
###.. => .
|
||||||
|
#.#.# => .
|
||||||
|
##### => .
|
||||||
|
....# => .
|
||||||
|
##.## => .
|
||||||
|
##.#. => #
|
||||||
|
##... => #
|
||||||
|
#..#. => #
|
||||||
|
#.#.. => .
|
||||||
|
#.##. => .
|
||||||
|
..... => .
|
||||||
|
##..# => .
|
||||||
|
#..## => .
|
||||||
|
.##.# => #
|
||||||
|
..### => #
|
||||||
|
..#.# => #
|
||||||
|
.#### => #
|
||||||
|
.##.. => .
|
||||||
|
.#..# => #
|
||||||
|
..##. => .
|
||||||
|
#.... => .
|
||||||
|
#...# => .
|
||||||
|
.###. => .
|
||||||
|
..#.. => .
|
||||||
|
####. => #
|
||||||
|
.#.## => .
|
||||||
|
###.# => .
|
||||||
|
#.### => #
|
||||||
|
.#... => #
|
||||||
|
.#.#. => .
|
||||||
|
...#. => .
|
17
12/input_sample.txt
Normal file
17
12/input_sample.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
initial state: #..#.#..##......###...###
|
||||||
|
|
||||||
|
...## => #
|
||||||
|
..#.. => #
|
||||||
|
.#... => #
|
||||||
|
.#.#. => #
|
||||||
|
.#.## => #
|
||||||
|
.##.. => #
|
||||||
|
.#### => #
|
||||||
|
#.#.# => #
|
||||||
|
#.### => #
|
||||||
|
##.#. => #
|
||||||
|
##.## => #
|
||||||
|
###.. => #
|
||||||
|
###.# => #
|
||||||
|
####. => #
|
||||||
|
|
54
12/solve01.py
Executable file
54
12/solve01.py
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
RE_INIT=re.compile(r'^initial state: ([\#\.]+)$')
|
||||||
|
RE_RULE=re.compile(r'^([\#|\.]+) => ([\'#\.])$')
|
||||||
|
|
||||||
|
rules = dict()
|
||||||
|
start = None
|
||||||
|
left_index = 0
|
||||||
|
|
||||||
|
def read_input():
|
||||||
|
with open('input.txt', 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
yield line.strip()
|
||||||
|
|
||||||
|
def run_generation(pots, left_index = 0):
|
||||||
|
result = ""
|
||||||
|
if not pots.startswith('.....'):
|
||||||
|
pots = '....' + pots
|
||||||
|
left_index -= 4
|
||||||
|
if not pots.endswith('....'):
|
||||||
|
pots = pots + '.....'
|
||||||
|
|
||||||
|
for pos in range(2, len(pots) -2):
|
||||||
|
r_key = pots[pos-2:pos+3]
|
||||||
|
if r_key not in rules:
|
||||||
|
rules[r_key] = '.'
|
||||||
|
result = result + rules[r_key]
|
||||||
|
|
||||||
|
return (result, left_index+2)
|
||||||
|
|
||||||
|
|
||||||
|
for line in read_input():
|
||||||
|
m = RE_INIT.match(line)
|
||||||
|
if m:
|
||||||
|
start = m.group(1)
|
||||||
|
continue
|
||||||
|
m = RE_RULE.match(line)
|
||||||
|
if m:
|
||||||
|
rules[m.group(1)] = m.group(2)
|
||||||
|
continue
|
||||||
|
if len(line) == 0:
|
||||||
|
continue
|
||||||
|
raise Execption('unparseable input')
|
||||||
|
|
||||||
|
pots = start
|
||||||
|
|
||||||
|
for g in range(20):
|
||||||
|
(pots, left_index) = run_generation(pots, left_index)
|
||||||
|
print("(g:{})(s:{}): {}".format(g+1, left_index,pots))
|
||||||
|
|
||||||
|
|
||||||
|
print(sum([k+left_index for k,v in enumerate(pots) if v == '#']))
|
75
12/solve02.py
Executable file
75
12/solve02.py
Executable file
@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
RE_INIT=re.compile(r'^initial state: ([\#\.]+)$')
|
||||||
|
RE_RULE=re.compile(r'^([\#|\.]+) => ([\'#\.])$')
|
||||||
|
|
||||||
|
ITER = 50000000000
|
||||||
|
|
||||||
|
rules = dict()
|
||||||
|
start = None
|
||||||
|
|
||||||
|
def read_input():
|
||||||
|
with open('input.txt', 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
yield line.strip()
|
||||||
|
|
||||||
|
def run_generation(pots, left_index = 0):
|
||||||
|
result = ""
|
||||||
|
if not pots.startswith('.....'):
|
||||||
|
pots = '....' + pots
|
||||||
|
left_index -= 4
|
||||||
|
if not pots.endswith('.....'):
|
||||||
|
pots = pots + '.....'
|
||||||
|
|
||||||
|
for pos in range(2, len(pots) -2):
|
||||||
|
r_key = pots[pos-2:pos+3]
|
||||||
|
if r_key not in rules:
|
||||||
|
rules[r_key] = '.'
|
||||||
|
result = result + rules[r_key]
|
||||||
|
|
||||||
|
return (result, left_index+2)
|
||||||
|
|
||||||
|
def analyze_sums(sums, last=10):
|
||||||
|
if len(sums) < last:
|
||||||
|
return None
|
||||||
|
diff = sums[-1] - sums[-2]
|
||||||
|
for i in range(1, last-1):
|
||||||
|
x1 = sums[i*-1]
|
||||||
|
x2 = sums[(i+1)*-1]
|
||||||
|
if diff != (x1 -x2):
|
||||||
|
return None
|
||||||
|
|
||||||
|
return diff
|
||||||
|
|
||||||
|
for line in read_input():
|
||||||
|
m = RE_INIT.match(line)
|
||||||
|
if m:
|
||||||
|
start = m.group(1)
|
||||||
|
continue
|
||||||
|
m = RE_RULE.match(line)
|
||||||
|
if m:
|
||||||
|
rules[m.group(1)] = m.group(2)
|
||||||
|
continue
|
||||||
|
if len(line) == 0:
|
||||||
|
continue
|
||||||
|
raise Execption('unparseable input')
|
||||||
|
|
||||||
|
pots = start
|
||||||
|
left_index = 0
|
||||||
|
g = 0
|
||||||
|
sums = []
|
||||||
|
sums.append((sum([k+left_index for k,v in enumerate(pots) if v == '#'])))
|
||||||
|
while g < ITER:
|
||||||
|
g += 1
|
||||||
|
(pots1, left_index1) = run_generation(pots, left_index)
|
||||||
|
if pots1 == pots:
|
||||||
|
break
|
||||||
|
(pots, left_index) = (pots1, left_index1)
|
||||||
|
print("(g:{})(s:{}): {}".format(g+1, left_index,pots))
|
||||||
|
sums.append((sum([k+left_index for k,v in enumerate(pots) if v == '#'])))
|
||||||
|
diff = analyze_sums(sums)
|
||||||
|
if diff:
|
||||||
|
print(sums[-1]+(diff * (ITER-g)))
|
||||||
|
break
|
Loading…
x
Reference in New Issue
Block a user