From 10d9d3452f5bb309907c49fd921b1dc1b47a8019 Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 15 Dec 2024 12:05:27 +0100 Subject: [PATCH] Day 15 --- aoc/src/dev/ctsk/aoc/Grid.scala | 8 +++ aoc/src/dev/ctsk/aoc/Main.scala | 3 +- aoc/src/dev/ctsk/aoc/days/Day15.scala | 88 +++++++++++++++++++++++++++ data/15.ans | 2 + data/15.in | 71 +++++++++++++++++++++ 5 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 aoc/src/dev/ctsk/aoc/days/Day15.scala create mode 100644 data/15.ans create mode 100644 data/15.in diff --git a/aoc/src/dev/ctsk/aoc/Grid.scala b/aoc/src/dev/ctsk/aoc/Grid.scala index 42b029f..570c15d 100644 --- a/aoc/src/dev/ctsk/aoc/Grid.scala +++ b/aoc/src/dev/ctsk/aoc/Grid.scala @@ -11,6 +11,14 @@ case class Point(x: Int, y: Int): def *(n: Int): Point = Point(n * x, n * y) def reduce: Point = { val g = gcd(x.abs, y.abs); Point(x / g, y / g) } +object Direction: + def from(c: Char): Direction = + c match + case '>' => Direction.Right + case '<' => Direction.Left + case '^' => Direction.Up + case 'v' => Direction.Down + enum Direction: case Up, Right, Down, Left def turnRight: Direction = Direction.fromOrdinal((ordinal + 1) % 4) diff --git a/aoc/src/dev/ctsk/aoc/Main.scala b/aoc/src/dev/ctsk/aoc/Main.scala index dd48130..b55cf03 100644 --- a/aoc/src/dev/ctsk/aoc/Main.scala +++ b/aoc/src/dev/ctsk/aoc/Main.scala @@ -16,7 +16,8 @@ val solvers = Map[Int, Solver]( 11 -> Day11, 12 -> Day12, 13 -> Day13, - 14 -> Day14 + 14 -> Day14, + 15 -> Day15 ) def runSolver(solver: Solver, input: os.Path): Unit = diff --git a/aoc/src/dev/ctsk/aoc/days/Day15.scala b/aoc/src/dev/ctsk/aoc/days/Day15.scala new file mode 100644 index 0000000..07d15b0 --- /dev/null +++ b/aoc/src/dev/ctsk/aoc/days/Day15.scala @@ -0,0 +1,88 @@ +package dev.ctsk.aoc.days + +import dev.ctsk.aoc._ +import dev.ctsk.aoc.Direction._ + +object Day15 extends Solver(15): + case class Input(grid: Grid[Char], moves: Seq[Direction]) + def pre(input: os.ReadablePath): Input = + val Array(map_, moves_) = os.read(input).split("\n\n") + Input( + Grid(map_.linesIterator.map(_.toArray).toArray), + moves_.filter(_ != '\n').map(Direction.from) + ) + + def part1(input: Input): Int = + val grid = Grid(input.grid.data.map(_.clone)) + var cur = grid.findFirst(_ == '@').get + for move <- input.moves do + val dst = Iterator + .iterate(cur)(move(_)) + .takeWhile(!grid(_).contains('#')) + .find(grid(_).contains('.')) + + dst match + case Some(dst) => + grid(dst) = grid(move(cur)).get + grid(move(cur)) = grid(cur).get + grid(cur) = '.'; cur = move(cur) + case None => () + + grid.find(_ == 'O').map(p => 100 * p.x + p.y).sum + + def part2(input: Input): Int = + val Input(grid_, moves) = input + val grid = Grid( + grid_.data.map( + _.flatMap { + case 'O' => "[]" + case '.' => ".." + case '@' => "@." + case '#' => "##" + } + ) + ) + + def blocked(p: Point): Boolean = grid(p).contains('#') + def free(p: Point): Boolean = grid(p).contains('.') + def clear(p: Point): Unit = { grid(p) = '.' } + def shift(d: Direction, p: Point): Unit = { grid(d(p)) = grid(p).get; clear(p) } + + def extend(p: Point): Seq[Point] = + grid(p).get match { + case '[' => Seq(p, Right(p)) + case ']' => Seq(Left(p), p) + case c => Seq(p) + } + + def push(move: Direction, cur: Point): Boolean = + move match + case Left | Right => + def step(cur: Point): Boolean = + if free(cur) then return true + if blocked(cur) then return false + if step(move(cur)) then { shift(move, cur); true } + else false + step(cur) + case Up | Down => + def step(cur: Set[Point]): Boolean = + if cur.isEmpty then return true + if cur.exists(blocked) then return false + val next = cur.map(move(_)).filterNot(free).flatMap(extend) + if step(next) then { cur.foreach { shift(move, _) }; true } + else false + step(Set(cur)) + + var cur = grid.findFirst(_ == '@').get + for (move <- moves) do if push(move, cur) then { cur = move(cur) } + grid.find(_ == '[').map(p => 100 * p.x + p.y).sum + + override def run(input_ : os.ReadablePath): (Timings, Solution) = + val (pre_time, input) = timed { pre(input_) } + val (p1_time, p1_solution) = timed { part1(input) } + val (p2_time, p2_solution) = timed { part2(input) } + + ( + Timings(pre_time, p1_time, p2_time), + Solution(Int.box(p1_solution), Int.box(p2_solution)) + ) diff --git a/data/15.ans b/data/15.ans new file mode 100644 index 0000000..1d87fae --- /dev/null +++ b/data/15.ans @@ -0,0 +1,2 @@ +1294459 +1319212 diff --git a/data/15.in b/data/15.in new file mode 100644 index 0000000..5c92390 --- /dev/null +++ b/data/15.in @@ -0,0 +1,71 @@ +################################################## +#O..OOO.O.....#O...OO.O...#O...##....O.O..OOO#.O.# +#....O.O..O.........O...O.......O....#.O.O.#...O## +#O..O..OO.O.O.........#O..O...O.....#...OO...O...# +#...O.#.O..#.O..OO...OO..O....O#......O...O......# +#...........OO....OOOOO.OO.OOOO...O...OO....#.O.O# +#..O.#..OO...O.O#OOOO.O.O....OO.....O.O......#.OO# +#O........O...O.....O.....#.O..O.......#..O.#...O# +#...........O..#.#.....#......O.....O..O....OOO..# +#O...O...OO...O.OO....O#O...OO.O......OO..OO...O.# +#...O#...OO....OO..........OOOO.O.OO.O#.O....OO..# +#..O..O.OO.OO.OOOOO....O..O..OO....O..OO....#..#.# +#..O.O.O#..OOO....#..O.O.#O#..O.O.....OO#O.O.OO### +#....O..#.....OO.O.O......O.....O..OO.O...O.....O# +#O.#O..........O..O.....O....O.OO...O....O..#..#.# +#........OO...........O#O...O...O.O.......O.....O# +#.........#....OOO...O.......OOO#.......OO....O.O# +#OO..........O.O....O..O....O...#O.O....O.....O#.# +#.....O.O.#O#..#.OOO.O..#OO..OO.....#.O......O...# +##.O.O.OO.OOO....#OOO.#...O...O.O...OO.......O.O## +#O..OO..#..O...OO.OO..O..#.#.O..O.#O..O.O....OO..# +#.O.O...O.....O.....OOO.......OO.O...O.#.#O..O.OO# +#OO.O.OOO..O.O..O.O..O..O....O...O...#OO.O.......# +#.O.....O.....O#O.#..O.......OOO.....#...O.O.....# +#O..O.......#.#..#...O..@.O..OOOO..O.....O.OOO...# +#OO........#OO.....O.O.#...O..O..#.O...O#.O#.....# +#.OO..#...OO..O........#.#.O#..O........OO.O..O.O# +#.O....#.O.O.#....OO.....#.O.O.O#.O.O..##.....O.## +#......O..O....O.....O.O.#O.O......#O...O#OO.#..## +#....OOO.O.OO..............O##...O#O......O....O.# +#O.....#.O......#..#....O#O.....O..O.#.O..#O.....# +#...........OO....O.....O#......OO.#OO..O........# +#O..#OO.....OO.....OO.....O........O.............# +#...O.O.O.....O...O.O.O.........O.#...O....O.O.#.# +#OOO.O#..#......O...O.O##O..O......#.#O..O.......# +#................O.#.......O.O.#....#.OO...#.....# +#....O....O#OO...O..O...#O...O....O.O###O#O.OO...# +#OO..O.O...O.......O#.O....OO.......#O#.O..OO..#O# +#...O.O...OOO..O......O....O......##.#.O.......O.# +#....O..O..O.........O#...........O.O.O...O.#....# +#..#..O.#.....#..O...#.#...O..OO...............OO# +#......OO#O.OO.......#......OO........O#.....OOOO# +#..OO.#.....#.O.O.O..OO.O#O.O..OOO#O....O....#...# +#...O......O.......O..O.OO...#........O..........# +#...O....O....O...........OO#.O......#..#O..O...O# +#....O#..O#.#....O....#.O...OO.O..#...O#........O# +#...O.##....O.O..O..........O.O..OO.#O#...#O..O..# +#.O.O#O##.O.O.....OOOO..##.O..#...O.O..O........O# +#.....O..#....#.........OO...........#.#.O....O.## +################################################## + +v><^<<>v>^<<>v>^<^<><<>><<>v^>><<^<^v<>^v^>>v^v><>>^v<^>^^^^^^>v<^<>^<^>^v<v^>vv^^^<^>>>^>v^^^v<>>><>vv^<><>v>^^>>>>^>><<<<<^^>><^v<^^>v<>^>^v<>>>v>^<<^>^vv^<^>v>^<>vv<<^>v^v<>v^v>>^^v>^^v^v<<>><>>>v^v>vv>>^^<^^vv<^<>>>vv<<^<>v><^^^^>v<<v^>>>^<>v>>^^<^v<>>><<<^>><<>^^><<^<>v<>^^^<>^v>v>v>^>v><<>>vv^>^v>>><<<^>>>>><>^<<<<<^><>>>^^>v<^^<>^>>>v><>^^^vv^v>v>^^^v>>>^v<^v<<<^<>^>>^v<^>><>^>^>>v^>vvvvv><^v><<>^<v^^<<>>><<^^vv>^><^<^>v^^v^^vv^vv>v>^v^^<^<<<>v<>^<vv>vv<<^<>>>^^>>>^vv<>v<<>^>v^v^^^v>^v^v<^<><^v^><>v^>^>>><<<^<<>v>^v<^v<>v^^^^>^v><>>>>^<^<<><^vv>>><^<>v^v<><^^^^<<^<>v^>>>^^v^v^<<<^><^^vv^<^>^vvv>>^<<^^<^v>><><^>vvv>>><^>>^<>vvvv<>vv<^^v>^^v<>v><>>^<>v^><^>vv^>^^>v^v^v< +>v^^<<>^^><^^^v^v<>v^v^^vv^v>>v<>>^><<^>>^^^^vv^<<<^vv>vv^><>v>v>>v>^v>>v^v>v><^>>v><>^v<^>^>><>^>vv>^<^<^^<<>^><<<<^>>v<^>^v<<<^^v^>><>^^>v<^v^>><<<<^<<^^vv<^>v>v<^^<v^>^<^>vvv<^^^v<<^<>>>vv^>>vv^^>>>v>^vvv^>>>^><^>^>v>^v<^vv>^vv^vv^<<^^v<vvvvv<>^^v<^vv^v^>^vv^>>>v^vvvv<<><<<>^><><^>^v<<^v>^<<>^^vv><>v>v^^<^v>v^>v>v^^>vv>v<><>^<<^>v<^>><<>><<^v<>v<<>^^v<<>v^>^>^v^^><<^>>><<^<><<<>^v>v^v<^^v<v^><^<<<<<v<>><<^v^^><>><<<<<^<>^^vv^>>>vv^vv^^<^^>^>>vv<^v^<<>vvv^^v<^><>>v>v><>>><>^v<<^>>^v<^v<<^^vv<>>v<<>vv>>>><>><^^^v<^v^^vv>^>^><>vvvv^^<^^v<<<>^>^vv>v<<<v>>^v^>v<>^^<<>><<>v>>^>>^v>^>^vv>>^<>^v<^^>^>v^v>>^^^<^v^<><>vv<^>vvv<^><^>v^v<^><^^<^v>^<>v^>v^>v^><>^>>>><^<>vv<>vvvv><^v^^<^<vv><>>v<>v>v^v<<<^v<^^><><>v><^>v>v^<<<^>^^^^<^^>^^v>v<>^>^>><^>>>v>v<<<<>v><^^^vv><><<^vvv<<<^^v><><^>v^v^vv<>><>>^><^vv^v<>^vv^^v^^^vv>>v^^<>^<^<^<>^<><<>vv<<^^vv^>^<>vvv<>^^^v^<><^^^vv^v^<<<^^v^<>^^<<<^<><>^^^^>^^<^>^vvv^^<<^>v^^^>>>^>>v>v>>v>^>vv<^><<<>vv^^^<^^^^^><<>>^>^v<>>^>vv>>v>^^<>^<<^^<<<<>>^>vv><><^v<^>^>^v>^v^>>>vv<>>vvv<>>v^<>v^>^>^v^>v>>><v<>^v><<^><>v<>>^^^>v<<<^>>><>v>v<>>>v>^>v<^>^>^^^<^>v>^^>^v>vv<<<^v^^>^><>^><^><>><<>>>^<<>v<>^v^^v^>>><<<^^<^v^<<^<<>>^vv>^vv^><<^>^vvv^<^v>^>^<<^^vvv<><>vvv>v<^v^vvv<>>v^^^v<^^<^^>^>^v>>>><^<^v>v^>v^>>>v>v>>^<<><>^^^<^^>v>^><>>>>><>v<^<><^<>^v>^>^>v^v>v>^<^v><>v^>v<><^<^^^><>v^><<<^>v<^>>>^><<>v<^>^vv<<>>v^v><>v<>^<<>^vv>^>v^<^vv<<<> +<>>^>>^><^^>v>>>^v>><^<<<^<><<^vv<<>>>^vv>v^v^<^>><<<><><^>>>^>>^<<<<<>^v<>v<^v^>>>><>v<^^v^^v<<>>^^>^^^<^<<^<>^^^^vv^v>vvv^<<><>vv^^^^>v^><<^^^^v<>>^v^^^<^>v^<^^><>v>>^v<^^v^v^^<>>><<<v>^vv>vvv^^<<^>v<<^<^^<<>^^^v^v>^^^v^v>v^<>^<^^vv>^^^>^^^<^>^v^vv><^v^<^v><<>>>vvv>^vv<>^>>v^^^vv<^<>v^^^v>><>>vvv^v<^^vvv><^^><<^>>v>^v^v<>^vv>^><^>^>^>^>^<<>><^>v<^>^v>v^>v^v<<<<^>^>^v<<<<><>^>v>v>vvv>>><>vv<<<<v>vv^<<^v><><^>>><<>v>v<^<<>>^><<><>^><^v^^v><v^^^^vv><<<<><>^>^<>^><^<<^>>>^^^>^^^v^^>v^^vv><^<>>v^>v^^v^^^^<>^v><>>^v^>>^^>^>>^v^v^>>>^^^<>>^^^>v<><^>><>^v>>v>>^>^v^v><>>>v>^>^^vv^v^v>^>^<>vv<^<^><^v>^^^<>v<>><<>><><>^^<><<<<v<><>^<<>^^^<>^<><>vv>v^^^^^><^<>^^v<>^v^v^<>v^><<^vv^v<<^^>>^^><><^v>>v^^<<<>^^<^^<>^vvvvv> +vv>^<>>^<^v^^^v>vvvv<<^^v>^v^v<<>>^>>vvv^^v>^^>><^><^^<^v^v^^<>>v^>v>>^^^^<<<^vv>>v>>v^vv>>v^^v><<^^^>vvv<>v<^^>^>^^><<>><<<<>v<>><^<^><^v^>v><^><>v^^<><^^^<<<<>^<^><^><<>>^<<>>v<<<<><>^<^^v><^>vv^v<>>v>v^>>^v<^v>>v<^^^^^<^^^^<>vv>v^>^^>^^<>>v^v^><>vv<^^^^v^^^><^vv>v^<^><>^^v^>>^^>>v<^vvv<>>><<>><v>><^>vvv^^^^<>vvvv^v<^>^<>^><<<<<>^<^v>vv^^>>v>>>>>>v^>v<>>v>v>^v>v^^>>v>>>>v<^<^v^^^>>>>vv<>^v<<><>>^v^>vvv<<>>v>v<>^<>^><<^>><<^>>>^^v^>>><^<v^^vvvvv^>v^v<^^^v^^<^<<>v^^^v^>vv>^>^<><<^><^<>v>v^^<<<^v>v<^<>^<>^<>v<^>>>vv><>>v><>^<<>>v><^<^^vv><<>v><^<><^v<>^>^^^^v<^v^^vv^^>^>^<^<^v<<^>^<<<<>^<>^<^v<^^<>vv>vv^<>vv<^v<^<^^>v>^><^>>^v><^v^><>v>^>^^vv>vv<<<<>^>^<v>>>v>>vv>>^<<>^v><<><>v>>><<<>>^>v<<<^<><^>v^v^>><<^^>^>v^^>>^v>><^^v>vv^>v>v>v>^^<^>v>>< +>v^>vv<^vvvv><>^<>>>>v>v>>^<>^^^v^>vv^^>^v<<^vvv^<>>^vv<>^v^vv>>^>>^>><^vv>vv<<<>v<^^^<^v<<^v<^>><^^vv<><^^<>^^v<><^>>><><<^<^<^<>>vvvv<>^>v<^<>^>>v^><<>><>v><^<^<<>>><>vv>^v<<>^>>>v<^^><^v^v><<^^>^v>v^>^>^vv<^^v^^<^^>><^>>^<^>^^>>>^<>><^^<^<v<^^^v<>>vv>vv^<^>>v>>^<<^<<<^v<>>v<<^^v>><^<<^>>v^<^v><<>^v<>v>^>>^v<>>^>^<<^><>>>^<>^v>^v^>^<^^^v>><>>^^>>vv>v><^>^^^v>>^v^<^>v><^>v<<^^<>v>v^^v^<^>>>>^v>>v>v<^<>^<<>vv<<<><^^<>vv<>>vv^<^<>>v^>v<>^>><<^v<><^>>><><^>^><>>>v<^<^v>>><^>v^^v>v^^><^^>^>v>v><>><^v^>v>>>><>^^v>><^<>v>^<>>vv^v>^v^>^v><>v>>><^^>v^<^v<^>>^>^><><^<^>^><<>><^v>^>>>v><<><^v>^^>vv^><>v>v>v><^v>>^v>>><^^^<^<<>v^^>vv^<<><>>^vv>v<>vv<><^>^>><>v<>v>^v^^>>><>v<<^v^<<^><>^vv^>>^>^>^<<^<>v>>><<^^v<^>^>v^v<<<<<>>>^>v^>>><<>>^^^>v><><^>>^vv<<>^<^^v^^vv>v>^<>^>>>v<^^>>^< +v<<^<^vvvvv>v<^<^<^>vvv<>^^<><^<^^>vv^>v>^>>^v<^vv^v^>^v^v>vv><><^v>>v<<^vv<v^v>>^>>^v^<^><^vvvvv<>^<^<>>>^^>vv^<<<^>><^<^>^^<<<<<<<^>^^<<<>>>^>><>v>^v^^<^^>vv>^v<<<>>v<>v^v>><^^^^<>>>>^v<<<^^^>^v^<^^v>vv><>>v^v>>v<^v<<>>^>^^><>^>><>>v^vv>vv<^>^<^<<<>^<^>^^>vvv^v<>^v>v^v>v<^<<>^^<<<>v^<<>v<^vv^>^^<>v>v<v<^>>>v^v>>>v><^>v^vv>v<^>>^^vv>^v^<<v<<^<<^^v^v>vv>v>^>vvvv<<<>^vvvv<^vvv>^<<>vvv<>v^>v^<>^>><^v>^v><^^v>v<><<>^v^<>><^><^>^<v^^^v><^><^v<<>v<^><<><>^v>vvv<><>v<v^v>vv><>v^^^<<<>^><v>><^v>>>^>v^<<>^v^^vv<<<>vv>>^>>>^<^<>v^^^<><>v>>^v>^vv^>><>>>^^v^>>>^>^><>^>v^>>>>vv^v^>>vv<><>^>vv^^>vv>>v^><>>v^><>^^vvv^>v<>><<>^v<<>^v^>><<<^v>^v>^vv<>><^v<>^v<<>v>^v<<^v<><^^<^vv^<>^<^^<^<<>>>^>>^<<<^>^><>^>v>>vv<^<^v<<^<>v<>>>><<^v>>^<<<^^><>v<><>v>v<>^>>><<>>><^vv>^^vv>v><^^^v^>><>^v>>v>><>>v<^^vvvvv^^v^<>^v>><<^>^v^<<>>>>>v>>>>^^^^^^v<^v><<^^>^^v^<v^vv<^<<<>^^>v>><^>><<^>^v<<><^<<>v^v<^^^<^<>^^v><>vv>>v^^>>>^>v<>><^v^><<>>><<>^^^<<^v^^<^v>^vv<>>v><^v^>^>><>>^v>^>v^<<>>^<<<<><>^>^vvv<<^^^^v<><>^<^^<<<><>^^^^^v>>vv^v<^^<^vv^<<<^>v<>v>v>>>^<>^vv>^v<<<^^>^<^^vv<>>>v^>^>>>v>>^^<<>^><^<<^<<<>^v^<>v^^<^^<^<>v^^>^>vvv<>><<^>^>>vvv<^<^<>><>^^^v^vv>vv^>vvvv>>vvv^><>v^v<<>>>^^>^vv<^^<<>v><<^>>v>>^>vv>v^^>^><<<<>^^^<^>>>>>^<>^<<^<<>v>^v>>v><<^^v>v^>^>v<^<>vvv<^>v<^v<>v^>v^v^^<>^>^^<>>>^<>^>vv><>>^<^^<^v><<<>>v>v^^^><>>v>^v>><^v^v>vv^>>v^><^<<^v<^>^>vv<><<^<^<<>><>v^vvv^^vv><>><<>^>v^><<>^^><^v<>><<<>><>^vv<^>v>v^vv^<<^>^>v>v>vv> +>^^^^^>>>>^<<>v^^^v<><>>v^^<<<<^>v^>>v^<>^<>><^^vv<>^<^>>v><>^v^^><^>>^<<<^^>^v<^^>v>^>vv<^vv>>vv<^v>^<>>>^^<>><^<^><^<>>^vvvv><<^^^v^>>v<><<<>vvvvvv^><<><^>>v<>vv<<<^>^>v<^v<^><^vvv<^v^v^^v^<<><<><vvv^v<>^^v^v^^v>>>^v^^>^>^^^>v^<^v^^<>vv^v^^v>^>vv>v<>vv^<^<^^v^v>>v<^><<<<^>^>^v>v>v>><<^^<<^v^><^>>>><^>vv^>><>vv><<^>vvv>^>vv>>^^>vvvv><><<><^vv<>v^>>vv<<<<<^^^<^>^<>^<^^v><>^v><>><>v<>>>v<>^<><<^v^^>^>><><<^<>>>vv<>^^vv^^^<>^>>>v>v^^^>^v<><<>v^>v>^>vv^v>v>v>^^v<<<<^<^><^<<><^^^^^^>v^<^>v><>v><^^>><^><>v<^>^vv>><<<>v>><^^v<<><>^v<>vv^^<><>^v<^><<^v^vv^v>^^>>>^<^v><^^><^^v>v>><<><^v^^>><^v>v>v^<<>vv><<>^^>^<^<^<>v<>v>v^^>^>>^><><>^>v^<^v<>>v<>v^<>v>>^>^v^<^^^<^v>>>>vv^^^vvv>>^<^<><>>v>^>>^v^^>^v><>^<<^^^<^v^>><><^>^>v^v^>^>^<<<^<^v>v<>v>^<><<^^^>v<^^v^>^vvvv>vv<^>^v^< +>^^v>v<>>v^v><^>v>><><>v<^^><>v^^<>v^<>>^v^<>>^<><^<>^><^>^v>v<<>>>>^><<>>>><>^^<^v><^^^^v^vv<^<>^<<>^<<^v^v<^<<v<^><>v^>>v^v^>>^^^>^>^>^<<><>^v^v>^^v^v>v>vv^>^>^^^v>^>><^<^^<^<<^<<<^v<^><>^>^vv<<>vv<<<^v^^^v>>v^^v<^^^^^>v>^v>^vv^><><^>>v^v><<^v<^<^>vvv^><^^v>vvv>v>>^><>>^^^>^v^^^vvvvv^^^^vv^v<<>^>^v^^<>v>^^^^v>^<>^><<^>><^>v<^>v>^v<^^>^<^><^>>v^^<^^vv<>vv<<>v<<^<><>^v>^>^^>vv^^v>><>v<^v>v<>^<<^<vv>v^>>vv<^>^^>v>>v^>^^^<^v<>>^<<>><^<^^vvvv^><<^^^^v>>vv>v<>^vvvvvv<^>^>>>vv>vv<<<<<>>>^<^>v<^^^vv^v^v>v^<^vvv^><>vv>>vv>^^>^>^>v^^^^v^v>>^^<><<^vv^>>v^^^>>v><><>^<^^^v^<<^>vv^>^^>v^<v>vv^^v^^>>>><<<vvv><><<<>v<<^>v<^vv<<^v<>v^><>>>^^^v>^<<<>>>^<<^v><<<>>>><^^<<<<<^>vv^vv +v><><><^v<^<>v>^v>><<^^^<<>^<^^>v<<<>><<><>vv<<^<^^v^^^^<<^^^v^v^^v>^v<^^<<^^>vvv>>^<>>>^^^>^v>v><>^^>vv^<>v>v<<^^>^^>>><>>^^vv<><<<^vvvvvvv>^<<^<>vv>>vvv^v^vv<><>v^<^>vvv>^vv><<<<><>^^><<><<><vv>^^><<<<<^^^<>v<^>^v^v>vv^v>v<<^v<>>^>^<><<<^><>><>v^>v>^v^v^v><^<>v^vv^>vv>^^>^^<<^>^>v>^v^>v><^>v><>^>v^vv><<^v<>>vvv>vv<>^v<<^vvvv^^v^v<><<<>^^>vv<<<^<<<^^v^>^^><>^^v><><>v^v>>>^vv<<^^>v<^^<^><>>>>v<<^>^^v><<^v>>v^>>^>>><>>><^>^<<^<<>^^>^^<^<^v>v>v^>^vv^<>v>^^v^<^vv<^>v^><<>^v^<<<^>>^v>>vv>>^>v^^>v>><>^<<<^^v<^><><>^>^>v>>v<<>v>v^^v>>v<^^^vv^vv<<^^v>^vvv^>>v<<><^v^>>^>v<<>>^<>>v>v^v<^>>>^<<^<<<vvv>^><<>>>v^^^>>><v><<<^^v^v>>>>^<^>>v^><<>v<<^^^vv<^<<^v<><<<^v>v<>^^<>v<<<^vv^>v>v^^^v^vvv>^^>>v^v><^>^<<^>^>>>>><>v^>>^^^^v^<>><><<<><> +<<<^v<^<<^v<>v^>v^^>^^^^^>^<><<^^v^<>v><>^v<^<<^>^^>^v^^>v^^<>v^vv<^v>^^^v^^>^<><>^^>vv>v^>>>v>v>vvv^>v^^^>>>^v^v><^^<><<><<^v<^v<>v^v>^^>^^>^^v^>^^v>^^^v<>^v^^^vv>><^^^^v>v<>vvvv<<><^v<<>^v^<^v<<><>>><>^v^<>^<^v^vvv<><<>^^^v<^v<>>^v^><<>v>v>^v>><^>><^<^vv>>vvv^><^v<<>^vvv^>><<<<><^v<>^v^<>^<<<<>v><>^v>^><^^^v^^>^^^<^^>vv>^v>v>>>v^<>>>v>>>>^v>>^<><>^<^v>^<<>^<^^>^<^><>vvvv>^<^><<<^^^>v><^>v^>^>>v^<<>>v<v^v<<>v^^<^v<<^>v^v^<>v>^v<<<>><>^<>v>v<<^<><>v<^v^<^^v>v><<>^>>>>>^v><^v<<^>v^^>v<>v^^><<^>>v<<^v>^v^>^>vv<<<>>^<^>v>>^><<^^<>vv^<>^^<<<^<^^v^v>^>^>^><<^>^><>^v^>>>^<>^v^^^^^^>v^><<>vv^vv^<^v>^^<>^^>>^<^v><<^^>v^<^^>v^v>>>v^<><<>>v>>>v^>>v^>^^v><<^<^v^<><>v><<><<^<><<><<^^v^^>>v<><^>v><><> +^>^>vv^^v^>>v<^vv>v>^<^><<^v>^v>v^><><^^v<^^^>vv>v<<^<>>v^<>^v<^^^>^^vv>^v^^>v<><>>v<<^v<<><>><v^^vv^^><<<^>^vvvvv^<^><^>^^v>>vvv<>v>>^>^<<^<^^<^^>>^>v^<>>v><^>v>^v^<>^v>v<^<^vv>v^v><^>^>><^<^vv^^>v^^<><^vvvvv>>^^>v<^^^<^<>^><^^>vv<>v<><>>>><^^^>v^><^>v<>>^vv>>v<<^v^<><<^^>><<<>v<>vv>>>v<><>>v>vvv<>>^^<^^>><^^^^><<<>^^<^<^><^^^^^>^>v<<<>vv^>>^vv^vv^v^^^vv<>^>^<<<><><<<<^^^^>^v>>v<<^^<^>^^>^v>v<>^^v^>v>^>v<<^>>v>^>>>>^>^>>>v^<^v^vv^v^vvv>>><<^^>>v<v^>>^>v^>^><^^>vv<^>v><^^^vv>>v<>v<^vv^<>v<<^<^v^<<<>><<>v^v^v^><<>^^vv>v>vv^^>><>^>^vv^^^>>>^^><>v^^v><<>>^v<^>><<<><^<>^>v<<^>^><^>>>><<^>vv^^<<>>v^v^>>v><^><>^>^vvv><^><><>vvvvv>v^<<<<^>^><<^<>v<>^vv<>>>^vv^^^ +vv<<>v>v>^^>v>^<^v><>v^<^<>^<^<^<>>^^v<><><<^vv^><^>>>^^>>>^^>v<><>^vv>v^^><>v<^><>^^><<>^^^v^>^vvv^<^vv<^<>vv><<>>v^>>>^^>^<<>v>^^>^v<^>><<>>>^^v^>>^<>^><^v>vv>^vvvvv>>v>>><<^^<><^vv^v>^^><<<>v^<<<^v>>v>^^v<<>^<^>><<<v<>>v<>^><>><><^^>^v^v>><><>>^^^>^^vv^v>vv>^^>vv^><>>v>^^vv>^^><<<^v<^v^<>>>^^>vv<^>>>^v^^>>><^<<^^vv><<>^><<<<<^v<<>^^^<>>v^<^v><^^v><^<>^<^>>^<<v>>>vvv<^v>v>>>^<<>>>^v<>>v>^>^^^v<>>v<<^^^>^<^<^^^>>^^<<<^^^<><<>v^>v>^^^<>^><^v>^<>^^<<>>^v><<<><^^v<^vv^^^v><<<^vv^>v^>^^^vvv^v>v><>>^^v<>v<<>v^v^v<^<<^v>vv>^>vv^v<v>><<<^^v>>>v>v>>>>>>><><<<^<>vv^><<<>^^>v<^<<>>>>^v^>>^^>^>^><^^>>^^vv<^>v>^^v<<<>v>>v^^<<^^v<>>>^><^>^v><^v>^v>^<^vvvv<^>>^>^<<^^v^^>>>^^>^vvv<v^<^>> +^v^<>v>v^^v^^<<<^<^^^^v<v^>v>v<vvv<>v<^<^>vv^vv><v>^>^^vv<v^^<>v^^v>v>v><>^v^>v>v^>>><^>>v^^v^^v^vv<^><^<>v^^>^v>vv^<>>vv^>^>>^>^<<>><><>v^><>>v>^^<^<<>v>>>^^^^>>><<>^v<<^<>>>^^^^vvv^^>^^<<>^^v^vv>><>>>>^v><<^>^^<>vv^vvv^^^>^v^^<<>>>^^>v<<>v^^^vvv^<<^vv^^><^>^v<^vv^v<^>><<<>>>>^vv<><v<>>>v>^^>^vvv><^<><^<<<<>v>v>v<><v>v>^>>>>>>^^<^>^^^v^<^^<>^^v>>^>>^><^^vv<^^>>>^v<^v>vvvvvv<<><<^^v>>>>^^^^vvvv^>v^><^><<>v>^v^>^>vv^>vvvvv^^^><<>><>^^<><^^v<>^^<><^^^^<<<<vv>v^^<<<>><^^^v><vv>v<>^^^vvv>v><>>v^v^>^^^^v>v>>^^v>^>v>^vvvvv>^<^vv>^v>vv><<<>><>^>v<<>><^>^v<<<>v<^v>>^>^v^vv><<<^><>>>vv>v>^^>^^v>><^>^vvv>>>^><<^>>>^>^<^<>>^v<^vv>v^^^v^<>>^><>v^^<<>>^><>><^<<^<v^v^v^>>^^vv^^><<^>><<^v^vv>^v^>>^<>>>^v>^v><^^>v^^v^v<^>v^vv<^v<<^^^>^>>v^>vv>>v>^v<^>v<^<>^>vv><^>v<<<^^>v>>>v^<^vvv^v<>^v<^<^vv<^<^vv>^><>v<<>v<><<>><>vvv^v<<^v^v<<>v<^>^>^<<>>vvv^^^<^>v^v>>^<^>v>>v>>>>^>>^>v>vv^>^v><^>v^v>>v^v<^>^v><><<>^>>v><><>>><^>>>v^^v<<<>v^>><^<^v>v^v<>v>^^vvv^<>^<<>>vv^^<>v>vvv>^>^vv^<<><<^v^v>v>>v^^^^^v<<>>v>^>vv<^>^v<^><^<<^vv<>v><>>^><>^<^<>v>>v>>>v<^^^<^^^>v>vv^<<>>^^^<<^>vv^^>v^>v<^<<>^<^<^^<<<^><<<>vv<<<<<^<v^^^<>>>>><>v^^v<>^vv>^>vv<<<>>v>>v>vv^^v^v>>v<^v<>>vvv^>vv^^vv>>vv<^^>><><<^<^v^>v^^v^>>v>v^^^v>><<<^>v>vvv>^v<>^<^^<^v<>>^v^^>><><<vv>^>v^^v^vv^>>><>^^vv<<>^vv^>^^<>v^<<>^^v^><<<>>v>>v<^v>vv<^^>><^<<>^vvv>^^<^><<>vv>^>^^<<>>^^vv><^^>v^<>v><>^^<^^v><<^>>^> +<><<^<<>^>^^^^>vv^v><^>^><<><^><^v<>^^^><>^v^v<><<<>>v<>v>^^<^v^^^><>v^^^^<<^v>^<><<^vv<<<<^>>>^>v^>^>^<>^><>v>^>^<^<^v^vv^<<>>>>v>^>^v^vvvv>^v<<>v>><>>^>^^^>vv<^vvv<^>v><^vvvv^v>v>>>^v>><^>>>^v>vv^v<<>^^^<^v<<^^<<^^^<<^v^^v>>^^^><>^<^v>><<^<v>vv<<<^^<<<>vvv^><^^v>^^^>>>>^^v>>>><>>^<>>^^^v<><^^vv<^v^^vv^v^<>>^^^^><<<>^v^>v>v<>^^>v>^>>^>^>v>>>^^>^<><<>^^vv>^^v^^^vv<^>^^^v<<>v<>^<>^>^>><><^^^>^<<>^v>^v<<^^>v><><>v^vvvvv<^^^vv>^>vv>^^^>v><<<^<>v>>^^^<<<>^><>^>>v>>v^v<^>^>vv^>vv>>^<^>^><^>>><><<^vv<^^^v<><^vvv>>^^<^<^^^vvvv^^^v>^v<^^>v>>^<^v^<<^vv><^<^v<^^>^v>vvv<^vv>^^>^<>^>v^><<<>v^v^^v<><^vvv^^v<>v^^<^>^<><^^<<<^<>vv^<^<>^^^><>v<<>^>vv^^^v<>vv>^<<>^<>v<>>>>v^<<<>v<>vv^>^><<>vvv><<>><<<^<^^<^ +v<>>vvv>^^>^>v<>><<^v>^v^>><^v^<<>^>>>vv^<<^<<>v>vv<>>>>v<<>^vv><^>>>>^<^><>>vv>^>v^<<><^><<^^>v^v^^>^^><^<^>^vvv^<^^>^<<^>^^>>^<><<^vv>^>v>v>v<^^<>>^^><<<^v>^^vv^v^^^^>vv>>^>vvv^vv>^v^<<>><>><<<<>>>^^<>v<>v<>v^<^vv^v^v>>v^^v><<>>>v>vv<^^v^<^<>>v<^vvvv>>^v^v^v>^>><>vv<^^v<<<^>>v<>v^>^^vv^v>>^v><>^^^>v<^^v>>v^v<^vvv<^v>>vv><^^v><<<^v^vv><^><><>>>^<^^^<<>v^>v<<>>vvv>>><<^^v>^^<^^vv^v^^v^vv><^<^^<^vv>>v^>^^^<>^vvv<^<>^^^^<^<<<>^>vv^v<><^<<><^v<^>^<^>^v><>vv>>^v<^^>>^<<>>><>vv^v<>^^<<^v^^^v^v^vv>vv<^<>>v<>>vvv^v<^v>vv><<>^<<v^^><^<>>^>>v>v<^><^<^vv<<<^v^<>v^^^^v^v^vv<>>v<<<<^>>v^^>vv>>>^<>>>><<>^^^<>v>^>vv^>^>>v^^^>>v<>^<>^>^v^v<>^<^^>^^vv>><>^>vv><^v>^^v^^<^v>>^v<>><>v<<^v^v>^<^v>^>><^>v<>^^>^<>^>v>^v>^>>><<>^<^v<^<>^^^>^^<<><>^^>><<<<> +^>v<^>>vvv>^v^v>^><^>><^>vv^<^^^<<>^<>>^<>v>><><<<^>^^>^^^<^><><><>>^^^^^<<^v>><>vvv^>><>>^>^>vv^<vv^>^v>^vv<<^v<<>>v<>><^>v<^^^>v^^v>v>v<><^><>vv^v<>^v>>^>>v><>>vv>^^><<<<<^<>v<><<^>>^<^><^vv>^^^^vv^v>>^^^^vv^><>v<<><><>^vvvv><>v>vv^^>>^^<^v<^>^><^^<<^>><^>>><>^v<^^<>><<><^v^v^v<^<^><>><>^><<^^>^^>>^vv^>>>v><<<>vvv<>>v<^v^<<vv>v^<vv<>><^>>vvv^^<^v>>^^v<^v>vv^v>><>v^<^^<<>^<^v^v<<^v<<^^>>v<>^v>>><<<^<>>^>^vv^v^v>v>>^<>vv<^^v<^>>>>v<>v>>>>vvv>>>vvv^>^>>>vv^vv>^v^v>v>>^^<><><<>^v<^><<^>^<>>v^>v<>v^^<v<><>vv<><>>^v<^><^><>v<>^>><<<>>^^<<<><^vv^v<<^v^^vv^v>v<>^>><^v><^v^vv>>>v^<<>v>vv>>^^><<<>^^v>^<>v<<>><>v<^<>v^>>>vv^^>>>><>v^vvv><^>vv<>^>vvvv>>^<<>><>v<^>>v<<<<>^^v>^^<>^<^vv^v>>>^>vv^vv>^^v^v>^v><>v^^>^v^v^v^^^vv><><<>>^<<>>^vv +><>v>^v><^<>v>^vvvv><>v<^v>^^v<<<^<<><><^vv>vv><>vvv<^<<<><<^<^>v<<<^>v<>vv<>v^><>v^^<<^<><^<<^>^v>>><^<<^v<<^^><>^>>>^vv><^v<^v^v^vv>>vvvv<>>>v<<^>^^^>vv^><><>^<>><<^v^>v<>^^>vv>^<<^^^^<^>>^>vv>^v<^>>^<<^^^^>vv><>v>vv>><<^vv^><><^vv^<>v>v^v>^v^v^^^^vv><vvv><^v^^^v<>><<<<><>v<<^v<><<<>v><>^vv><^>^>><>^^><^^v><^^^v>>^vv<^^v^<^^^<<^^>>v><><>^><>v><^v>>>vv<^v^v>>vv^<^>v^<>v<^><>>^v^^<>><^^>v<<<>^<><^<<^vvvv>v<^<^vv^><v><^v<>^^<><>><>^>>v^v>vv>><^^v<^v^<^>^<>vv>><<<^><>>^v><>v<>>>^^<<>v^v^v^v<<<>^v<<<>>vv^^^^>^>v^<^^><<<<>vvv^>>^vv>v<>>^v<^vv>^v><^v>><>v^>>^<>>^v<^vv^^<<>vv<>v<>vv>>>v>v^v>>>^v^<>v>^^>v^v<^v>^^v^^<<<>><<<^>^<^>><>v<^<>^<>v^>vvvv>v^><<>>><^^<<><^<^vv^<>><>^^^v>>^^>