Advertisement
Guest User

Untitled

a guest
Dec 14th, 2024
1,897
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.94 KB | None | 1 0
  1. from collections import defaultdict, deque
  2. from fractions import Fraction
  3. import sys
  4. import hashlib
  5.  
  6. def md5(x):
  7.     return hashlib.md5(str.encode(x)).hexdigest()
  8.  
  9. # sys.stdout.flush()
  10.  
  11. from itertools import permutations, combinations
  12. # permutations(list[, r]) # r-length tuples
  13. # combinations(list, r) # r-length sorted tuples
  14.  
  15. def gcd(x, y):
  16.     while y!=0:
  17.         x,y = y,x%y
  18.     return x
  19.  
  20. def sign(x):
  21.     if x>0:
  22.         return 1
  23.     if x<0:
  24.         return -1
  25.     return 0
  26.  
  27. # take 2d array, reflect horizontally
  28. def reflect(a):
  29.     return [l[::-1] for l in a]
  30.  
  31. # take 2d array, rotate 90 degrees clockwise
  32. def rotate(a):
  33.     n=len(a)
  34.     m=len(a[0])
  35.     return [[a[n-1-j][i] for j in range(n)] for i in range(m)]
  36.  
  37. # dirs in [4, 8]
  38. # returns coordinates of neighbors of (x, y)
  39. # in a grid where 0 <= x < xn, 0 <= y < yn
  40. def neighbor(x, y, dirs, xn=None, yn=None):
  41.     assert dirs in [4, 8]
  42.     ret = []
  43.     if dirs==4:
  44.         dxy = [(-1,0),(0,-1),(1,0),(0,1)]
  45.     else:
  46.         dxy = [(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]
  47.     for dx, dy in dxy:
  48.         nx, ny = x+dx, y+dy
  49.         if xn is not None:
  50.             if nx<0 or nx>=xn:
  51.                 continue
  52.         if yn is not None:
  53.             if ny<0 or ny>=yn:
  54.                 continue
  55.         ret.append((nx,ny))
  56.     return ret
  57.  
  58. # replace every letter of s that is in cs with a space (or anything else)
  59. def strclean(s, cs, to=" "):
  60.     for c in cs:
  61.         s=s.replace(c, to)
  62.     return s
  63.  
  64. # return only integers from a list of strings
  65. def extract_ints(a):
  66.     ret = []
  67.     for x in a:
  68.         try:
  69.             v=int(x)
  70.             ret.append(v)
  71.         except:
  72.             continue
  73.     return ret
  74.  
  75. def isplit(s, delim=None):
  76.     tokens = s.split(delim) if delim is not None else s.split()
  77.     ret = []
  78.     for x in tokens:
  79.         try:
  80.             v = int(x)
  81.             ret.append(v)
  82.         except:
  83.             ret.append(x)
  84.     return ret
  85.  
  86. def grid(dims, val):
  87.     if len(dims)==1:
  88.         return [val for _ in range(dims[0])]
  89.     return [grid(dims[1:], val) for _ in range(dims[0])]
  90.  
  91. dat = """
  92. [REDACTED]
  93. """.strip().split("\n\n")
  94.  
  95. dat2 = """
  96.  
  97. """.strip().split("\n")
  98.  
  99. def solve():
  100.     global dat
  101.     global dat2
  102.     # dat=dat2  # sample test
  103.     a = dat[0].split("\n")
  104.     b = "".join(dat[1].split("\n"))
  105.     ans=0
  106.     n = len(a)
  107.     m = len(a[0])
  108.     for i in range(n):
  109.         a[i] = [c for c in a[i]]
  110.         for j in range(m):
  111.             if a[i][j]=="@":
  112.                 sx=i
  113.                 sy=j
  114.                 a[i][j]="."
  115.                 break
  116.     dx=[0,-1,0,1]
  117.     dy=[-1,0,1,0]
  118.     for mv in b:
  119.         if mv == "^":
  120.             d=1
  121.         elif mv == "<":
  122.             d=0
  123.         elif mv == ">":
  124.             d=2
  125.         else:
  126.             d=3
  127.         k=1
  128.         flag=False
  129.         blocked=False
  130.         while True:
  131.             nx=sx+dx[d]*k
  132.             ny=sy+dy[d]*k
  133.             if a[nx][ny]=="#":
  134.                 blocked=True
  135.                 break
  136.             elif a[nx][ny]==".":
  137.                 flag=True
  138.                 break
  139.             k+=1
  140.         if not blocked:
  141.             a[nx][ny], a[sx+dx[d]][sy+dy[d]] = a[sx+dx[d]][sy+dy[d]], a[nx][ny]
  142.             sx+=dx[d]
  143.             sy+=dy[d]
  144.     ans=0
  145.     for i in range(n):
  146.         for j in range(m):
  147.             if a[i][j]=="O":
  148.                 ans+=100*i+j
  149.     print(ans)
  150.  
  151. def trypush(a, sx, sy, dx, dy):
  152.     nx=sx+dx
  153.     ny=sy+dy
  154.     if a[nx][ny]=="#":
  155.         return False
  156.     elif a[nx][ny]==".":
  157.         return True
  158.     elif dy==0:
  159.         if a[nx][ny]=="]":
  160.             return trypush(a, nx, ny, dx, dy) and trypush(a, nx, ny-1, dx, dy)
  161.         elif a[nx][ny]=="[":
  162.             return trypush(a, nx, ny, dx, dy) and trypush(a, nx, ny+1, dx, dy)
  163.     elif dy==-1: # push left
  164.         if a[nx][ny]=="]":
  165.             return trypush(a, nx, ny-1, dx, dy)
  166.     elif dy==1: # push right
  167.         if a[nx][ny]=="[":
  168.             return trypush(a, nx, ny+1, dx, dy)
  169.  
  170. def push(a, sx, sy, dx, dy):
  171.     nx=sx+dx
  172.     ny=sy+dy
  173.     if a[nx][ny]=="#":
  174.         return
  175.     elif a[nx][ny]==".":
  176.         a[sx][sy], a[nx][ny] = a[nx][ny], a[sx][sy]
  177.         return
  178.     elif dy==0:
  179.         if a[nx][ny]=="]":
  180.             push(a, nx, ny, dx, dy)
  181.             push(a, nx, ny-1, dx, dy)
  182.             a[sx][sy], a[nx][ny] = a[nx][ny], a[sx][sy]
  183.             return
  184.         elif a[nx][ny]=="[":
  185.             push(a, nx, ny, dx, dy)
  186.             push(a, nx, ny+1, dx, dy)
  187.             a[sx][sy], a[nx][ny] = a[nx][ny], a[sx][sy]
  188.             return
  189.     elif dy==-1: # push left
  190.         if a[nx][ny]=="]":
  191.             push(a, nx, ny-1, dx, dy)
  192.             a[nx][ny-1], a[nx][ny], a[sx][sy] = a[nx][ny], a[sx][sy], a[nx][ny-1]
  193.             return
  194.     elif dy==1: # push right
  195.         if a[nx][ny]=="[":
  196.             push(a, nx, ny+1, dx, dy)
  197.             a[nx][ny+1], a[nx][ny], a[sx][sy] = a[nx][ny], a[sx][sy], a[nx][ny+1]
  198.             return
  199.  
  200. def solve2():
  201.     global dat
  202.     global dat2
  203.     # dat=dat2  # sample test
  204.     a = dat[0].split("\n")
  205.     b = "".join(dat[1].split("\n"))
  206.     ans=0
  207.     n = len(a)
  208.     m = len(a[0])*2
  209.     for i in range(n):
  210.         na = []
  211.         for c in a[i]:
  212.             if c=="#":
  213.                 na.append("#")
  214.                 na.append("#")
  215.             elif c=="O":
  216.                 na.append("[")
  217.                 na.append("]")
  218.             elif c==".":
  219.                 na.append(".")
  220.                 na.append(".")
  221.             else:
  222.                 na.append("@")
  223.                 na.append(".")
  224.         a[i] = na
  225.         for j in range(m):
  226.             if a[i][j]=="@":
  227.                 sx=i
  228.                 sy=j
  229.                 a[i][j]="."
  230.     dx=[0,-1,0,1]
  231.     dy=[-1,0,1,0]
  232.     for mv in b:
  233.         if mv == "^":
  234.             d=1
  235.         elif mv == "<":
  236.             d=0
  237.         elif mv == ">":
  238.             d=2
  239.         else:
  240.             d=3
  241.         if trypush(a, sx, sy, dx[d], dy[d]):
  242.             push(a, sx, sy, dx[d], dy[d])
  243.             sx+=dx[d]
  244.             sy+=dy[d]
  245.     ans=0
  246.     for i in range(n):
  247.         for j in range(m):
  248.             if a[i][j]=="[":
  249.                 ans+=100*i+j
  250.     print(ans)
  251.  
  252.  
  253. # solve()
  254. solve2()
  255.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement