87 lines
1.9 KiB
Python
87 lines
1.9 KiB
Python
from aoc.input import get_input
|
|
import copy
|
|
import itertools
|
|
import time
|
|
import collections
|
|
import re
|
|
from aoc.partselector import part_one, part_two
|
|
import functools
|
|
|
|
def pw(line):
|
|
return int(line.strip())
|
|
|
|
def p1():
|
|
inp = get_input(pw)
|
|
inp.append(max(inp)+3)
|
|
print(sorted(inp))
|
|
last = 0
|
|
result = { 0: 0, 1: 0, 2:0, 3:0 }
|
|
for sample in sorted(inp):
|
|
result[sample - last] +=1
|
|
last = sample
|
|
print(result)
|
|
print(result[1] * result[3])
|
|
segments = []
|
|
for index, sample in enumerate(sorted(inp)):
|
|
if (sample - last) == 3:
|
|
segments.append(index)
|
|
last = sample
|
|
print(segments)
|
|
|
|
return segments
|
|
|
|
|
|
def p2(segments):
|
|
last = 0
|
|
count = 0
|
|
inp = get_input(pw)
|
|
inp.append(max(inp)+3)
|
|
inp = sorted(inp, reverse=True)
|
|
last = 0
|
|
result = { 0: 0, 1: 0, 2:0, 3:0 }
|
|
lst = [(0, inp)]
|
|
ok = True
|
|
parts = []
|
|
ls = 0
|
|
for segment in segments:
|
|
parts.append(inp[len(inp)-segment:len(inp)-ls])
|
|
ls = segment
|
|
|
|
pcount = []
|
|
lasts = 0
|
|
for part in parts:
|
|
lst = [(lasts, part)]
|
|
lasts = part[0]
|
|
ok = True
|
|
count = 0
|
|
while ok:
|
|
if len(lst) == 0:
|
|
break
|
|
sample = lst.pop()
|
|
last = sample[0]
|
|
newlst = sample[1][:]
|
|
while sample[0] - newlst[-1] >= -3:
|
|
if len(newlst) == 1:
|
|
count +=1
|
|
break
|
|
lst.insert(0, (newlst[-1], newlst[:-1]))
|
|
newlst.pop()
|
|
pcount.append(count)
|
|
print(pcount)
|
|
print(functools.reduce(lambda a,b: a*b, pcount))
|
|
return 0
|
|
|
|
result1 = None
|
|
if part_one():
|
|
start = time.time()
|
|
result1 = p1()
|
|
print(round(1000*(time.time() - start), 2), 'ms')
|
|
|
|
|
|
if part_two():
|
|
start = time.time()
|
|
p2(result1)
|
|
print(round(1000*(time.time() - start), 2), 'ms')
|
|
|
|
|