Taddeus Kroes il y a 2 ans
Parent
commit
45f56a4bef
2 fichiers modifiés avec 276 ajouts et 0 suppressions
  1. 75 0
      2022/22_path.py
  2. 201 0
      2022/input/22

+ 75 - 0
2022/22_path.py

@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+import sys
+
+def parse(inp):
+    chartlines, pathline = inp.read().split('\n\n')
+    chart = chartlines.split('\n')
+    width = max(map(len, chart)) + 2
+    chart = [' ' + line + ' ' * (width - len(line) - 1) for line in chart]
+    chart = [' ' * width, *chart, ' ' * width]
+
+    path = ''
+    buf = ''
+    for char in pathline:
+        if char.isdigit():
+            buf += char
+        else:
+            path += 'F' * int(buf)
+            buf = ''
+            if char in 'LR':
+                path += char
+
+    return chart, path
+
+def walk(chart, path, teleports={}):
+    w = len(chart[0])
+    h = len(chart)
+    x, y = chart[1].index('.'), 1
+    face = 0
+    for step in path:
+        if step == 'F':
+            dx, dy = ((1, 0), (0, 1), (-1, 0), (0, -1))[face]
+            newx = x + dx
+            newy = y + dy
+            newface = face
+            if (newx, newy, face) in teleports:
+                newx, newy, newface = teleports[(newx, newy, face)]
+            while chart[newy][newx] == ' ':
+                newx = (newx + dx) % w
+                newy = (newy + dy) % h
+            if chart[newy][newx] == '.':
+                x = newx
+                y = newy
+                face = newface
+        elif step == 'L':
+            face = (face + 3) % 4
+        elif step == 'R':
+            face = (face + 1) % 4
+    return 1000 * y + 4 * x + face
+
+RIGHT, DOWN, LEFT, UP = range(4)
+cube_sides = {}
+for y1, y2 in zip(range(1, 51), range(150, 100, -1)):
+    cube_sides[(50, y1, LEFT)] = 1, y2, RIGHT
+    cube_sides[(0, y2, LEFT)] = 51, y1, RIGHT
+    cube_sides[(151, y1, RIGHT)] = 100, y2, LEFT
+    cube_sides[(101, y2, RIGHT)] = 150, y1, LEFT
+for y1, x2 in zip(range(51, 101), range(1, 51)):
+    cube_sides[(50, y1, LEFT)] = x2, 101, DOWN
+    cube_sides[(x2, 100, UP)] = 51, y1, RIGHT
+for x1, y2 in zip(range(51, 101), range(151, 201)):
+    cube_sides[(x1, 0, UP)] = 1, y2, RIGHT
+    cube_sides[(0, y2, LEFT)] = x1, 1, DOWN
+for x1, x2 in zip(range(101, 151), range(1, 51)):
+    cube_sides[(x1, 0, UP)] = x2, 200, UP
+    cube_sides[(x2, 201, DOWN)] = x1, 1, DOWN
+for y1, x2 in zip(range(51, 101), range(101, 151)):
+    cube_sides[(101, y1, RIGHT)] = x2, 50, UP
+    cube_sides[(x2, 51, DOWN)] = 100, y1, LEFT
+for y1, x2 in zip(range(151, 201), range(51, 101)):
+    cube_sides[(51, y1, RIGHT)] = x2, 150, UP
+    cube_sides[(x2, 151, DOWN)] = 50, y1, LEFT
+
+chart, path = parse(sys.stdin)
+print(walk(chart, path))
+print(walk(chart, path, cube_sides))

Fichier diff supprimé car celui-ci est trop grand
+ 201 - 0
2022/input/22


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff