From d60f6dc50ea3ea7066fc5e267076276939e2cbc2 Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Sun, 11 Dec 2022 13:48:39 +0100 Subject: Day 9 [WIP] --- aoc/__main__.py | 58 +- aoc/template/__init__.py | 16 + aoc/template/example.txt | 0 aoc/template/input.txt | 0 day9/__init__.py | 108 +++ day9/example.txt | 8 + day9/input.txt | 2000 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 2173 insertions(+), 17 deletions(-) create mode 100644 aoc/template/__init__.py create mode 100644 aoc/template/example.txt create mode 100644 aoc/template/input.txt create mode 100644 day9/__init__.py create mode 100644 day9/example.txt create mode 100644 day9/input.txt diff --git a/aoc/__main__.py b/aoc/__main__.py index 337bdfe..e1b2a85 100644 --- a/aoc/__main__.py +++ b/aoc/__main__.py @@ -2,8 +2,10 @@ import argparse import importlib import os +from pathlib import Path +from shutil import copytree from time import perf_counter -from typing import List +from typing import List, Callable def day(assignment_part: str) -> str: @@ -17,8 +19,41 @@ def kwargs(kwarg: str) -> List: return kwarg.split("=") +def run(args: argparse.Namespace): + assignment_day = importlib.import_module(args.day) + + Assignment = getattr(assignment_day, f"Assignment{args.part}") + assignment = Assignment( + path=os.path.dirname(assignment_day.__file__), **dict(args.kwargs) + ) + + start = perf_counter() + print( + assignment.run( + input=assignment.read_input(example=args.example), + ) + ) + end = perf_counter() + delta = end - start + print() + print(f'{(delta if delta > 1 else delta * 1000):.3f}{"s" if delta > 1 else "ms"}') + + +def new(args: argparse.Namespace): + self = importlib.import_module(".", package="aoc") + path = Path(self.__file__) + template = path.parent.joinpath("template") + target = path.parent.parent.joinpath(args.day) + + try: + copytree(template, target) + except FileExistsError: + print(f"{args.day} already exists") + + parser = argparse.ArgumentParser(description="Advent of Code") +parser.add_argument("command", type=str, choices=["run", "new"]) parser.add_argument("day", type=str, help="Assignment day") parser.add_argument( "-p", @@ -34,20 +69,9 @@ parser.add_argument("kwargs", type=kwargs, nargs="*") if __name__ == "__main__": args = parser.parse_args() - assignment_day = importlib.import_module(args.day) - - Assignment = getattr(assignment_day, f"Assignment{args.part}") - assignment = Assignment( - path=os.path.dirname(assignment_day.__file__), **dict(args.kwargs) - ) - start = perf_counter() - print( - assignment.run( - input=assignment.read_input(example=args.example), - ) - ) - end = perf_counter() - delta = end - start - print() - print(f'{(delta if delta > 1 else delta * 1000):.3f}{"s" if delta > 1 else "ms"}') + match args.command: + case "run": + run(args) + case "new": + new(args) diff --git a/aoc/template/__init__.py b/aoc/template/__init__.py new file mode 100644 index 0000000..05b2b45 --- /dev/null +++ b/aoc/template/__init__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from abc import ABC + +from aoc import BaseAssignment + + +class Assignment(BaseAssignment, ABC): + pass + + +class AssignmentOne(Assignment): + pass + + +class AssignmentTwo(Assignment): + pass diff --git a/aoc/template/example.txt b/aoc/template/example.txt new file mode 100644 index 0000000..e69de29 diff --git a/aoc/template/input.txt b/aoc/template/input.txt new file mode 100644 index 0000000..e69de29 diff --git a/day9/__init__.py b/day9/__init__.py new file mode 100644 index 0000000..afa44aa --- /dev/null +++ b/day9/__init__.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +from abc import ABC +from copy import copy +from dataclasses import dataclass +from typing import Tuple, Iterator, List + +from aoc import BaseAssignment + + +@dataclass +class Coordinate: + x: int + y: int + + def __hash__(self): + return tuple([self.x, self.y]).__hash__() + + def __sub__(self, other: "Coordinate"): + return Coordinate(self.x - other.x, self.y - other.y) + + @property + def polarity_x(self): + try: + return abs(self.x) / self.x + except ZeroDivisionError: + return 0 + + @property + def polarity_y(self): + try: + return abs(self.y) / self.y + except ZeroDivisionError: + return 0 + + +class Assignment(BaseAssignment, ABC): + def parse_line(self, item: str) -> Tuple[str, int]: + direction, amount = item.split(" ") + return direction, int(amount) + + def move(self, direction: str, amount: int): + pass + + @staticmethod + def next_head(head: Coordinate, direction: str): + match direction: + case "R": + head.x += 1 + case "L": + head.x -= 1 + case "U": + head.y += 1 + case "D": + head.y -= 1 + + @staticmethod + def next_tail(head: Coordinate, tail: Coordinate): + delta = head - tail + + if abs(delta.x) > 1 and delta.y == 0: + tail.x += delta.x - delta.polarity_x + if abs(delta.x) > 1 and abs(delta.y) == 1: + tail.x += delta.x - delta.polarity_x + tail.y += delta.y + if abs(delta.y > 1) and delta.x == 0: + tail.y += delta.y - delta.polarity_y + if abs(delta.y) > 1 and abs(delta.x) == 1: + tail.y += delta.y - delta.polarity_y + tail.x += delta.x + + def tail_positions(self, input: Iterator[str]) -> Iterator[Coordinate]: + head = Coordinate(0, 0) + tail = Coordinate(0, 0) + + for line in input: + direction, amount = self.parse_line(line) + + for _ in range(amount): + self.next_head(head, direction) + self.next_tail(head, tail) + yield tail + + +class AssignmentOne(Assignment): + example_result = 13 + + def run(self, input: Iterator) -> int: + unique_tail_positions = set() + + for position in self.tail_positions(input): + unique_tail_positions.add(copy(position)) + + print(unique_tail_positions) + + for y in range(5): + items = [] + for x in range(6): + if Coordinate(x, y) in unique_tail_positions: + items.append("#") + else: + items.append(".") + print("".join(items)) + + return len(unique_tail_positions) + + +class AssignmentTwo(Assignment): + pass diff --git a/day9/example.txt b/day9/example.txt new file mode 100644 index 0000000..9874df2 --- /dev/null +++ b/day9/example.txt @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/day9/input.txt b/day9/input.txt new file mode 100644 index 0000000..3da93c3 --- /dev/null +++ b/day9/input.txt @@ -0,0 +1,2000 @@ +L 2 +U 2 +L 1 +D 1 +U 1 +L 2 +R 2 +D 1 +U 2 +D 1 +R 2 +U 1 +L 2 +D 2 +L 2 +R 2 +L 2 +R 1 +L 2 +D 1 +U 1 +L 2 +U 1 +D 1 +R 2 +L 1 +R 1 +L 2 +U 2 +D 2 +U 1 +D 2 +R 1 +D 1 +R 2 +L 2 +D 1 +L 1 +U 2 +R 2 +L 2 +U 2 +D 1 +U 2 +D 2 +R 1 +U 2 +L 2 +D 2 +U 2 +D 2 +L 2 +R 1 +L 2 +D 2 +U 1 +R 2 +U 2 +L 1 +D 2 +R 2 +L 2 +R 1 +L 2 +D 1 +R 2 +L 2 +R 1 +L 2 +D 1 +U 1 +L 1 +D 1 +R 2 +D 1 +L 1 +D 1 +R 1 +D 1 +U 2 +R 1 +L 1 +U 2 +L 2 +D 2 +L 1 +U 1 +D 1 +L 1 +U 1 +D 1 +U 1 +R 2 +L 2 +U 2 +R 2 +L 2 +D 2 +U 1 +L 1 +R 1 +U 2 +R 1 +D 2 +R 1 +L 2 +R 2 +U 2 +D 2 +R 1 +U 2 +L 2 +R 1 +L 2 +D 3 +L 3 +D 3 +L 3 +U 3 +D 2 +R 2 +D 3 +L 1 +R 2 +D 2 +R 2 +D 3 +U 3 +D 1 +R 2 +D 3 +L 1 +D 1 +L 1 +D 3 +R 2 +U 2 +D 3 +R 2 +U 2 +D 2 +L 2 +U 1 +R 3 +U 2 +D 3 +U 1 +R 2 +D 2 +U 2 +D 1 +R 2 +D 2 +R 3 +L 1 +R 1 +L 1 +D 2 +U 3 +R 2 +U 2 +L 1 +R 1 +U 3 +L 3 +D 2 +R 2 +L 1 +U 2 +R 3 +D 3 +U 2 +D 3 +R 2 +U 2 +D 2 +L 1 +D 3 +U 1 +L 2 +R 2 +L 2 +R 1 +L 1 +R 3 +L 2 +U 1 +D 2 +U 2 +L 2 +U 2 +L 3 +U 2 +D 3 +U 1 +L 3 +D 3 +U 2 +D 2 +L 1 +U 2 +D 2 +L 3 +D 3 +R 2 +L 1 +U 3 +L 3 +D 2 +L 2 +R 2 +D 1 +L 2 +D 1 +R 2 +L 1 +U 3 +R 2 +L 3 +R 1 +L 1 +R 3 +L 2 +R 2 +U 2 +D 4 +L 3 +U 3 +L 4 +U 2 +L 2 +U 3 +R 2 +U 4 +R 1 +U 3 +R 1 +U 4 +L 3 +R 4 +L 4 +U 3 +D 1 +R 2 +D 4 +U 1 +D 3 +R 2 +U 2 +R 1 +L 4 +R 2 +L 3 +U 4 +D 4 +R 4 +U 1 +R 2 +D 3 +U 1 +L 1 +U 3 +L 1 +R 1 +U 2 +R 4 +D 2 +U 1 +D 3 +U 4 +L 1 +U 1 +R 2 +U 4 +L 1 +R 2 +L 1 +D 4 +L 3 +R 1 +L 2 +R 1 +U 3 +R 3 +D 2 +R 2 +L 2 +D 1 +U 4 +R 2 +U 2 +L 1 +R 2 +U 3 +L 2 +D 3 +U 2 +D 3 +U 4 +D 2 +R 3 +U 1 +D 2 +R 1 +D 2 +R 3 +L 1 +D 4 +R 4 +D 4 +R 2 +D 3 +U 1 +R 2 +U 1 +L 4 +D 2 +L 2 +D 4 +L 1 +U 4 +D 3 +L 3 +U 2 +L 2 +D 1 +L 4 +R 4 +D 2 +R 3 +L 1 +U 3 +L 3 +D 5 +U 5 +D 5 +U 1 +D 1 +R 1 +U 2 +L 2 +U 3 +L 5 +D 4 +R 2 +U 2 +L 4 +U 3 +L 2 +U 3 +R 2 +D 3 +R 4 +D 5 +R 1 +D 3 +R 2 +U 2 +R 3 +U 5 +R 2 +D 1 +R 5 +L 1 +D 5 +L 5 +U 2 +D 4 +R 1 +L 3 +R 2 +U 2 +R 1 +U 5 +R 5 +D 2 +U 1 +R 4 +L 4 +D 5 +U 1 +D 1 +L 4 +D 3 +L 3 +D 5 +R 3 +U 3 +L 2 +R 5 +U 5 +R 3 +D 2 +L 2 +D 3 +R 1 +U 5 +L 1 +D 5 +R 2 +L 5 +R 4 +L 3 +D 2 +U 1 +L 4 +U 5 +L 3 +R 1 +U 3 +R 3 +U 5 +L 5 +U 5 +R 5 +L 1 +R 4 +L 2 +D 3 +U 3 +L 1 +U 5 +D 3 +U 4 +L 5 +U 3 +L 3 +D 1 +U 3 +L 4 +D 2 +R 3 +L 3 +D 4 +L 1 +D 4 +U 3 +D 4 +L 5 +R 2 +L 2 +R 4 +L 1 +U 1 +D 1 +U 1 +R 5 +U 1 +R 2 +D 3 +L 4 +D 1 +R 3 +U 3 +D 6 +U 1 +R 3 +D 1 +L 5 +D 3 +R 3 +L 2 +D 5 +R 3 +D 3 +U 5 +D 6 +U 2 +R 2 +U 3 +R 1 +U 6 +L 1 +R 1 +L 5 +R 2 +U 6 +D 3 +R 3 +D 5 +U 1 +L 4 +D 4 +L 1 +R 4 +D 5 +L 3 +R 5 +U 6 +D 4 +U 4 +D 5 +R 1 +U 1 +L 6 +R 3 +D 1 +L 2 +D 1 +L 1 +U 5 +L 4 +R 1 +L 3 +U 6 +L 1 +D 3 +L 6 +D 6 +R 2 +U 5 +D 3 +U 6 +R 5 +L 2 +U 1 +R 3 +L 5 +R 2 +L 6 +R 1 +U 1 +R 1 +D 3 +R 1 +D 1 +L 4 +D 2 +R 3 +U 2 +L 6 +U 5 +R 3 +D 4 +R 4 +D 6 +R 1 +D 5 +L 5 +R 1 +D 1 +L 3 +D 6 +R 3 +U 4 +D 6 +R 2 +L 6 +D 2 +L 1 +D 6 +L 3 +R 2 +U 3 +L 4 +R 6 +U 6 +R 1 +U 6 +D 5 +U 1 +L 6 +R 6 +D 1 +R 5 +L 1 +D 5 +R 6 +U 1 +L 5 +D 3 +R 6 +U 1 +L 3 +U 1 +R 4 +D 1 +R 2 +D 7 +U 5 +D 2 +U 6 +D 3 +U 1 +D 3 +R 4 +D 6 +R 3 +L 1 +U 1 +L 2 +R 4 +U 3 +L 3 +R 1 +D 7 +L 4 +D 2 +R 3 +L 2 +U 2 +L 1 +D 5 +U 4 +L 4 +D 7 +U 4 +D 5 +L 7 +U 6 +L 1 +U 1 +L 1 +R 6 +U 1 +D 5 +R 2 +D 4 +R 3 +D 2 +R 2 +L 5 +U 5 +R 7 +D 6 +R 1 +D 5 +R 1 +L 7 +D 7 +L 6 +D 6 +U 4 +R 3 +U 2 +R 6 +D 4 +R 6 +D 3 +L 5 +U 7 +D 2 +R 5 +D 5 +L 1 +R 1 +D 6 +L 3 +R 3 +L 1 +R 2 +D 5 +R 2 +D 1 +L 6 +D 1 +U 7 +R 6 +D 4 +U 2 +R 5 +L 7 +R 7 +D 3 +L 2 +R 7 +D 1 +R 8 +D 2 +R 3 +L 2 +R 8 +U 7 +L 8 +D 3 +U 6 +D 3 +R 8 +U 4 +L 3 +R 4 +D 5 +U 6 +R 8 +D 5 +U 4 +L 5 +D 2 +U 8 +D 6 +U 4 +L 1 +R 2 +D 4 +U 3 +L 1 +U 6 +R 6 +U 3 +L 7 +U 6 +R 3 +U 5 +R 6 +D 8 +R 6 +U 1 +R 8 +L 5 +R 5 +L 3 +R 5 +L 7 +R 3 +D 6 +R 1 +D 4 +R 5 +U 6 +R 4 +D 3 +R 4 +D 7 +R 5 +U 5 +D 2 +R 6 +U 3 +L 1 +U 4 +R 7 +U 5 +D 2 +R 3 +L 1 +U 2 +R 1 +D 7 +L 4 +R 4 +D 2 +U 8 +D 2 +L 4 +D 7 +R 6 +U 8 +R 7 +D 1 +U 4 +L 8 +D 8 +R 5 +D 2 +L 5 +D 1 +L 1 +U 4 +D 4 +L 7 +D 3 +L 8 +D 1 +R 1 +L 2 +U 7 +R 8 +D 3 +R 7 +D 1 +R 2 +U 8 +R 8 +U 2 +D 6 +U 7 +R 1 +U 8 +R 5 +D 3 +R 4 +L 2 +D 1 +L 6 +D 8 +R 1 +L 4 +U 5 +L 7 +D 5 +U 4 +L 4 +R 9 +L 9 +U 7 +L 3 +R 4 +U 2 +R 5 +D 1 +L 5 +R 7 +D 7 +L 6 +U 2 +L 6 +R 5 +D 2 +U 6 +R 3 +U 7 +D 8 +U 3 +L 3 +U 5 +D 5 +U 1 +D 6 +R 4 +U 3 +R 4 +U 1 +D 3 +R 2 +L 8 +D 6 +L 3 +U 7 +D 2 +R 9 +D 4 +L 5 +R 4 +L 8 +D 7 +R 2 +D 3 +U 5 +D 6 +R 1 +L 1 +D 5 +L 6 +U 4 +D 2 +R 5 +U 2 +R 4 +U 5 +D 7 +R 8 +D 2 +R 6 +D 4 +R 6 +L 8 +U 4 +L 3 +U 4 +L 3 +R 6 +D 4 +L 5 +D 1 +U 8 +L 8 +U 2 +L 9 +R 6 +L 1 +D 5 +L 5 +R 4 +D 3 +R 4 +L 8 +R 9 +D 2 +R 8 +D 6 +L 4 +D 2 +U 3 +R 9 +L 7 +D 9 +R 8 +U 3 +L 10 +D 10 +L 7 +R 8 +L 7 +D 7 +L 7 +D 6 +R 1 +U 10 +R 7 +U 10 +L 1 +D 7 +L 2 +D 1 +U 10 +D 5 +L 1 +U 9 +L 10 +U 6 +L 4 +U 10 +R 7 +L 10 +U 8 +D 6 +L 4 +D 9 +L 7 +R 5 +D 3 +L 2 +R 9 +U 4 +D 2 +L 6 +R 4 +L 3 +R 1 +L 2 +U 8 +L 7 +U 4 +D 8 +R 9 +L 4 +R 1 +U 6 +L 5 +R 10 +D 10 +U 2 +R 8 +U 1 +R 4 +D 10 +R 2 +L 2 +D 3 +U 8 +L 7 +D 9 +L 8 +D 7 +R 9 +L 6 +U 8 +D 7 +U 6 +D 5 +R 3 +L 7 +U 4 +R 7 +D 9 +R 9 +D 5 +L 6 +U 2 +R 7 +U 7 +D 3 +R 10 +L 10 +R 1 +D 10 +U 2 +R 3 +U 2 +L 4 +R 5 +L 1 +U 6 +R 1 +U 6 +R 10 +L 2 +D 8 +U 3 +L 8 +U 4 +L 8 +U 10 +D 7 +R 4 +U 10 +L 3 +D 7 +L 1 +R 5 +L 1 +U 5 +L 1 +D 1 +R 7 +D 3 +L 3 +R 2 +U 7 +L 11 +R 5 +D 8 +R 1 +U 3 +R 1 +L 11 +R 4 +U 1 +D 9 +R 7 +D 8 +R 11 +D 3 +U 1 +L 7 +R 5 +L 5 +R 1 +D 4 +R 6 +D 8 +R 3 +L 10 +R 10 +D 4 +L 7 +R 7 +L 9 +D 11 +L 1 +D 1 +L 10 +U 6 +L 8 +R 11 +D 10 +L 4 +U 5 +D 8 +R 8 +L 3 +U 4 +R 4 +U 7 +R 7 +D 8 +U 6 +R 11 +L 8 +D 10 +R 7 +D 8 +L 11 +U 3 +D 7 +U 2 +R 5 +L 6 +U 10 +R 4 +L 9 +U 7 +D 7 +R 7 +D 6 +R 10 +U 4 +L 3 +D 4 +R 8 +L 4 +R 3 +U 2 +R 4 +U 2 +L 6 +D 5 +R 3 +D 1 +U 4 +L 6 +U 10 +D 9 +L 6 +U 4 +R 3 +L 2 +D 4 +R 1 +L 3 +R 4 +L 2 +R 7 +L 6 +R 7 +U 8 +D 6 +U 2 +L 11 +R 9 +L 10 +R 6 +D 4 +R 7 +L 6 +D 2 +L 10 +D 3 +L 2 +D 9 +L 2 +R 10 +L 8 +U 2 +L 9 +D 12 +U 3 +R 7 +U 6 +L 1 +R 6 +D 9 +U 1 +R 9 +U 5 +L 5 +R 12 +L 5 +U 4 +R 1 +D 1 +R 7 +L 1 +R 1 +D 3 +U 5 +R 9 +D 6 +L 12 +R 2 +U 4 +R 2 +U 2 +R 11 +U 2 +D 3 +U 2 +L 11 +D 11 +R 1 +D 10 +L 5 +D 11 +R 4 +D 4 +R 12 +U 11 +R 2 +U 1 +D 11 +L 3 +D 3 +R 5 +D 6 +R 9 +U 10 +L 9 +D 4 +U 8 +D 5 +R 5 +U 1 +R 2 +U 12 +L 2 +R 9 +D 5 +U 11 +D 8 +R 8 +L 10 +D 10 +U 9 +L 5 +U 2 +R 4 +D 4 +U 11 +R 2 +U 8 +R 5 +U 3 +D 12 +L 10 +U 11 +D 12 +R 3 +L 6 +R 5 +U 6 +R 9 +U 7 +R 9 +D 6 +L 3 +U 3 +L 5 +D 1 +L 9 +U 9 +R 2 +D 9 +R 5 +U 9 +R 7 +D 5 +R 10 +D 7 +U 4 +L 1 +D 6 +U 10 +L 12 +R 7 +U 9 +L 1 +D 5 +U 8 +D 3 +L 6 +D 7 +R 7 +L 13 +D 4 +R 3 +D 8 +L 10 +R 11 +D 2 +R 8 +D 7 +R 8 +L 13 +D 3 +L 2 +D 4 +L 2 +U 5 +R 6 +U 9 +R 7 +L 3 +R 13 +L 11 +R 1 +D 13 +L 10 +D 6 +R 2 +L 12 +D 8 +U 12 +D 5 +R 3 +U 5 +D 6 +U 4 +D 6 +U 7 +D 12 +R 6 +L 1 +U 3 +R 10 +U 7 +L 12 +R 11 +D 1 +L 9 +U 12 +L 5 +D 6 +U 7 +D 11 +L 9 +D 13 +L 7 +D 13 +U 5 +R 9 +U 8 +R 9 +D 9 +L 9 +R 3 +D 11 +U 7 +L 9 +U 6 +L 11 +U 2 +R 6 +U 6 +R 12 +U 1 +L 3 +U 5 +R 9 +U 11 +R 13 +U 11 +D 13 +R 7 +U 11 +L 9 +D 10 +U 1 +L 12 +R 13 +D 3 +U 4 +L 11 +U 3 +D 2 +R 10 +U 9 +D 4 +L 14 +R 2 +D 2 +U 13 +D 3 +U 10 +L 7 +U 6 +D 13 +U 9 +R 1 +D 1 +R 1 +D 5 +L 2 +D 7 +U 10 +R 1 +D 8 +L 13 +R 2 +U 10 +L 6 +D 8 +R 7 +U 9 +D 4 +U 7 +D 6 +R 12 +U 1 +D 13 +U 4 +L 13 +D 7 +R 5 +U 10 +D 12 +U 5 +L 1 +U 12 +D 4 +U 3 +R 3 +D 9 +L 5 +R 2 +D 3 +U 6 +R 14 +L 2 +R 3 +U 11 +R 9 +L 13 +D 1 +U 8 +D 2 +R 12 +D 5 +L 6 +U 14 +R 1 +D 2 +L 6 +R 7 +L 8 +D 6 +U 7 +L 2 +R 2 +D 5 +R 6 +U 1 +D 8 +L 12 +D 7 +L 6 +D 8 +L 4 +U 4 +D 13 +R 11 +D 1 +R 9 +L 6 +D 8 +L 12 +U 11 +D 11 +U 4 +D 12 +R 4 +L 14 +U 6 +D 3 +R 8 +D 7 +L 12 +U 12 +R 10 +U 2 +R 6 +L 1 +R 11 +U 2 +L 4 +U 12 +R 5 +U 8 +L 15 +R 5 +U 4 +R 9 +D 8 +U 15 +D 10 +R 10 +L 9 +R 12 +L 8 +D 14 +R 2 +D 11 +L 14 +D 8 +L 1 +D 15 +U 4 +L 4 +D 9 +R 4 +D 10 +L 1 +U 7 +D 13 +R 15 +U 12 +R 11 +D 12 +R 2 +L 7 +D 15 +L 1 +U 4 +D 14 +L 7 +D 1 +R 9 +U 1 +L 3 +D 2 +L 5 +D 13 +R 3 +L 12 +U 5 +L 13 +U 5 +L 2 +D 9 +L 1 +D 10 +L 14 +D 14 +U 5 +D 14 +U 5 +D 4 +R 12 +U 10 +R 14 +D 1 +L 1 +U 8 +D 7 +L 13 +R 5 +L 7 +D 5 +L 3 +U 15 +R 8 +L 9 +D 14 +R 14 +L 12 +D 7 +L 15 +D 14 +U 12 +L 7 +R 11 +L 10 +D 8 +L 7 +R 14 +L 11 +U 1 +R 9 +U 13 +R 14 +D 6 +U 1 +L 4 +R 12 +L 2 +U 12 +L 12 +D 13 +U 13 +R 12 +U 5 +R 9 +U 4 +D 13 +L 7 +D 4 +U 16 +D 11 +U 16 +R 12 +U 10 +R 14 +L 1 +U 12 +R 4 +U 7 +R 10 +D 14 +R 9 +D 9 +L 8 +R 11 +L 7 +U 5 +R 15 +U 1 +D 12 +U 5 +D 11 +U 5 +D 11 +L 13 +R 6 +D 10 +U 1 +L 5 +U 11 +L 4 +U 14 +L 15 +R 14 +L 4 +D 13 +L 11 +D 1 +U 12 +D 2 +L 13 +D 10 +L 8 +U 15 +R 3 +U 5 +R 13 +L 11 +U 12 +L 14 +R 10 +D 15 +R 2 +U 6 +D 15 +U 11 +D 9 +U 10 +R 16 +U 16 +D 6 +R 2 +L 4 +D 15 +L 8 +U 8 +L 14 +D 8 +U 4 +R 2 +D 4 +U 11 +R 9 +L 15 +U 5 +L 15 +D 12 +R 9 +U 3 +R 7 +D 14 +U 6 +R 11 +L 16 +D 5 +R 15 +D 6 +U 5 +L 13 +U 5 +R 4 +U 11 +R 13 +D 7 +R 7 +U 12 +R 13 +U 1 +L 5 +D 6 +R 8 +U 14 +R 6 +D 16 +R 8 +D 6 +R 5 +U 6 +D 2 +U 4 +R 5 +D 17 +L 3 +D 1 +R 9 +U 6 +R 13 +L 3 +D 15 +L 9 +D 4 +R 6 +D 13 +U 11 +D 2 +U 10 +L 11 +D 4 +U 17 +R 12 +D 12 +R 7 +D 10 +U 7 +R 3 +L 5 +D 5 +R 3 +D 3 +U 6 +D 6 +U 17 +L 16 +D 3 +R 14 +D 5 +U 12 +L 13 +U 7 +D 5 +R 17 +L 7 +D 12 +U 9 +D 15 +L 2 +R 13 +L 14 +D 1 +L 3 +U 17 +R 9 +U 4 +L 14 +R 8 +D 15 +L 11 +U 15 +L 9 +U 4 +L 10 +U 13 +D 12 +U 9 +L 8 +R 12 +U 5 +D 13 +U 10 +R 13 +U 1 +L 14 +D 10 +U 10 +R 3 +D 7 +R 5 +D 10 +R 6 +U 1 +D 1 +R 3 +L 16 +D 4 +U 13 +D 17 +L 5 +R 14 +U 3 +R 12 +U 5 +D 2 +U 9 +R 11 +D 13 +L 6 +U 3 +R 17 +L 11 +R 17 +L 13 +U 2 +R 17 +U 9 +L 3 +R 16 +D 1 +U 13 +D 3 +R 7 +L 9 +R 16 +D 17 +L 3 +U 3 +R 7 +L 15 +U 3 +R 6 +L 11 +R 11 +D 2 +U 1 +L 4 +D 6 +L 15 +R 9 +D 14 +U 1 +L 1 +U 10 +L 18 +D 4 +R 12 +L 14 +R 11 +D 14 +L 15 +U 17 +L 6 +U 11 +D 14 +U 1 +L 9 +D 8 +U 6 +L 18 +R 2 +D 4 +L 1 +D 13 +L 17 +U 6 +L 18 +U 16 +R 1 +U 8 +R 8 +L 17 +D 13 +U 18 +R 5 +U 6 +R 14 +D 4 +U 16 +L 18 +U 6 +R 18 +L 3 +U 12 +R 2 +D 9 +U 6 +R 11 +L 2 +D 11 +U 11 +D 16 +L 17 +U 18 +D 7 +R 12 +D 2 +L 9 +R 4 +L 3 +R 3 +U 17 +L 15 +R 12 +U 16 +L 12 +U 2 +L 8 +D 3 +L 10 +U 11 +L 2 +D 18 +R 1 +D 2 +R 5 +D 9 +L 15 +D 8 +L 18 +D 7 +L 16 +R 2 +U 17 +L 14 +R 11 +D 2 +U 12 +L 5 +D 6 +R 17 +L 7 +U 10 +R 1 +L 17 +R 12 +U 2 +D 4 +U 13 +D 11 +U 16 +L 4 +R 10 +U 3 +R 14 +U 16 +L 15 +U 10 +L 12 +U 19 +L 19 +R 15 +L 3 +U 6 +R 19 +L 14 +R 4 +L 6 +R 5 +L 17 +U 15 +L 6 +D 11 +U 7 +L 2 +R 8 +U 8 +R 16 +L 4 +U 19 +D 9 +L 15 +D 15 +L 16 +D 15 +L 9 +R 5 +L 10 +U 4 +R 15 +U 1 +D 4 +U 18 +R 18 +L 1 +U 18 +R 8 +L 11 +R 12 +U 3 +R 16 +D 17 +R 2 +L 18 +D 9 +R 5 +U 13 +R 12 +U 5 +R 6 +U 18 +R 5 +D 1 +L 8 +D 6 +L 16 +D 19 +L 16 +R 10 +L 9 +U 17 +D 19 +R 6 +D 15 +R 4 +U 19 +D 16 +R 13 +U 5 +R 10 +U 16 +D 4 +U 19 +R 17 +L 11 +U 4 +L 1 +U 9 +R 16 +L 6 +U 12 +D 9 +L 9 +R 3 +U 15 +R 18 +D 4 +U 19 +R 8 +L 3 +U 5 +D 18 +R 18 +D 17 +L 18 +R 15 +U 12 -- cgit v1.2.3