Advertisement
Guest User

AoC2022 Day 22

a guest
Dec 22nd, 2022
587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.65 KB | Source Code | 0 0
  1. #!/bin/python3
  2.  
  3. from io import StringIO
  4. import re
  5.  
  6. testdata = """        ...#
  7.        .#..
  8.        #...
  9.        ....
  10. ...#.......#
  11. ........#...
  12. ..#....#....
  13. ..........#.
  14.        ...#....
  15.        .....#..
  16.        .#......
  17.        ......#.
  18.  
  19. 10R5L5R10L4R5L5"""
  20.  
  21. moves = None
  22. field = []
  23.  
  24. joins = {}
  25.  
  26. def join(edge1, edge2, dir1, dir2):
  27.     r1 = iter(edge1)
  28.     r2 = iter(edge2)
  29.     while True:
  30.         try:
  31.             p1 = next(r1)
  32.             p2 = next(r2)
  33.         except StopIteration:
  34.             break
  35.         joins[(p1,dir1)] = (p2,dir2)
  36.         joins[(p2,(dir2+2)%4)] = (p1,(dir1+2)%4)
  37.  
  38.  
  39. def ground(pos):
  40.     return field[pos[0]][pos[1]]
  41.  
  42. def neigh(pos,dir):
  43.     if (pos,dir) in joins:
  44.         return joins[(pos,dir)]
  45.     w = len(field[0])
  46.     h = len(field)
  47.     if dir==0: #right
  48.         return ((pos[0],(pos[1]+1)%w), dir)
  49.     elif dir==1: #down
  50.         return (((pos[0]+1)%h,pos[1]), dir)
  51.     elif dir==2: #left
  52.         return ((pos[0], (pos[1]-1)%w), dir)
  53.     elif dir==3: #up
  54.         return (((pos[0]-1)%h,pos[1]), dir)
  55.     else: #default
  56.         return (pos, dir)
  57.  
  58. def move(pos,dir):
  59.     n, ndir = neigh(pos,dir)
  60.     if ground(n) == " ":
  61.         while ground(n) == " ":
  62.             n, ndir = neigh(n,ndir)
  63.  
  64.     if ground(n) == ".":
  65.         return (n, ndir)
  66.     elif ground(n) == "#":
  67.         return (pos, dir)
  68.  
  69.  
  70. with open("day22-input.txt",'r') as f:
  71. #with StringIO(testdata) as f:
  72.     while l := f.readline():
  73.         if l[0] == '\n':
  74.             continue
  75.         elif l[0].isnumeric():
  76.             moves_orig = l
  77.         else:
  78.             field.append(l[:-1])
  79.  
  80. width = max(map(len, field))
  81. field = [" "*(width+2), *[f" {l}".ljust(width+2) for l in field], " "*(width+2)]
  82.  
  83. start = (1, field[1].find('.'))
  84. pos = start
  85. moves = moves_orig
  86. dir = 0
  87.  
  88. while m := re.match(r"(\d+)(.*)", moves):
  89.     moves = m.group(2)
  90.     for _ in range(int(m.group(1))):
  91.         pos, dir = move(pos,dir)
  92.     if m:= re.match(r"([RL])(.*)", moves):
  93.         moves = m.group(2)
  94.         if m.group(1) == "R":
  95.             dir = (dir+1)%4
  96.         elif m.group(1) == "L":
  97.             dir = (dir-1)%4
  98.         else:
  99.             raise Exception(f"Unknown direction token: {m.group(1)}")
  100.     else:
  101.         print(f"No more direction tokens, remaining string: '{moves}'")
  102.  
  103. print(dir, pos)
  104. print(1000*pos[0]+4*pos[1]+dir)
  105.  
  106. # join to cube (hardcoded)
  107.  
  108. #       a    b
  109. #     f        c
  110. #            d
  111. #     g    d
  112. #   g
  113. # f        c
  114. #        e
  115. # a    e
  116. #   b
  117.  
  118. #a
  119. join([(1, x) for x in range(51,101)], [(y, 1) for y in range(151,201)], 3, 0)
  120. #b
  121. join([(1, x) for x in range(101,151)], [(200, x) for x in range(1,51)], 3, 3)
  122. #c
  123. join([(y, 150) for y in range(1,51)], [(y, 100) for y in range(150,100,-1)], 0, 2)
  124. #d
  125. join([(50, x) for x in range(101,151)], [(y, 100) for y in range(51,101)], 1, 2)
  126. #e
  127. join([(150, x) for x in range(51,101)], [(y, 50) for y in range(151,201)], 1, 2)
  128. #f
  129. join([(y, 1) for y in range(101,151)], [(y, 51) for y in range(50,0,-1)], 2, 0)
  130. #g
  131. join([(101, x) for x in range(1,51)], [(y, 51) for y in range(51,101)], 3, 0)
  132.  
  133.  
  134. pos = start
  135. dir=0
  136. moves = moves_orig
  137.  
  138. while m := re.match(r"(\d+)(.*)", moves):
  139.     moves = m.group(2)
  140.     for _ in range(int(m.group(1))):
  141.         pos, dir = move(pos,dir)
  142.     if m:= re.match(r"([RL])(.*)", moves):
  143.         moves = m.group(2)
  144.         if m.group(1) == "R":
  145.             dir = (dir+1)%4
  146.         elif m.group(1) == "L":
  147.             dir = (dir-1)%4
  148.         else:
  149.             raise Exception(f"Unknown direction token: {m.group(1)}")
  150.     else:
  151.         print(f"No more direction tokens, remaining string: '{moves}'")
  152.  
  153. print(dir, pos)
  154. print(1000*pos[0]+4*pos[1]+dir)
Tags: AoC2022
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement