diff --git a/2024/src/main/kotlin/Grid.kt b/2024/src/main/kotlin/Grid.kt index d668d76..6ad662f 100644 --- a/2024/src/main/kotlin/Grid.kt +++ b/2024/src/main/kotlin/Grid.kt @@ -16,6 +16,14 @@ operator fun Grid.set(coordinate: Grid.Coordinate, value: T) = set(coordi operator fun Grid.get(coordinate: Grid.Coordinate) = get(coordinate.x, coordinate.y) operator fun Grid.contains(coordinate: Grid.Coordinate) = inside(coordinate) +fun Grid.coordinates() = sequence { + for (y in 0..(override val width: Int, override val height: Int, content: List) : Grid { init { assert(width * height == content.count()) diff --git a/2024/src/main/kotlin/day15.kt b/2024/src/main/kotlin/day15.kt new file mode 100644 index 0000000..966a790 --- /dev/null +++ b/2024/src/main/kotlin/day15.kt @@ -0,0 +1,55 @@ +fun main() { + val iterator = readInput("day15.txt").iterator() + val input = Sequence { iterator } + + val grid = CharGrid(input.takeWhile { it.isNotEmpty() }.toList()) + var robot = grid.find('@')!! + + val program = input.flatMap { line -> + line.map { + when (it) { + '^' -> Direction.North + '>' -> Direction.East + 'v' -> Direction.South + '<' -> Direction.West + else -> error("Invalid direction $it") + } + } + } + + grid[robot] = '.' + for (direction in program) { + val next = robot.step(direction) + if (grid.push(next, direction)) { + robot = next + } + } + + val part1 = grid.coordinates() + .filter { grid[it] == 'O' } + .fold(0) { acc, coord -> + acc + coord.x + 100 * coord.y + } + + println("Part 1: $part1") +} + +fun CharGrid.push(position: Grid.Coordinate, direction: Direction): Boolean { + if (this[position] == '.') { + return true + } + + var next = position + while (this[next] == 'O') { + next = next.step(direction) + } + + if (this[next] == '#') { + return false + } + + this[next] = 'O' + this[position] = '.' + + return true +} diff --git a/2024/src/main/resources/day15.txt b/2024/src/main/resources/day15.txt new file mode 100644 index 0000000..5fa7801 --- /dev/null +++ b/2024/src/main/resources/day15.txt @@ -0,0 +1,71 @@ +################################################## +#...#......O.........#O.....O#.....O.........O..## +#.O.O#...O#O...O#...OO.#...O......OO#O.O...OO....# +#...O..#O.....#.....O.....O..O.....OOO....O......# +#.O..O.#O.O......OO..O.O....O...O...#.#........O.# +#OO..#..O.O.....O...#.O....O.........#.OOO....OO.# +#.OO.O........#.O....OO........OO.O...#O...O#..OO# +##........O.O.O..#....#.......OOOO..O...O#..OO..O# +#......O##.#O.OO.#...O.#.O.O....O.....OOO...#OO..# +#.OOOO.OO..O.OOOO...OOO.......#.#...OO.OO....#.O## +#........OO.#O.O.#.O..O..O.....O.#..O..O...OOO..## +#...#.OO#.......#.O.OO..O....O.#.....O...O#.####.# +#.....OO..O.#.O..O.O.##.O..#OO.O...O.O..OO#...#..# +#O.OOOOO...OOO..#....O#.....O.....O.O.O...O...OO.# +#...O.....OO.O.......O..#O....O......O.O.O...OO..# +#.O...OO.O.O..O#........#..O##...#.O#..O.OO.#O.#.# +#O.O.....#...OO.O....O..O.OO......O..OO.OO..#.O.## +#..O......OO#.O..O.OO...O..O.O..O..........O..O..# +#O..#......OO.O...........O....O...O...O...O...O.# +##.##..O..O...O.#OO.O.O.O#OO..O.O.#OO......O.OO..# +#..OOO.O....OOO.O....O...O..O.O..O.O.O.#O...#O...# +#.....O..O.O...O.O..O....O.O...O...#OOOOO...O..O.# +#.OO..OO....O.OO....OO...O........O.O.O.OO...OOO.# +##.O.#.....O.O.O..O.O....O..O....O.O..#.O...O....# +#.#......O#O...#O..O....@O..O......O......O#.....# +#....O.#.O...#.........O..#.#....#O...OOO.OOOOO..# +#O.O..O#...OO............O##....O...O#..#O..O..#.# +#O.OOO.....OO#..O.O...OOO#.O.#.O.O..#.O.O.O......# +#....O......#O......#..#...O..O...O.##.OOO..O..O.# +#....O.O....O.O.OO........##...O.#..#...O....O...# +#......OO.O.....OO...OO.#.#.#O#.OO#OOO.OO.O....#.# +#O..OO....O.....O..#OO......O.#..O.......#.....#.# +#...OO..OO....O.#.O.O.#.O#.......O..#..O..O...OO## +#....O.O.O.......O.##.O...#.......O....O......O.O# +#....#.#.O.O..#...O..O.#......O.OO#......OOOO..#.# +#.OO###.OOO.O...O.O....O.....O.....OO....OOO...O.# +#..O...O.O##O.....#......O....OO....O......OO.O..# +#.O..O.O...O.O......O.OO.#.O....O.O...O...O.O..O.# +#..O.OO..OO#.........OO.....O#O..O.#.O.O........O# +#.O.O...O.O..#.O...O#.O........OO.#..O..O.O.O....# +#.......O...#.O.....O.O#.O....#.......#.....#....# +#.#..O....O..OO#...O.O..#..O.O....O..O#O...O.....# +#..#.#O#.....OO..OO.O.......OO.#...OO...O......O.# +#O#..O..O..O..#.#.O#...O.OOO...O#....O..#O#...O.## +#..OOO.O......O...O..O....O#OO.O..O....O....O....# +#O.O......#..O..#OO....###.O.....O#..O.........O.# +#O.O.O..#O....O..#.....O..O....OO....#O.....O....# +#....OO..O.OO.....O.....#.O.......#.O...........O# +#.....O..O...........O.O..#......O........OO.....# +################################################## + +v<>v>^^vv<v^vvv>>^vv>>vv>^>^v^^v>>v>vv>^>>vv<>v^>>^>v>^<>vvvv>>v>^>v>^^>v^>>vv^^^v<^>>v^^v^>^^^<<><<>>^><^v^<>^vv<><>vv<>v^<^^<^<^vv^<<>>vv^^<^^^><>^^>^v>v^>^^v^^vv>^<<^v>v^>>v>vv^v><>v^^><>^vv^<<<>^v<^v><^^vv^<>><>>v<^^v<>^^>^>>v^>>>>^<^><>v>^>vv><>^vv<>vv^vv>v>v>^<>vv<^v^v<>>>>><>v^>v<<>v<<^vv>v>^<>>>>vv<<>^<^>><>v<^vv^>^>v^><>vvv<>>^<^<><>>vv>^^v^v>>>^>v>v<<<^v<>^<>^v^v>>vv<>v>><<^<>><>^>^v^<>><^<^<^><^v<>^^<^<>^^<><>^<^<<>>v<<><^vv^<^v<>v>>v^vv<^v>v<><^>>^>^<^>^><<><^>^^>^>>>v^^>^^^<^>>>v<<>v>^<<^^>vv<><>><^>><^v^^^<^^^>^vvv<<><>>>>><vvv>>>^^>^>><<>>><><^>>>v<^^v>^^v^v<<^<<>>v>^^<^<<>^><>^^v<<<vv<>vv<>^>>>>vv>^<<^vv^<^v<^v<^v^v^>><<<<<^>>>>^v>^^>vv>^v>v<<>v<> +<^^<>vvvv<^v^v>>>v>^^^v^>>^v^v<>>^^><^v^v^<<^v><>^>>^^vv>^v>vv^>>v^>^>^>>vv><>>v^<<>>^^<>v<^v<^vvvvvvvv^^vvv^v><^<>^v^v><^v^<>^^>v>v<>>vv>v><^<^^<^v^v>v>^v>vv^<>>^<^vvv<>>v^vvv<>v><>><>vv><<>v>><^<>><<>^<>v^<>^>>v>v>vv^^^^vvvv^^v>>>^>^^^^^^<<<^^^v>>^^>^^^><>v^<>v>v^>>>>v<^>^<<>v<v^><<^v><<vvv^>vv<><>^v^>v^>^^^vv>vv^^>>v<><>v<><v><>^^>v^<<>vv>><^>vv^v><>v<^>v>v<^<^<<^>v<^^v>v^v>>>>v><><>^>><>^<^<>v>>v><>vvv<>>^v>v^><<v^><><<>>v^v<<><>v^v^v^^^vv>>^<<^>>v><<^^^><^vv^>>v>^^vv^<^v^^^<<>v>^v^>v^<>v<^^<^v<>^v^^v>>^>>^<^<<^><>^^v>v<><^>><^v^^<>^><<^>^<><><^<>vvv<>^^v^>^^v<<>v<<^<<<<^vv<<<^v^v<^<<^><^v<<<^<^vv>v^<>>v<^^^>^^><^><>>>><<^v<<^^<>^vv^^vv<v^v><^>vv<^vv>v^^<<<^v^v>>v>>v<^>>>v^>>v^<>v^<^>>^^v^<>v<^><^^<<>v^^<^<<>^>^vv<>v<^^<>^^^<<<>><^><>^^>v<^>^^v><>v<^^^>^^^v<>^^<<^>^^vv>><<<>^<><><^<>vv><>vv^<>>>^>>^v><>v<^>><>^<>>v<^^^>>>vv<<>><>^>^v><<^<<>^^^<^<><^vv>^^v<^^<>v>><^^vv<<><^>>^v^<^v>v>v^>v<<^v^^v<^<>>>^>v><^>>>v^v>^<><<><^^<<v<^vv><>>><^>>><>^><>^><>^^^>v<^>^>>v>>v>^<^^<>>v^^^^<<^>^v^<>^<<<^^>^^v>>^<<<^v^v>^vv><^>vv^^v<<^>><><^^^<^v<^v<>^^>>>^^<^><^><>vv>><>vv^vvvv<^^<>^v^^v^>>v>v><>>^<<^<^^<^^v<<^v^><<>^<<>>>vv>^><>><^>^^^<v>vv>>^^^^v>^<>>>v^vvv^^v>v<^vvv^>^>vv^>^<^>v^v>vv^<<^v>^vv>v^^^^<>vv<><<><<>>v^>>^v<<<^v^>^><>><^<><<>>><<><>^v^<<^<^vv^^>><<>v^>^v>>^v^<>^v>>^>v>>^>>>^^>>^^>v<<^v><^<><>v<<<<^v^><>>v^^vv^^vvv^>v><<>^vv>v>><<^><^>v<<^^v>^vv><>>v<<<<>^>v>>>^>^<^v>v^^<<>>^vv><^>>^^^>>^><>v>>v< +<<^^<<>^^^<<>^<<^<^>>^v^<<<^<^v^^<v^<>^<^v<><^^><<<><>>^>v>^^>><>v<^<><>>^^v><>^>v<>v^^vvvvvv<^v^v><<>v><<>v^><>v^v<>v<^<>^><^vv^>v>^v^>v<^^^>>vv<^v>><^^^^><><>^v<<><<<^>^v>><<<>>>^^>>^v>>^>>^><^>^^v>>v>><<^^>><>vvv^vv^^<<^^v<^^><>^v^<<>v<<>v^<>v^><^<^><>>>^^<><^v>^v>><<>vv>^>><>^v<<><<>v<<v>>^^<v>>>>v><<^>vvv>>v^v>^v<>>>^<>><^>><>>>>^^>><^^^^^v<^>>^v^><<^vv>><>><><^>>^><>>^^>^>>v>>^^^vv<>^<<<^^^><>vvv<^^v>v<>v^^><^>vv>^><^v^>v>>>><>^v^<>^v<>v<>v^<^^>^vvv^v^><><>^v^><>^>^><^<<^^<>^v^vv^><^^<<>v^>><>^v^v^v<><>^^^vv^<<><>^v>v^>^^vv<>vv>^<>v<^^><>v^v><<^<^vv<>^^>v>>><>v>^^>v<>^^^<>>^<^vv^^<>^<^v>v<^>v>>v>>v>^<<>^^^^^v<^^>^<^v^>^^><^^><v<^vv<^>v^v^v>^>v<>^<>>v^><>>vv^v<^v^<<<<^^^><>>><<>>^><>v>>>>>v +<<^^><>><^<^^^^<^<>v>v<^><><^>^>v<^^>vv^<^^<<>^<^^^<<>>>^^>^>vvv<^v><^v^^v^<<<^<><<>>^>>><><^^>^v^>v^>vvv^^^^v^>^^>v>^<^>vv>^^^>v<^><>vv<>>>^^<<>>^<><^^>vvv>^>>v^^>vv^<>v^<^v>^vvv^^<^<^v<>>^v<<>>v>>^v>vv>v<v<<^<<<<^^>v>vv>v>v<<<<<^>^>^^^^<<vv><>>^>^<>>v>><^^vv>^>><^<^<^<^<^^<^>>vvv<>^>^v<<^<>>v^>^^v<^^^<^<^^>vv^><<^vvv>>^>^vv^v<><>>^>vvv>^>>v^>vv^vv>v^<^>>^>^>vv<<>>v>v^<>v>v>^>^^v^^^^^^^<>>>^<<>>>>vv>^<^^<>v^^<>>vv<<^>v^v^v^^>v>^><<^vv^>v>v^v><>v^v>v>v^>^>>^<^<<<^>>vv>><>>v^><<>>^^<>v<<>>><^<^v^<<^<>><<>^>>^^><<vvv><>^vv^>^^^>v^>vv<>>^^^vv^<>>vvv>^^<^v<>^><^<^<<<^v^v^>v<^><>^>^vvv^v<^>>vv^v<>^v<^>^>^>><>^><<^<>>>>>vv^>v^^>^v^>^vv^^^v>>> +^^>^<<<^>^>v^vvv<^v<><>^<<^v><>vv^^v^v<^v^<>v><^<<^<^^>>v>^v^vv>^^vv><<^v^v>vvvv^^<<>>v^<<>^^^>v>^<<>>^v<^<>^v<<^^^^^^<^<<<^^vv^^>^vv^>^>^>^^>^^v>^>>><^<>^vv^>>v>^><>>^v>v^><>>v<<^^^v>vv^<>>>^^v>^^>>^><>v^>^^<<>^>vv>>v>vvv^<^<<<<^^><^^^>>^v^>^>>><><>^^>^v><^>><<^^v<<><>v^^v<<^^v>^<<^><<^<^^><^^^v^<<><<^><>v<^<<^v>>>><<><>^>vv^vv<^^^<^v^<>^v^<><^^v^v^^v^><>v^>^v<^<>v^^<^<>v>v^<^>>^>><><^^^v<^><<^^><<>>v><^<><>>^^v^^vv^v<>vv^<^^>^v<^^v><^vvv<^v^<>v^^^>v<>vvv>>v><^>v>><<<^<>v^^^^^vv><>^vv^vv><>v<<<>^<<<^>^^<>vv^>^^>^v>v^<>>>>^<<^>>^v>v>^^>v<><^v<>><^<^v>>^>>^vv^v>vvv<^v<>^><>>^v>><^<v^^>v>><>v^v>^^vv^v^v^vv^<<>>>^>^>>^>>^vv^>^v^>^v>^^vv>^>v^>^^v<^v<^>^^><>><<^^<<^v^^>>v>vv<^<>v<^v^v^^v^>^v><^<>><<^>><<^>>^<^v>>>v^v>^>^v<>>v<>^>v> +v<^<^<>vv<>>^v<^v><<^v>vv<^v<>><>>vv^vvv^<>v>v<^vv^><>>v<^v<^v>^><^^v>^^><>v><<^<^^>^<^^<><<>^v<<<>vv<^>v>v^>^^^v^<<>^<<^<^>^>^<<^^>vvvv<>^^>^v>v^v>>^v^>vv>>^<>^^^>^<^^<<^<><<>v>v^<>^v>vvv^<>^<^v>^^<<<>>>v^><><^^^>>v^v^^^^vvv<>vv>^>^><><^<<><>vv><<><>vv<>v<^^^<<^><><^v<^<^v>^^^^v>>v<>><>^>>v>^<^>vv^^>v>vv><^^<^<^^<^<^^<>^^^^<^<<>^v^>v<>>v^^^^>><<^v<>><^<>>>vv<><^<^>v^v>^>>^v^><>vv>><^^<<<^<>>><vv>v<>v>>^><^<<^vv>^>^^>><^>^v^<^v<^^^vv<<>>^<^<>>^>vv<>v>^vvv^<>vv^v>^<<>v<<^^v^<<>>v>^<^>vv^>vv^vv<^^<^>>vv<^^<<^^vvvv^>^^>^^^^>^vv>>vvvvv>^v^^<^><^^v^v^vv<^>^v^^v><>^vvv<^vv>^^v<^vv^><^><>vv^^^<>><<^^<>vvv^<^vv><^<^v>^^v<^<^^<^vv^^v>>^^>v>^>v>vvv^>v<^^v^>vvvv^^<v><^^><><^v>v<<<<^vv^v^vv>^v^>vv^v><>>><^<><^<^^v +^<<^^^>vv<^>>>^<^>vv^>^vv<^>vv^v^v^>>>^>>^v^>^<<^^v<>vvv^^v^<^>>>^vvv<^^<^><^>v>^>^v>v>><>^v<^<^v<<<<^<^vv>v^><^>v<^^^v><^^^vv^>>v<^v<^^^^^v^v<>>v><>>>v<^^^<>>v><^>^>>v^>v>^>v>>v<v<^^<<>^vv^v>^<^^<^>><^>vv^vv^^^v^vv>^>>>v^><>v>^v^<>^>^v^<<>v^^>>><<^<<>><>>^<<^v<<>>vv>vvv<^>^>>^>^<>v<<<^^>>>vv<<^<^^v^>>v<>^>v^v<<<>>^^<^<^><<<><>vv^<<^v^<><^>^^v<<^<<><<>v>>><^<<^>>>>vv^^<^v<^>^^^<^^^v>vv<^>^^^>>^^vv<>^><^^vv<>^v<^>>^<^<>^<>^>^^^>v^^^>^>^>^><>>>^v^v>>v>^<^^>^^^vvv^vv>^>v>v^^v^vv^>v^>v<^<<>vv^>>^vvv>v>>>^v>>>^^<^>>v><>^>vvvv<<^^v<><^^^v<><><<>^^^^v><^v>><<^><<<^^^<>vvv<^v^v<^^>><^v^<^>^^<<>v^<>v^v>^v>v^<<><^<>v^v^v<><><>>^<<>><>vvvv>vv<^v>^v<^^v^>>^>^<^vv^v><^v>^<<>v>vv^>>^v^^^>^v^^^vv^<><^<^^v^<<>><>^^^<^^v<^>>><^><>>^>vvv^ +^^^^v^^>v>^^<>^v^>vv>^<^<>>>v>v^^v<^<^v<>^^<>^v^><^vv<>>vvv^vv><<>^<<>>vvv<<><^<<^<>vv<>v>>vv^^><v>>>v>^<>^v>v<>v<>vv^<^v^>>><^vv>^^^>^^v^^>>^^>v><>vv>>^<<>><^>^^^<^^<<><>>^>>v^>>>>v>><><^v<<<>v^<^vv^<^^<^v>v>^v<><<<^<>>^v><>>vv<<>v^vv<^>>vvv^<^<><>v>>^>v>v^><>v^<>v<>><<^>vv<^^^>^vv<<<><^>v>>>>>^>vv^>><><>^v^^<^^^<^^<<><^^v^>v^^>v>>vv><><><>>>v^vv^vv^^<<<>>v>^>^vv^>v^^^vv>vv>^^^^^v>>v<^^<<^v>v^>^><^<^><^><<<<>^>>vv<<<<^^^v^<>>>v>v^^^>v<>>v>>vvvv^<>v><<>>vv^><^^v>>v^><>v>v>v<><>>^>v^<^>^v>v^>v<^>^v^>vv<<><>>^^>v>vv^vv^>^<^^<><>v^^vvv^<<^<>>>^vv^<^^^^><^>>^^^^>^v^^v>^vv<^^<^<<^<<<>v<<>>v>^>v>^v>>^v>>v>vv^><>>vv<^>v^v<^v^<><<>v^^>v<^>><<>^><^v<><^<^<^><^<>^^><<^^^v<^^vv>^>>v>><>^>^v^v>>^>^v^>v^><^ +^^^^^v^>^><>>vvv>^<>>v<^^^v^v<^v<^v^^>v^>^v>>v>vv>^vv>^<>><^>>vv>v>^<^><><>v>^>>vv^v^<^>>^>>^>>^v<><^^<>v^v>>vv>>><>>v<>^v>><^v^<>^<<<>v<>>v^>vvv>>^>>^v<^^v^><^<^^v<>v<^<<>^<<^^<>^v><<>v>>v^^>>^^v^^<^^>><>v<^v>>>>>v<>v<>^vv^>>^>^<><<>>v^^<<>>>^<<>v^v<^<>>>>^>v<^<<^^vv<^><<><^v^>><<<^^vv^>>^^^<^^^^>^>v<>>v>>^>^<^v<^><^^>v^>v>><>>v^^v^<<>^v>>vv^><>vvv>vv^^>vv<>v>>v^v>vv^>v^>^^>vv<^v^^>v>>>v>^v<><>v^v<^<<<>^>^v<<><^vv^^v<^>><^<>^^><>^v^<^<<>>>v>v<<^^v^^<>^^><>v^^vv><<^<^v<vv^>v<>>>v><vv^>^>v^^^<>>><^v><^<^vv><>>>vv><>^^^<^v><>><^^v<<>^^<>v^^^<^^^><>>^><<>v<>^<^v<^v^>v<<><^>^v>><^>>^v<>vv^<<<<<^v^>>^vv^v<><>v^v^>^^<<>v<<>^v<><>^vv<^>><^>vvv><>>><<>v<^<><>^>^>>><> +vv>^v^<^^vvv>^^>^<>>>v>>v><^^<^>^^<<<>>v^<^>^<^<^v^v<><<>>vv<^><>^^>^<<>^v>vv<>^>^><^<><^^^^>>>v^>^^><^<^v^<<^<^>><<<^<^<<>vv<<^^vv>^>v^^>>><^^^^v^<^><>v<^>v<>^^<<>v<^vv>>>>^>v>>v^>>>^<>^<>>><^vv^>>v<^>^>><^<^^^^^v^^><>^>>^<^><>vv>v^vv>v>>>v^<><>v<><>v<^>><>v>><>^<<^<^^v<^>>>^>><^<^<^v<><>^>^><><>>^v<<<>>^<>>v^v<<>^v<^^>^^>^<>v^v>^vvv^<><^^v>>^<<^<><^v^v<<^v>v^v<^>v^>v>>vvv^^>>v>>>^<<>^^v^v^>>^vvv^>v><v^>>>v>v<^>>^^>^^v><^<><^vv^v^v^>>v>v>^>>^^^>^<>^<v^<^>>>v<^v>^v<>^<><><>><<<<<><>^v^>^<^>^>>>^>vv^<>^v^v<<^v^vv><<>^>><<>v^>^v^>^v^<^><^<<>vv>>v>v<^>^^^v<<^v^>v^v^v>v^>>^><^^><^^>v<>v^vv>^v<^>v<<<^>>v^<^vv<<>vv>>^v<<^>^^^v<>><^^v<^^><<^>vv^<>^><<^<^v<^^><^><^>v<>v>^v>vv^>v<>^<>>v>^v<>>^^>>v^v<^^^>>v><^v^^v^^^>vv^^v<>v><^^<>><^<vv^^>^^v^>>>>>vv>>><^<^v^>^<^^>^v^><^^^>^v^<^^^v^>^>>>>>vv<^>^>^^v><<><>v<vvv^vvvvv>>>vvv^>><v>^>v^>>^>^>v<<>v^vv><>^^^>vv<^v>>^^^^vv><>v>^^^>><^<^<>v>^><>>^<<<^^<>>v^>>^^<>v^><^<>><>>^<>v<^vv>^^>v>>v><^>^vv>^^v<>><<>vvv>^^^v^v>v>^<^^v^<<>^^<^<<<>vvv^>^v^><^>^>v^^^^<>^v^><>><<<><<>^><^<<>>>>v<><^^^v<^<^vv><^v><>^^^^^>^^^v^^^<^<>vvvv<>v<^>>>v<^v>>>vv>^^^<^v<<<^>v<>v^v>v^^v<^^>^^^v>>^<<<^<^><<>v><>vv<^^v^>>v^^^><><^^>^vv>v<>^>><^^vv^^v<^<<^>^>^vv^>>^v<^<>>>><<<^><^<^>>^^>^^<^vv^^^<^^>>^v<<^^>><<^^^^><<<^>^vv^><<<>^<>>>><<^v<>^>v><<^><^>^>>>v^><>v>>^<<>v<<v>v^><>^<<<^v^v^<<^v>vv^<^<>>>>>v>>v^>v>>><^^>^>^v>^><>vv><v>^>^<>^vv^v^^>^>^^vvv<<>^<^v<>><>>vv<^<<>v<>^<<<>^>^>v^>^><^v< +>^vv><><>v^vv>^v^>^>v^v^v>^v<>^>>>v^><<^v>>^>>><^v>>^^>^v<^><<>v>^vv^^v^>>^>>v><<^>><^>v^<<^v><<v<>>^<>v<>v^><^vvv^><>>>>vvvv<>^>v>>v^<<<>^>v>v^^vv>v<<<^vv^vv>><<^>v^v><<>^v^<>^v><^^>><><^>vvv>^v<>^<<<>>^><<>v<<>^^v>v^^vv^>v<>^<<^>v><><>>v<<v^<^^v^^^<<<^v^>v^v^^>^<vvv^>>^><>v>^>^v^<>v^><^<<><><^^<<>>^><<>v^>^^<^^^><^<^>^^v>^^><^>^vvv^v^v^^><>^^><>v>>^>^<^>>^^^v>^><^<^^^^^^v^v>>^<>vv>>v<>>vv><^v<>v>^<<^<^^>^>^v^<>^^^^<>><>^<<^^v^^>>v><^<>>v<^^v^^v>^^^v^^>^>v><<<^^^v^<>^<>><^^<>v>>v>>v>^^<^>^^^^<>>>^vv><<>>v^v^>^>vv>vv><^>>^>^><<^>^<>v>><^>>><^^^<<>^^^>v<>v><<^>vvv<^v^^vv<<<>><>^>>^>v>^<<^>><>>^<>^^>v^>^<^^>vv^v^<>vv>^v<<<^^^<^<^^v<^<^^^v<<<>v<<<<><^^vvv>vvv>>^vv^>>><>>vvv<>v<>vvv>^>><<^><<<>>vv<>v>^>v><><^>>>v^<>^<>v<^>^^><>><^<^><<<>>v>^<^<>><^^<>>^^>vvv<<^^>v^^>^^^>vvvvv>vvv>><><<^^<<^>v<>^>v<<<^>^^v<>^^^^<^^>vv^^<<^<<^^>v<<^>v^vv^^^^^>v^>v>><><>><><>^^v>^>^<^<^^v<>^^>>^<^v^><>>>v><<<>vv<<^^>>><>v^>^v><^vv^^>vv^^<^>>>^v>^^>>vv<^^<<>^^v<^^>vv>>^^v>^v>^<<<^v>><<<^>^<^><<^^>v^>^><<<^<<<^^<^vv>^vvv^v^^>^v<<<^>vv<<>^vv>^>v<<>vv<>^vv^<>^^>v^vv>v^^>>>^^^<^^vv>>^<>vv^>>v^<^v<><>^v<<<>vv<>>><>v^^v<^>v>>^v<^v>><^<>^>v^^<>^>v^^vv^>>vv>v<>><>v>>^v>^<<<>vvv>^vv^>vv^<^<<<^^^^v<<^vv^<>^v^v<<<^>>v>^<<<<^v><>^v^>>^>>>>>v<^^v>^<<^v><<^vv^^<<^v^<<<^v^vvv^^<<<<><>^vv^>^^^v^>^>v<<>^^>^^v<><>^^<><><^vvv>v><^vv^^>><>v><<^><^<<^>>v><>vv<<<>^>^^>vv>^^vvv>>>v^v^vv<<^^>v>^v>v<^^<>><^^><^v^>^>^<<^^vv^^ +^v^><^><>>vv>^^<^<^^vv^>>^>^vvv<^^>^<^<^^<>^>>v^>vv<>^^<^<>^^<<^^v<<>v<>>^^>>^^^<>>>^>v>^^>>^^^<<<^vv^vv<>v>>>v>^v>v<>>>v^v>vv>><^vvv^>>v<>><^>>v^v>>^^<^<>>^^^v<><^v><>^<<<^<^v>vv^^v^<<><<<^v><>><^<^<>^>><>><<>><>^>^^>>><>^<>>>^v^vv>>vv>^>v<^^vv<><^<<<<^^>^>>v>>><^^^^v<v^v>v^vv>vv<^>^>>>><<<^v^^^^<>^>^^^v>^^^>vv^^^v>>>>v<^v<>v><<v^^<<>^>>^>><^^<v<<^^>^^v^^v^>^^>>><^vvv<<^><>>v>>>vvvv<<>>v^>v>vvvvv<<^<>v<^vvv^v<>>v>>>^<<<><<>v^^vv>>>^vv<>^v<<<^v<><^<<>^^<>>^^^>^^>vv>>>>>><<>>v^><<<<v>vvv^vvv><^>><^>^vv^<>>^<>^vv><^>vv>><^<<<^v><>>^<^>>>vvv>^>>>>^vvv>><>^^^vvv^v<>v>>^^<><^v>v<>^<<>^^v^v><^<><<^v^>v^<^^v^<^v^^^><^>>vv<^<^>><v<<><<>^<>v<^^<^^<>>^<<<>>>vv<>>>v^^^<^^^^<<>>v^<>v>>>vvv^v<^^^>v>vv<<> +>>^<^vv<^^>^>^^^v<<^^>>^<>^v^>^vvv>^><>^v>v>v>v^^><<<><>>v<^^^>v^<>^v<>>^>^^v^<^v^vv>vv<>v^v^><^v><v^<>^v<<^<<><^>v^<^v>>>^>^>^v>^^>^v<>v^^<>>v^<<<>^<<^vvv>><^v>>v^>>>^v^v>v>v<^>vv^^^v>>v<^>^<>>^^>>>^^^>v^<>v^>^><<>^v^vv>v^vv><<<>v<<^>>^^<>v<<^^v>vv>v^>>v<>^v>><<<<^><^^v><>^^v^<<<><<^v<<>>^>>>^^vv<^>>>>v><^<^v^vv^v^vv^v^v<<<<^v^<^vv>vv^v>v^^vvv>vvvv^^<>^^^<>>^v><<<<vv>^^<<<<<>^^v^^>vvv<>><^^<^>vv^<>vv>vv^>>^^><^^vv^vv^v^>^><>vv^v^>^vvv^vv<^v>>v^v<<^<^v^<>^>>>>v^v<<<>^^vv<^^^vvv>v^>>v><>^<^>^^<^v^>^^vvv>><<<>^vv^^<^vv^>>^^v>v<>v^v>v^v>v^vvv>vv^<>v<^^v<<<^^^<^><^>>>v<^^><<<>v^<<<^v<v<^^^<^><<>>^^^<^>>^v<>><<^^vv<<^^v>>^<>^v><> +v^><^>^>v^vvv^^vvv<^>v<>vv^^^v><>v>vv^<>^v^<>>>^vv^vv>>vvv<<>v>>vvv^^v<>vv><^><>v>^^v<^><>>vv^vvv^^>><><^^<><>v<<^>>v^>^>^^^^^v<><^>^v><<<>^>v><>>^>^><^><<>>v^<><>>v>>^^vv^^^vv<>>><^^v>v^^>v<^>vvv^^<^>^^>v^^^>vv^v<>vvv>^v><^^>v^^>^^<^<>^^>v^v<><>^>><^>^^v^v>>v<^v<>^v^>v^>v>vvv><^>v>^>>vv^<>^vv>^^^<<^>>^<<<>^v<<><>>^v^v^^v<^^v<>>>><^^^><^>>vv><>^>^v^><<<><>><<<<^v<<^v<<^v<<^v^<^vv><>vv<^^<>^>v^<>^>>vv>^>^^^v^<^^vvvv^<>v^<>vvv^>^>^^><<v^>>vv^>>^v<^^v>v>^v>>v^><^><^v<^<<^^v^^<><<^^^^>v<^v^>v>v>><^v<><>><^>^v<>>>v<^^>v<^^>^v<<<><>^^vv^>^>v>v>v<<^<<>^>><>vvvv<^<>^^<><^^vv>^<^^>vv^v^>><>>^>^>v<<^<^>>vv^><^>>v^^>>^vv^v<<>^^^^>v^vv><<<<^v>^<^v>vv>^v>^>^>^>v^>vv>>vvv><^v^^^^<<>><><<<vv^v>v>^>v>^<<><^<<>><^<>v^>>^vv>^>>><>>^^^>>v<^>^vv^<<^v<<^^vvv<<^^^>^^><>><>^^v<v<^v>^^><^>v>vvv>v<^vv^^v<^^<<<>v^^^>^>>>vv>^v^^<<<^vv>^^v<^v<^^<^<>v>>>^v<<^>>vv>^<>vv<>v>vv><<<><><v<^v<>v>vv<^^>>>v<>^^v>>^vv>>^^v>v>v<^<^vv^v<<<>vv^>^^v<<><><^>v^^^vv^v^><^^v>vv^>v<<^v><<>^>^>^<<<<<><>><^>v>v><^v><^^>vvv^>v<>><>vvv<^>^>><<^<>><^v<^<^<^<^^>>v^>v^^>v>^v>>^>>^><^^>v>v^><>>><><^v>v^>v><^^<^vv>^^<^^<<<^<>vvv><<>><^v^^<>^v>v<^<>>vv>^^vvv><^^^<^<>^^><<<^>vv>v^v<^^^v>^<>>><^v^v^>>v>>v<>v^>vv^vv^><>^<^>v^>v<<>^>^^^vvvvv<<>^<>>^>^>><<^^<>^vv^^^^<>^^<>vv<^<^>>vv^v>v<<^>^v>v^<>^>v>vv>>^^v^><<><>>v^v>^><>v<>><<^<>^>vv>^^><>>>>^v^v^<<>>>vvv>vv<<<<<<<<^v<<^<^v^v^><>v>>>>vv^v^>^^^<^^v>v<>^v^^<<><>^>v^v<^>>>>>vv>>^<^v^^^>>vv>v>^<<<^^><>^^>>v^<>vvv>>^v<^v<>^^<^>^>v<^^>^^<<<><<>vv^>>^v<<><^><>vvv^>>^^>vv^>v><^vv^v<<>vvv<<>vv<^v<^><>^><>v^vv^^><<>v<<^>><>>^v<>^^>>v>v<<<<^v>><^v>^>vv<^<^^v^>>>vv^v^^<>>v^vv<^<<<^^>^v^^>v^^>vvv<>^^>vv><^>vvv><^>><^^>v>><^v^v^<>v<^v>>vvvv>^v>^v^v>v^v<<>v^vv>v^^v^<>v>^<>v>^<^<<^^<>>><^v>><^^>vv^>>>v^>^<^<^v><^v^>v^>>>v<><>^^v>v<^^vv<^v^^><^<>^v>v^v<<>^<^^>vv>v><^^>v^>><<<^<>^^^>vv>v<^^^>^<>^^^v<^^>^<^^v>>>v>><>vvvv<<^<<>^^^v^>^^^><^^>>><^>^v>v<>^>>>>>vvvv^^v^>vv^^>>>v>vv>vv>v>>>>>^^<<><>>v^<<<>^<^><^vv^>>vv^^v^vv<^^v>^><>v^^><>v^^<<^vvv<>v<>>^<>><><><^>><>^>>^^v<>^<^^v<<<>>>>v<<^>>vv<<>^>^<^><>^^<<>^<<>>vv^<>>>^<>><<>><>v<>^^<<^>v^>vv^v^><<^v^>><>>v<>v><^^^^<<>^>>>>^<^v^v^> +^<>vv>><^<>>^<^<<<><<^>><^>>^v^<^^^^^>><^v>^<>^>>vvv<^>v^<>v^v^^<>vvv>>^v<<<^>v>v<^<>>>><^^>v><<^>v^>><>^^<^>>vv^v>^v<<>vv>^>v>v^^<^><>v^^vv^>>vv^<>v<^<<^^<>v^<>>>>^^><^^^^>>>v>>>^^v>v<<><vvv>>^^v>^v<>^vv^<<^>^<<<>^>^^><<<^^vv>><>>>>>^>><>v<>>>^<<><<<<>>v>>^^^>>v>v^^^><>>^vv<>>^^<^>>^><>^v^^<^><^^><^>^^v>vv<>vv<>^^<<^>^><>^vv^^v^<<^>v^^>><^>><<>>^v^>v>v^>^^v<>v^v^v>^^>^>^v^^^<^<^<^v^<<<<^>>v<<^^v^>v^>v>>>v>v><><<<^^<^><>>v<^^^>^>^^vv>><<<<>v<<>>v^v^v^^<^^v^vv^<><<>>>>v>v<^^v^><^v^<>v>^v<<<>>v^>vv><^>v^v<<^<^v>>^>vv>>v>v^^><>v^>^v><<><<><>>>^>>^v>v><>^v<>^vv>>>^v<>>>v<<>^<^>><^^<>^v><^vv<^v<^>^v^v>>^^v^v^v><<>^^^>^>^v>>>v><^^^^v^>v<^<^>>>> \ No newline at end of file