From e9d5f9747b0262fba780baf63750b2a646bb702c Mon Sep 17 00:00:00 2001 From: Mikael CAPELLE Date: Wed, 14 Dec 2022 09:29:56 +0100 Subject: [PATCH] Add day 14. --- 2022/day14.py | 144 +++++++++++++++++++++++++++++++++++++++++ 2022/inputs/day14.txt | 146 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 2022/day14.py create mode 100644 2022/inputs/day14.txt diff --git a/2022/day14.py b/2022/day14.py new file mode 100644 index 0000000..829893a --- /dev/null +++ b/2022/day14.py @@ -0,0 +1,144 @@ +# -*- encoding: utf-8 -*- + +import sys +from collections import defaultdict +from enum import Enum, auto +from typing import Callable, cast + + +class Cell(Enum): + AIR = auto() + ROCK = auto() + SAND = auto() + + def __str__(self) -> str: + return {Cell.AIR: ".", Cell.ROCK: "#", Cell.SAND: "O"}[self] + + +def print_blocks(blocks: dict[tuple[int, int], Cell]): + """ + Print the given set of blocks on a grid. + + Args: + blocks: Set of blocks to print. + """ + x_min, y_min, x_max, y_max = ( + min(x for x, y in blocks), + 0, + max(x for x, y in blocks), + max(y for x, y in blocks), + ) + + for y in range(y_min, y_max + 1): + print( + "".join(str(blocks.get((x, y), Cell.AIR)) for x in range(x_min, x_max + 1)) + ) + + +def flow( + blocks: dict[tuple[int, int], Cell], + stop_fn: Callable[[int, int], bool], + fill_fn: Callable[[int, int], Cell], +) -> dict[tuple[int, int], Cell]: + """ + Flow sands onto the given set of blocks + + Args: + blocks: Blocks containing ROCK position. Modified in-place. + stop_fn: Function called with the last (assumed) position of a grain of + sand BEFORE adding it to blocks. If the function returns True, the grain + is added and a new one is flowed, otherwise, the whole procedure stops + and the function returns (without adding the final grain). + fill_fn: Function called when the target position of a grain (during the + flowing process) is missing from blocks. + + Returns: + The input blocks. + """ + + y_max = max(y for x, y in blocks) + + while True: + x, y = 500, 0 + + while y <= y_max: + + moved = False + for cx, cy in ((x, y + 1), (x - 1, y + 1), (x + 1, y + 1)): + if (cx, cy) not in blocks and fill_fn(cx, cy) == Cell.AIR: + x, y = cx, cy + moved = True + elif blocks[cx, cy] == Cell.AIR: + x, y = cx, cy + moved = True + + if moved: + break + + if not moved: + break + + if stop_fn(x, y): + break + + blocks[x, y] = Cell.SAND + + return blocks + + +# === inputs === + +lines = sys.stdin.read().splitlines() + +paths: list[list[tuple[int, int]]] = [] +for line in lines: + parts = line.split(" -> ") + paths.append( + [ + cast(tuple[int, int], tuple(int(c.strip()) for c in part.split(","))) + for part in parts + ] + ) + + +blocks: dict[tuple[int, int], Cell] = {} +for path in paths: + for start, end in zip(path[:-1], path[1:]): + x_start = min(start[0], end[0]) + x_end = max(start[0], end[0]) + 1 + y_start = min(start[1], end[1]) + y_end = max(start[1], end[1]) + 1 + + for x in range(x_start, x_end): + for y in range(y_start, y_end): + blocks[x, y] = Cell.ROCK + +print_blocks(blocks) +print() + +x_min, y_min, x_max, y_max = ( + min(x for x, y in blocks), + 0, + max(x for x, y in blocks), + max(y for x, y in blocks), +) + +# === part 1 === + +blocks_1 = flow( + blocks.copy(), stop_fn=lambda x, y: y > y_max, fill_fn=lambda x, y: Cell.AIR +) +print_blocks(blocks_1) +print(f"answer 1 is {sum(v == Cell.SAND for v in blocks_1.values())}") +print() + +# === part 2 === + +blocks_2 = flow( + blocks.copy(), + stop_fn=lambda x, y: x == 500 and y == 0, + fill_fn=lambda x, y: Cell.AIR if y < y_max + 2 else Cell.ROCK, +) +blocks_2[500, 0] = Cell.SAND +print_blocks(blocks_2) +print(f"answer 2 is {sum(v == Cell.SAND for v in blocks_2.values())}") diff --git a/2022/inputs/day14.txt b/2022/inputs/day14.txt new file mode 100644 index 0000000..b786261 --- /dev/null +++ b/2022/inputs/day14.txt @@ -0,0 +1,146 @@ +477,140 -> 481,140 +468,149 -> 472,149 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +465,152 -> 469,152 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +501,140 -> 505,140 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +498,17 -> 503,17 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +492,131 -> 496,131 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +501,116 -> 505,116 +495,122 -> 499,122 +486,131 -> 490,131 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +504,104 -> 504,105 -> 521,105 -> 521,104 +503,70 -> 503,71 -> 518,71 +501,15 -> 506,15 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +504,119 -> 508,119 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +471,146 -> 475,146 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +495,134 -> 499,134 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +498,125 -> 502,125 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +501,122 -> 505,122 +495,140 -> 499,140 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +498,119 -> 502,119 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +498,137 -> 502,137 +474,149 -> 478,149 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +517,90 -> 531,90 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +483,152 -> 487,152 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +483,134 -> 487,134 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +489,134 -> 493,134 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +477,146 -> 481,146 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +462,167 -> 462,168 -> 474,168 -> 474,167 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +474,143 -> 478,143 +497,13 -> 502,13 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +505,17 -> 510,17 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +477,152 -> 481,152 +462,167 -> 462,168 -> 474,168 -> 474,167 +504,104 -> 504,105 -> 521,105 -> 521,104 +489,128 -> 493,128 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +483,140 -> 487,140 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +507,122 -> 511,122 +489,140 -> 493,140 +510,125 -> 514,125 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +480,149 -> 484,149 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +492,125 -> 496,125 +503,70 -> 503,71 -> 518,71 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +462,167 -> 462,168 -> 474,168 -> 474,167 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +491,17 -> 496,17 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +504,125 -> 508,125 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +504,68 -> 504,59 -> 504,68 -> 506,68 -> 506,60 -> 506,68 -> 508,68 -> 508,63 -> 508,68 -> 510,68 -> 510,67 -> 510,68 +486,137 -> 490,137 +502,46 -> 502,48 -> 494,48 -> 494,55 -> 507,55 -> 507,48 -> 506,48 -> 506,46 +462,155 -> 462,157 -> 457,157 -> 457,162 -> 471,162 -> 471,157 -> 465,157 -> 465,155 +529,93 -> 529,95 -> 526,95 -> 526,100 -> 541,100 -> 541,95 -> 533,95 -> 533,93 +504,104 -> 504,105 -> 521,105 -> 521,104 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +471,152 -> 475,152 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +494,15 -> 499,15 +490,43 -> 490,42 -> 490,43 -> 492,43 -> 492,35 -> 492,43 -> 494,43 -> 494,38 -> 494,43 -> 496,43 -> 496,36 -> 496,43 -> 498,43 -> 498,39 -> 498,43 -> 500,43 -> 500,35 -> 500,43 -> 502,43 -> 502,36 -> 502,43 +514,84 -> 514,79 -> 514,84 -> 516,84 -> 516,78 -> 516,84 -> 518,84 -> 518,77 -> 518,84 -> 520,84 -> 520,82 -> 520,84 -> 522,84 -> 522,79 -> 522,84 +492,137 -> 496,137 +480,137 -> 484,137 +520,108 -> 520,110 -> 516,110 -> 516,113 -> 529,113 -> 529,110 -> 525,110 -> 525,108 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30 +482,30 -> 482,23 -> 482,30 -> 484,30 -> 484,20 -> 484,30 -> 486,30 -> 486,26 -> 486,30 -> 488,30 -> 488,23 -> 488,30 -> 490,30 -> 490,20 -> 490,30 -> 492,30 -> 492,25 -> 492,30 -> 494,30 -> 494,29 -> 494,30 -> 496,30 -> 496,24 -> 496,30