Advertisement
eliax1996

Untitled

Dec 11th, 2023
610
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.43 KB | None | 0 0
  1. text = """
  2. .F----7F7F7F7F-7....
  3. .|F--7||||||||FJ....
  4. .||.FJ||||||||L7....
  5. FJL7L7LJLJ||LJ.L-7..
  6. L--J.L7...LJS7F-7L7.
  7. ....F-J..F7FJ|L7L7L7
  8. ....L7.F7||L7|.L7L7|
  9. .....|FJLJ|FJ|F7|.LJ
  10. ....FJL-7.||.||||...
  11. ....L---J.LJ.LJLJ...
  12. """.strip()
  13.  
  14. import sys
  15.  
  16. sys.setrecursionlimit(15000)
  17.  
  18. startPos = None
  19. lines = text.split("\n")
  20.  
  21. for lineN, line in enumerate(lines):
  22.     if "S" in line:
  23.         startPos = (lineN, line.find("S"))
  24.  
  25.  
  26. def next_pos(char, prev, cur):
  27.     match char:
  28.         case "|":
  29.             if cur[0] > prev[0]:
  30.                 return (cur[0] + 1, cur[1])
  31.             else:
  32.                 return (cur[0] - 1, cur[1])
  33.         case "-":
  34.             if cur[1] > prev[1]:
  35.                 return (cur[0], cur[1] + 1)
  36.             else:
  37.                 return (cur[0], cur[1] - 1)
  38.         case "L":
  39.             if prev[0] < cur[0]:
  40.                 return (cur[0], cur[1] + 1)
  41.             else:
  42.                 return (cur[0] - 1, cur[1])
  43.         case "J":
  44.             if prev[0] < cur[0]:
  45.                 return (cur[0], cur[1] - 1)
  46.             else:
  47.                 return (cur[0] - 1, cur[1])
  48.         case "7":
  49.             if prev[0] == cur[0]:
  50.                 return (cur[0] + 1, cur[1])
  51.             else:
  52.                 return (cur[0], cur[1] - 1)
  53.         case "F":
  54.             if prev[0] == cur[0]:
  55.                 return (cur[0] + 1, cur[1])
  56.             else:
  57.                 return (cur[0], cur[1] + 1)
  58.         case _:
  59.             return None
  60.  
  61.  
  62. def traverse(cur, next, visited, final, dist=1):
  63.     if next == final:
  64.         return dist, visited
  65.     if next in visited:
  66.         return None
  67.     visited.add(next)
  68.     tmp = next
  69.     next = next_pos(lines[next[0]][next[1]], cur, next)
  70.     cur = tmp
  71.  
  72.     if next is None:
  73.         return None
  74.  
  75.     if next[0] not in range(0, len(lines)):
  76.         return None
  77.  
  78.     if next[1] not in range(0, len(lines[cur[0]])):
  79.         return None
  80.  
  81.     return traverse(cur, next, visited, final, dist + 1)
  82.  
  83.  
  84. def color_solution(visited, color="S"):
  85.     for x, y in visited:
  86.         lines[x] = lines[x][0:y] + color + lines[x][y + 1:]
  87.  
  88.  
  89. up, up_visited = traverse(startPos, (startPos[0] - 1, startPos[1]), {startPos}, startPos) or (0, {0})
  90. left, left_visited = traverse(startPos, (startPos[0], startPos[1] - 1), {startPos}, startPos) or (0, {0})
  91. low, low_visited = traverse(startPos, (startPos[0] + 1, startPos[1]), {startPos}, startPos) or (0, {0})
  92. right, right_visited = traverse(startPos, (startPos[0], startPos[1] + 1), {startPos}, startPos) or (0, {0})
  93.  
  94. # up_visited.remove(startPos)
  95. # left_visited.remove(startPos)
  96. # low_visited.remove(startPos)
  97. # right_visited.remove(startPos)
  98. distance = max(up, left, low, right)
  99.  
  100. if distance == up:
  101.     color_solution(up_visited)
  102. elif distance == left:
  103.     color_solution(left_visited)
  104. elif distance == low:
  105.     color_solution(low_visited)
  106. else:
  107.     color_solution(right_visited)
  108.  
  109. color_traversed = set()
  110.  
  111. # def color_all_non_internal(x, y):
  112. #     if x not in range(0, len(lines)) or y not in range(0, len(lines[x])):
  113. #         return
  114. #     if (x, y) in color_traversed or (x, y) in up_visited:
  115. #         return
  116. #     color_traversed.add((x, y))
  117. #     color_all_non_internal(x - 1, y)
  118. #     color_all_non_internal(x + 1, y)
  119. #     color_all_non_internal(x, y - 1)
  120. #     color_all_non_internal(x, y + 1)
  121.  
  122.  
  123. # color_solution(color_traversed, "O")
  124.  
  125. for line in lines:
  126.     print(line)
  127.  
  128.  
  129. def s_low(x, y):
  130.     num_s = 0
  131.     for y in range(len(lines[x]) - 1, y, -1):
  132.         if lines[x][y] == "S":
  133.             num_s += 1
  134.  
  135.     return num_s
  136.  
  137.  
  138. def s_up(x, y):
  139.     num_s = 0
  140.     for y in range(y, len(lines[x])):
  141.         if lines[x][y] == "S":
  142.             num_s += 1
  143.  
  144.     return num_s
  145.  
  146.  
  147. def s_left(x, y):
  148.     num_s = 0
  149.     for k in range(x - 1, -1, -1):
  150.         if lines[k][y] == "S":
  151.             num_s += 1
  152.  
  153.     return num_s
  154.  
  155.  
  156. def s_right(x, y):
  157.     num_s = 0
  158.     for k in range(x + 1, len(lines)):
  159.         if lines[k][y] == "S":
  160.             num_s += 1
  161.  
  162.     return num_s
  163.  
  164.  
  165. non_internal = 0
  166. for i, line in enumerate(lines):
  167.     for j, char in enumerate(line):
  168.         if char not in ["O", "S"]:
  169.             s_r = s_right(i, j)
  170.             s_t = s_up(i, j)
  171.             s_b = s_low(i, j)
  172.             s_l = s_left(i, j)
  173.             print((s_r, s_t, s_l, s_b))
  174.             if s_r % 2 != 0 and s_t % 2 != 0 and s_b % 2 != 0 and s_l % 2 != 0:
  175.                 non_internal += 1
  176.  
  177. print(non_internal)
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement