4 changed files with 118 additions and 0 deletions
@ -0,0 +1,108 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
import sys, math |
||||
|
from itertools import permutations, product |
||||
|
|
||||
|
# +---+---+ |
||||
|
# | ^ | A | |
||||
|
# +---+---+---+ |
||||
|
# | < | v | > | |
||||
|
# +---+---+---+ |
||||
|
DIR = { |
||||
|
'A': (0,2), |
||||
|
'^': (0,1), |
||||
|
'<': (-1,0), |
||||
|
'v': (-1,1), |
||||
|
'>': (-1,2), |
||||
|
} |
||||
|
|
||||
|
# +---+---+---+ |
||||
|
# | 7 | 8 | 9 | |
||||
|
# +---+---+---+ |
||||
|
# | 4 | 5 | 6 | |
||||
|
# +---+---+---+ |
||||
|
# | 1 | 2 | 3 | |
||||
|
# +---+---+---+ |
||||
|
# | 0 | A | |
||||
|
# +---+---+ |
||||
|
NUM = { |
||||
|
# ('A', '0'): ['<'], |
||||
|
# ('A', '1'): ['<^<', '^<<'], |
||||
|
# ('A', '2'): ['<^', '^<'], |
||||
|
# ('A', '3'): ['^'], |
||||
|
# ('A', '4'): ['<^<^', '^<<^', '^^<<', '<^^<'], |
||||
|
# ('A', '5'): ['<^^', '^<^', '^^<'], |
||||
|
# ('A', '6'): ['^^'], |
||||
|
# ('A', '7'): ['^^^<<', '^^<<^', '^<<^^', '^<^<^', '^<^^<'], |
||||
|
# ('A', '8'): ['<^^', '^<^', '^^<'], |
||||
|
# ('A', '9'): ['^^^',], |
||||
|
'A': (0,2), |
||||
|
'0': (0,1), |
||||
|
'1': (1,0), |
||||
|
'2': (1,1), |
||||
|
'3': (1,2), |
||||
|
'4': (2,0), |
||||
|
'5': (2,1), |
||||
|
'6': (2,2), |
||||
|
'7': (3,0), |
||||
|
'8': (3,1), |
||||
|
'9': (3,2), |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def options(start,end, pad): |
||||
|
s, e = pad[start], pad[end] |
||||
|
d = {'^': (1,0), 'v': (-1,0), '>': (0,1), '<': (0,-1)} |
||||
|
dy = e[0]-s[0] |
||||
|
dx = e[1]-s[1] |
||||
|
opt = ['^'] * dy + ['v'] * -dy + ['<'] * -dx + ['>'] * dx |
||||
|
for o in set(permutations(opt)): |
||||
|
s, e = pad[start], pad[end] |
||||
|
gap = False |
||||
|
for step in list(o): |
||||
|
s = s[0] + d[step][0], s[1] + d[step][1] |
||||
|
if s == (0,0): gap = True |
||||
|
if not gap: yield ''.join(o+('A',)) |
||||
|
|
||||
|
|
||||
|
def directional(code): |
||||
|
strings = [''] |
||||
|
prev = 'A' |
||||
|
for key in list(code): |
||||
|
strings = [s1+s2 for (s1,s2) in product(strings,[opt for opt in options(prev, key, DIR)])] |
||||
|
prev = key |
||||
|
return strings |
||||
|
|
||||
|
|
||||
|
def numeric(code): |
||||
|
strings = [''] |
||||
|
prev = 'A' |
||||
|
for key in list(code): |
||||
|
strings = [s1+s2 for (s1,s2) in product(strings,[opt for opt in options(prev, key, NUM)])] |
||||
|
prev = key |
||||
|
return strings |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
codes = [line.strip('\n') for line in open(sys.argv[1])] |
||||
|
res1 = 0 |
||||
|
for code in codes: |
||||
|
length = math.inf |
||||
|
opts = [] |
||||
|
for dirs in sorted(numeric(code),key=len): |
||||
|
for dirs1 in set(directional(dirs)): |
||||
|
for dirs2 in set(directional(dirs1)): |
||||
|
if len(dirs2) <= length: |
||||
|
opts.append(dirs2) |
||||
|
length = len(dirs2) |
||||
|
else: break |
||||
|
|
||||
|
res1 += length * int(code[:-1]) |
||||
|
|
||||
|
# challenge 1 |
||||
|
print(f"challenge 1:\n{res1}\n") |
||||
|
|
||||
|
# challenge 2 |
||||
|
res2 = "" |
||||
|
print(f"challenge 2:\n{res2}") |
||||
|
|
@ -0,0 +1,5 @@ |
|||||
|
029A |
||||
|
980A |
||||
|
179A |
||||
|
456A |
||||
|
379A |
@ -0,0 +1,5 @@ |
|||||
|
985A |
||||
|
540A |
||||
|
463A |
||||
|
671A |
||||
|
382A |
Loading…
Reference in new issue