Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- text = """
- .F----7F7F7F7F-7....
- .|F--7||||||||FJ....
- .||.FJ||||||||L7....
- FJL7L7LJLJ||LJ.L-7..
- L--J.L7...LJS7F-7L7.
- ....F-J..F7FJ|L7L7L7
- ....L7.F7||L7|.L7L7|
- .....|FJLJ|FJ|F7|.LJ
- ....FJL-7.||.||||...
- ....L---J.LJ.LJLJ...
- """.strip()
- import sys
- sys.setrecursionlimit(15000)
- startPos = None
- lines = text.split("\n")
- for lineN, line in enumerate(lines):
- if "S" in line:
- startPos = (lineN, line.find("S"))
- def next_pos(char, prev, cur):
- match char:
- case "|":
- if cur[0] > prev[0]:
- return (cur[0] + 1, cur[1])
- else:
- return (cur[0] - 1, cur[1])
- case "-":
- if cur[1] > prev[1]:
- return (cur[0], cur[1] + 1)
- else:
- return (cur[0], cur[1] - 1)
- case "L":
- if prev[0] < cur[0]:
- return (cur[0], cur[1] + 1)
- else:
- return (cur[0] - 1, cur[1])
- case "J":
- if prev[0] < cur[0]:
- return (cur[0], cur[1] - 1)
- else:
- return (cur[0] - 1, cur[1])
- case "7":
- if prev[0] == cur[0]:
- return (cur[0] + 1, cur[1])
- else:
- return (cur[0], cur[1] - 1)
- case "F":
- if prev[0] == cur[0]:
- return (cur[0] + 1, cur[1])
- else:
- return (cur[0], cur[1] + 1)
- case _:
- return None
- def traverse(cur, next, visited, final, dist=1):
- if next == final:
- return dist, visited
- if next in visited:
- return None
- visited.add(next)
- tmp = next
- next = next_pos(lines[next[0]][next[1]], cur, next)
- cur = tmp
- if next is None:
- return None
- if next[0] not in range(0, len(lines)):
- return None
- if next[1] not in range(0, len(lines[cur[0]])):
- return None
- return traverse(cur, next, visited, final, dist + 1)
- def color_solution(visited, color="S"):
- for x, y in visited:
- lines[x] = lines[x][0:y] + color + lines[x][y + 1:]
- up, up_visited = traverse(startPos, (startPos[0] - 1, startPos[1]), {startPos}, startPos) or (0, {0})
- left, left_visited = traverse(startPos, (startPos[0], startPos[1] - 1), {startPos}, startPos) or (0, {0})
- low, low_visited = traverse(startPos, (startPos[0] + 1, startPos[1]), {startPos}, startPos) or (0, {0})
- right, right_visited = traverse(startPos, (startPos[0], startPos[1] + 1), {startPos}, startPos) or (0, {0})
- # up_visited.remove(startPos)
- # left_visited.remove(startPos)
- # low_visited.remove(startPos)
- # right_visited.remove(startPos)
- distance = max(up, left, low, right)
- if distance == up:
- color_solution(up_visited)
- elif distance == left:
- color_solution(left_visited)
- elif distance == low:
- color_solution(low_visited)
- else:
- color_solution(right_visited)
- color_traversed = set()
- # def color_all_non_internal(x, y):
- # if x not in range(0, len(lines)) or y not in range(0, len(lines[x])):
- # return
- # if (x, y) in color_traversed or (x, y) in up_visited:
- # return
- # color_traversed.add((x, y))
- # color_all_non_internal(x - 1, y)
- # color_all_non_internal(x + 1, y)
- # color_all_non_internal(x, y - 1)
- # color_all_non_internal(x, y + 1)
- # color_solution(color_traversed, "O")
- for line in lines:
- print(line)
- def s_low(x, y):
- num_s = 0
- for y in range(len(lines[x]) - 1, y, -1):
- if lines[x][y] == "S":
- num_s += 1
- return num_s
- def s_up(x, y):
- num_s = 0
- for y in range(y, len(lines[x])):
- if lines[x][y] == "S":
- num_s += 1
- return num_s
- def s_left(x, y):
- num_s = 0
- for k in range(x - 1, -1, -1):
- if lines[k][y] == "S":
- num_s += 1
- return num_s
- def s_right(x, y):
- num_s = 0
- for k in range(x + 1, len(lines)):
- if lines[k][y] == "S":
- num_s += 1
- return num_s
- non_internal = 0
- for i, line in enumerate(lines):
- for j, char in enumerate(line):
- if char not in ["O", "S"]:
- s_r = s_right(i, j)
- s_t = s_up(i, j)
- s_b = s_low(i, j)
- s_l = s_left(i, j)
- print((s_r, s_t, s_l, s_b))
- if s_r % 2 != 0 and s_t % 2 != 0 and s_b % 2 != 0 and s_l % 2 != 0:
- non_internal += 1
- print(non_internal)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement