You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
2.5 KiB
148 lines
2.5 KiB
4 years ago
|
#!/usr/bin/env python
|
||
|
|
||
|
from aoc import get_input # AoC
|
||
|
import re # regex:
|
||
|
from itertools import permutations as per
|
||
|
from itertools import combinations as co
|
||
|
from functools import lru_cache
|
||
|
|
||
|
|
||
|
minjolt, maxjolt = 1, 3
|
||
|
|
||
|
jolts = sorted(list(map(int, get_input(10).splitlines())))
|
||
|
|
||
|
jolts.insert(0, 0) # first one is allways 0
|
||
|
jolts.append( max(jolts)+3 ) # my adapter, allways higher than the highest by 3
|
||
|
|
||
|
# used = []
|
||
|
|
||
|
# def getBest(i, jolts):
|
||
|
# num = jolts[i]
|
||
|
|
||
|
# diffs = []
|
||
|
# for i in range(len(jolts)):
|
||
|
|
||
|
# if( i > 0 ):
|
||
|
# bestdiff = jolts[i] - jolts[i-1]
|
||
|
# diffs.append(bestdiff)
|
||
|
|
||
|
# diff1, diff3 = diffs.count(1), diffs.count(3)
|
||
|
# part1 = diff1 * diff3
|
||
|
# print(part1)
|
||
|
|
||
|
|
||
|
# part 2
|
||
|
|
||
|
def validateJolts(combo, rng):
|
||
|
valid = True
|
||
|
for i in range(len(combo)):
|
||
|
if( i > 0 ):
|
||
|
num1, num2 = combo[i-1], combo[i]
|
||
|
if( not (num2 - num1) in rng ):
|
||
|
valid = False
|
||
|
return valid
|
||
|
|
||
|
|
||
|
# def getNextJolt(num, diff, jolts):
|
||
|
# for jolt in jolts:
|
||
|
# if( jolt != num ):
|
||
|
# if( jolt - diff == num ):
|
||
|
# return jolt
|
||
|
|
||
|
|
||
|
# def genCombo(jolts, i=0, diff=1, newcombo = [0]):
|
||
|
# # first one is allways 0 and last is allways last+3
|
||
|
# # sorted list so this works
|
||
|
|
||
|
# nextjolt = getNextJolt(newcombo[i], diff, jolts)
|
||
|
|
||
|
# if(nextjolt):
|
||
|
# newcombo.append(nextjolt)
|
||
|
|
||
|
# genCombo(jolts, i+1, diff, newcombo)
|
||
|
# else:
|
||
|
# return newcombo
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
# print(genCombo(jolts))
|
||
|
|
||
|
#cache = []
|
||
|
|
||
|
@lru_cache
|
||
|
def countCombos(i, count=0):
|
||
|
num = jolts[i]
|
||
|
|
||
|
if( num != max(jolts) ):
|
||
|
for diff in range(1, 4):
|
||
|
if((num + diff) in jolts):
|
||
|
index = jolts.index(num + diff)
|
||
|
print("####", count, diff, index)
|
||
|
count += countCombos( index )
|
||
|
|
||
|
return count
|
||
|
|
||
|
else:
|
||
|
print("end")
|
||
|
return 1
|
||
|
|
||
|
|
||
|
|
||
|
count = countCombos(0)
|
||
|
print("####################", count)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
# print("gen combos")
|
||
|
# combos = per(jolts)
|
||
|
# print("done")
|
||
|
# print(combos)
|
||
|
|
||
|
# #print("getting len")
|
||
|
# combolen = 2 ** len(jolts)
|
||
|
# #print("done", combolen)
|
||
|
|
||
|
# cache = []
|
||
|
|
||
|
# actual = []
|
||
|
# i = 0
|
||
|
# for combo in combos:
|
||
|
# if( not combo in cache ):
|
||
|
# print("Checking", f"{i}/{combolen} actual:{len(actual)}", end="\r" )
|
||
|
# cache.append(combo)
|
||
|
# validcheck = validateJolts(combo, range(1, 4))
|
||
|
# if( validcheck ):
|
||
|
# actual.append(combo)
|
||
|
|
||
|
# i += 1
|
||
|
|
||
|
# #test = validateJolts(combos[2], range(1, 4))
|
||
|
# #print(test, combos[2])
|
||
|
|
||
|
# print("")
|
||
|
# print(len(actual))
|
||
|
|
||
|
# # listlen = len(jolts)
|
||
|
# # print(2 ** listlen)
|