From 779f21a289702b5880a57606b687da6eb8cdad0b Mon Sep 17 00:00:00 2001 From: Dory Date: Sun, 15 Dec 2024 15:17:48 -0800 Subject: [PATCH] d15 --- day15/d15p1.swift | 97 +++++++++++++++++++++++++++++++++++++++ day15/d15p2.swift | 114 ++++++++++++++++++++++++++++++++++++++++++++++ day15/input.txt | 71 +++++++++++++++++++++++++++++ day15/test.txt | 21 +++++++++ day15/test0.txt | 10 ++++ day15/test1.txt | 9 ++++ 6 files changed, 322 insertions(+) create mode 100644 day15/d15p1.swift create mode 100644 day15/d15p2.swift create mode 100644 day15/input.txt create mode 100644 day15/test.txt create mode 100644 day15/test0.txt create mode 100644 day15/test1.txt diff --git a/day15/d15p1.swift b/day15/d15p1.swift new file mode 100644 index 0000000..aff907e --- /dev/null +++ b/day15/d15p1.swift @@ -0,0 +1,97 @@ +import Foundation + +enum Move: Character, CustomStringConvertible { + case n = "^" + case s = "v" + case e = ">" + case w = "<" + var description: String { return String(self.rawValue) } + var delta: (Int, Int) { + switch self { + case .n: return (0, -1) + case .s: return (0, 1) + case .e: return (1, 0) + case .w: return (-1, 0) + } + } +} + +struct Item: Hashable, CustomStringConvertible { + let (x, y): (Int, Int) + var description: String { return "(\(x), \(y))" } + var gps: Int { return x + 100*y } + func move(_ m: Move) -> Item { + let (dx, dy) = m.delta + return Item(x: x + dx, y: y + dy) + } +} + +struct Map: CustomStringConvertible { + let walls: Set + var boxes: Set = [] + var bot = Item(x: 0, y: 0) + var (w, h): (Int, Int) + var description: String { + var s: [[String]] = Array( + repeating: Array(repeating: " ", count: w*2), count: h + ) + walls.forEach { w in s[w.y][w.x] = "██" } + boxes.forEach { b in s[b.y][b.x] = "▒▒" } + s[bot.y][bot.x] = "🯅🯅" + return s.map { row in row.joined() }.joined(separator: "\n") + } + var gps: Int { return boxes.reduce(0) { s, box in s + box.gps } } + + init(from s: ArraySlice) { + var walls: Set = [] + h = s.count + w = s[0].count + for (y, line) in s.enumerated() { + for (x, char) in line.enumerated() { + switch char { + case "#": walls.insert(Item(x: x, y: y)) + case "O": boxes.insert(Item(x: x, y: y)) + case "@": bot = Item(x: x, y: y) + default: () + } + } + } + self.walls = walls + } + + mutating func move(_ dir: Move) { + var pushes: [Item] = [] + var next = bot.move(dir) + while boxes.contains(next) { + pushes.append(next) + next = next.move(dir) + } + if !walls.contains(next) { + if !pushes.isEmpty { print("pushing box \(pushes)") } + pushes.forEach { boxes.remove($0) } + pushes.forEach { boxes.insert($0.move(dir)) } + bot = bot.move(dir) + print("moving bot to \(bot)") + } else { + print("noop") + } + } +} + +func readInput(_ filePath: String) throws -> (Map, [Move]) { + let content = try String(contentsOfFile: filePath, encoding: .ascii) + let lines = content.split(separator: "\n", omittingEmptySubsequences: false) + let blankIdx = lines.firstIndex(of: "")! + let moves = lines.suffix(from: blankIdx + 1).joined().map { Move(rawValue: $0)! } + return (Map(from: lines.prefix(blankIdx)), moves) +} + +var (map, moves) = try readInput(CommandLine.arguments[1]) +print(map) +print(moves) +for move in moves { + print(move) + map.move(move) +} +print(map) +print(map.gps) diff --git a/day15/d15p2.swift b/day15/d15p2.swift new file mode 100644 index 0000000..4cff6d9 --- /dev/null +++ b/day15/d15p2.swift @@ -0,0 +1,114 @@ +import Foundation + +enum Move: Character, CustomStringConvertible { + case n = "^" + case s = "v" + case e = ">" + case w = "<" + var description: String { return String(self.rawValue) } + var delta: (Int, Int) { + switch self { + case .n: return (0, -1) + case .s: return (0, 1) + case .e: return (1, 0) + case .w: return (-1, 0) + } + } +} + +struct Item: Hashable, CustomStringConvertible { + let (x, y): (Int, Int) + var description: String { return "(\(x), \(y))" } + var gps: Int { return x + 100*y } + func move(_ m: Move) -> Item { + let (dx, dy) = m.delta + return Item(x: x + dx, y: y + dy) + } +} + +struct Boxes { + var boxes: Set = [] + func at(x: Int, y: Int) -> Item? { + if boxes.contains(Item(x: x, y: y)) { return Item(x: x, y: y) } + if boxes.contains(Item(x: x-1, y: y)) { return Item(x: x-1, y: y) } + return nil + } +} + +struct Map: CustomStringConvertible { + let walls: Set + var boxes: Boxes = Boxes() + var bot = Item(x: 0, y: 0) + var (w, h): (Int, Int) + var description: String { + var s: [[String]] = Array( + repeating: Array(repeating: " ", count: w*2), count: h + ) + walls.forEach { w in s[w.y][w.x] = "██" } + boxes.boxes.forEach { b in s[b.y][b.x] = "🮇🮀"; s[b.y][b.x+1] = "🮀▌" } + s[bot.y][bot.x] = "🮕🮕" + return s.map { row in row.joined() }.joined(separator: "\n") + } + var gps: Int { return boxes.boxes.reduce(0) { s, box in s + box.gps } } + + init(from s: ArraySlice) { + var walls: Set = [] + h = s.count + w = s[0].count + for (y, line) in s.enumerated() { + for (x0, char) in line.enumerated() { + let x = 2*x0 + switch char { + case "#": walls.formUnion([Item(x: x, y: y), Item(x: x+1, y: y)]) + case "O": boxes.boxes.insert(Item(x: x, y: y)) + case "@": bot = Item(x: x, y: y) + default: () + } + } + } + self.walls = walls + } + + mutating func move(_ dir: Move) { + var pushes: Set = [] + var nexts: Set = [bot.move(dir)] + while !nexts.isEmpty { + let next = nexts.removeFirst() + if let box = boxes.at(x: next.x, y: next.y) { + pushes.insert(box) + let movedBox = box.move(dir) + switch dir { + case Move.w: nexts.insert(movedBox) + case Move.e: nexts.insert(Item(x: movedBox.x+1, y: movedBox.y)) + case Move.n, Move.s: + nexts.insert(movedBox) + nexts.insert(Item(x: movedBox.x+1, y: movedBox.y)) + } + continue + } + if walls.contains(next) { + return + } + } + pushes.forEach { boxes.boxes.remove($0) } + pushes.forEach { boxes.boxes.insert($0.move(dir)) } + bot = bot.move(dir) + } +} + +func readInput(_ filePath: String) throws -> (Map, [Move]) { + let content = try String(contentsOfFile: filePath, encoding: .ascii) + let lines = content.split(separator: "\n", omittingEmptySubsequences: false) + let blankIdx = lines.firstIndex(of: "")! + let moves = lines.suffix(from: blankIdx + 1).joined().map { Move(rawValue: $0)! } + return (Map(from: lines.prefix(blankIdx)), moves) +} + +var (map, moves) = try readInput(CommandLine.arguments[1]) +print(map) +print(moves) +for move in moves { + map.move(move) +} +print(map) +print(map.gps) diff --git a/day15/input.txt b/day15/input.txt new file mode 100644 index 0000000..58e8188 --- /dev/null +++ b/day15/input.txt @@ -0,0 +1,71 @@ +################################################## +#...O...O##..###.O......O...O#.OO##..O#....OO#OO.# +#...OO........O..O.##..O...O...#....OO..#.......O# +#O.....O..#.....O..OO#OO.#O..OOO.#.#.............# +#......#OOO.O.OO....#.#..OOOO.OO.O#O..O..O..##...# +#.O####.O...OO.O.#.OO.O#O.OO#............O#.O#...# +#....O.#..........#O...O.OO#O.#....#..O.OO....O.## +#O..#...O...O.OOOO.O........O..OO.O....O.O#....O.# +##O........#O.O.O.##.#..OO#....O..O......#....O.O# +#...#OO.OOO..#.O..O..##...#...O#O..O.........O...# +#.#O#....#.#....#.O..OO#.....#...OO#O...O.#O....O# +#.........O#O#OOO....O.O........OO..#..O.OOO.#O.O# +#O.#.#.O..#.O........#.OO#.....O........OO.O.O.O.# +#..O.O....O.O.........#...O.O..OOO..O...O...O....# +#.....O......OO....#..O.O.O.............O...#..O.# +#..OO#....#...O..........O.......O..#............# +#OOO.O...#....O...OO...O.O...OO##........#O......# +#...O.OOOO.....OO....#.O.O.....O.............O..O# +#.O#....OO.#....O.#.....#....#...OOO........O..O.# +#O.O..#.#O...O#...O.....OO..#....O...O..##.O....O# +#O.OO.....#O....O..OOO.....O..#.....O..O...O.OO.O# +#...O#.#O...OO.O...OO..O..O..O.#OO....#...O...#OO# +#O..O....OO.O...#...O......#O..#OO.O..OO#O.......# +#.O............O#OO.O.#...##.O....O.O..O.....OO..# +#..OOOOOOO..O.O...OOO...@.OOO#.O....#.....OO....O# +#..#....O..........#O..#.....O..O..O.O....OO...O.# +#O.O..OO.O..OO.O.O.##..OO..OO..O#..OOOO.O..O...#O# +#.#.........OO.OO..........##...OO...#OO..#O...O.# +#....O...O......O#.O.OO..#.O....O...O....OO.OO#..# +##..O.....OO..O.O....O#..O...#..........OO#O.O.OO# +#OO.OO..OO.OO..OO.O......O#OO..OOOOO......#..#.#.# +#OO.#.O#O#.##.O..O#....O...O....O.#O....#..O..O.O# +#.OO.#OO.OO.O#..OOOO.#..........O.....OO....O.O..# +#O......OO..#..O.OO.OO.OO....#O.O#.....OO##.#....# +#O.OO..O..#.....O.....O......#.....#......O#.....# +#.O....O#.OO..O......O..O.O.....O##..OO.O..#.....# +#..#......OO.....#..OO.O..#....OO.O.......#.#O.O.# +#...#.OO..OO......O.#O.OO#.O.#OO.....OO.#....O.O.# +#....OO.OO..O.O.O.#.OO..O......O........O..#.#O..# +#..O.#..O..#.O.#.O....OO......OO.O..........#.OOO# +#O....#O.....OO#.....O.O..#....O..#O...O..OO....O# +#...O..#O......O#..#..O..#.........O..O...O.OO...# +#....O#..#.O........O.O...#...O.....O#O.O.O....O.# +#.O..OO....#OO....O....O#..O.....O..OO##.....O.### +#.#..O#O........O#O..O#...O.....O#O...O##..O.O...# +#...#..O...O..#O.OO...#.OO.O.....OO...OOO.OO..#..# +#O.................#....#O........O..#.....OO....# +#.#..........O.OO..O.............O..O..O#..O.O...# +#........#.....O.....O..#..O#..#.OO.O......O.#.OO# +################################################## + +^<<>>v>v<^^>^>>v<><<^vv<<>^v^^><<>v<<>vv<<^v>v>>v><><>vv<^^>>>v<>>>^^^>>^v^^>>>>^vv^v^<<^>><<<^^^vvv>><<<^>v^vv<>v<^>^>vv^<<^^vv>v>^v<^vvv^<^>^><<^v^^<^><^^^^<>>v>>v>vvvvvv^<^v>^>^>><v>><>v^v^<<^v^^>^^^><vv>v^^>^<>>>^vv<<^^<^v^v^v<<>v>^v<>>>>^>vv>^v<>>>v>^<><^^^<>^>^>v^>^v^^vv>^vvv>^^>vvv<>>vv>v>>><^>v<>^><<^>vvv^<<^^^><>^^v<^^<^<>v<<<>^v<^vv^v^<>^v^^^<<><^<<>>^>^v^>v^v^v<><<^<>v>><>><<>><<><>^v<>>v>^^>^^><<^<^^><^><>v<<>>>vv<<^<<>vvv^^^<>^v>vv^>v^vvv<>>v>^><>v^^vv><^^^<<>>vv^<<^^^>^<>><^<<<<><<>v^>>^^v><>v^<>>^^vv>vv>>v>>><^^<><^<^^v>>^vvv^>^><<^v<<^v><<<>^vv^<<^v^>^<>^^<>^v^<<^>v>^vv<>^^<>>^>><>>^v<>><>>>^v^>v>^<<v>^<^^vvv^^v<>^>v<vvv>v^v^><<^<<<<>^v>^<>v^^<<<>^<><<>vvv>>^vvv^v<>^<vv^v>>v>v>>v^vv^<<>^^<^vv>^>^v>>v<^vv^>vv>><>vv^^v^v^>><> +<<^vvvvv^^><^>^><^>>^<^<<>>v<<^v^><<<<<^<<<^^^^<^v<<^vv<^<^v>^v<>^^>>v>><<^vvv>v>vv<>vvv>vv>vv><><<^>^vv><^<<^<>^^<<^^<>v>><>>>v<<>v^^><<>^>v^^v<^^^v^v<>^^><^>^>v<>^v^^>>>v>>>v><<>^^><<^>>^<^^^^<^<^^^v>><<<^>v<^vv>^<>v<^<>>v^v^<^vvv^>^><^^<^<^vv>>>vv^<><<>^^v^<^vvvvvv^^^v><^^>^vvv><>v<>vv^><>^>v^>^^<<^>^<^<v<<^^v>>^v^^^v<<^^<<>><>^>v<^<<^^v>^>vvvv^v>v^v<<^^<>v^<><^<^^^vv>><^v>><>v>^>v^vv>^^>>v^><<><>>>><^v>><>vvv^><>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><>v<><<<>><>v^<^<vv>v<<<><>>><><>>v><^v^v>^v>><<<^<^^<^<>v<<^>^>>^vvv>v^v^<><^^>v>^><^^<<<>>vvv>^v^><>>v>v<^^<^>^>>^<^vvv^<>^^>v>v<<^<><<<^<^^>v>v<<>^>^^v>>>>v><>v>vvv> +^>^v><^^>vvv>>^<v^^^<>>^v<^<<^v^^>^vv>^^^^^>vv^^^v^vv^v^vv<>>v<>v^v>>^^v^^>>>>>>v<^>^>><<>vv<^<<>vv<><<^>^^<<>^<<<>^>^^^v^v>^^vvv<><^^v<^v<>>>^>v^<^^^v<^v>v^^>>vv^^>>vv>^v^^><^<<^^<<>>^v<<>vv^v>v>>>v><<^<>v^><>vv><>^<v<<>v<>^>v^v^>^^><^v^<<^<<>>>^^^>v>v<<^>^^<>v^^>v^<^v<>^^^<>^v^v<^^vv>^v>^>>^vv^^^^^<>>^>v^>^^>>><><<^^><><><^^v<<><<<<>v^v^v<>v^><^^>v>v^^^v^v<>vv^vv<<>><^^vv<<<^^<^v<^>^<^>v^^<<>v>v<>vvvv<<>v^>^^^<v<<^^vv>>v<<<<>v<<<<^v>>v^><<>vv^>vvv<>>^vvv>^^<>^^^>vv^^^v<^^v<>>^<>>v<^>>^v<<>v>>>>^v^^<>^><<>^>v^^<^vvv>v>v^^^<^>vvv^v^^^v^^<<^vvv>v^>v<>>v^vv<^v^^<><^^^>vv<<>>v<>^^^>v^<^<^>^^vv<^vv>v<^^<<^>>><^>><^^^<>^v<^<<>>^^v^<^>>^v^>^v><<>^^><<<<<^^<>>v>^^v>><>>^^>^vvv>v><><<>><^v>^v>v<<>v^>>^^<<<^<>^>>>^v<<vv<><^<>v<^v<>v^v^^vvvv<<^^v^v<^v>><^<v><^v><>>^^v^>vv^<>><>>>v^<>><<>v>^>><<>^^v^^v>^>^>^v<^>^^>^v<>>><>>v<>>v^^^^^>vvv^^v<<<<>^^>^v><<^>><<<^<>^>^v<>vv<^<>>><^<>><>^^vv^vv>><^v><>v^^vv><><><^^>>><^>>^>v^<<>^vv>^^<^>><<^v>^v>v^>>>v^v^v>>^<<>^v<>><^vv^^^v<>^^^<>v<<>^^<^<<><^v^^><>^>v^v<^>>^v^><<<<^^v<^<^^>v<>v<>^v>^v>v>v<><><><><<^v<<<>^<><^^>^vv^>>><>vv<>v^^<<<>^<<^><>^^>>>>^<>v>^>>v>>^><><^vv<<^^>>^>v^<<v<^><><<^vv^v><^v<>v<>vvv<>^<^vvv<>^<<^v^v^>vv^>v><^>v<>^v^><^>v><<^^v><<>><>v>>^v<>>v>>v<>>v^^<v<^>v><>v<^><^<^><^<^^>>>>^<>^<^v>^^<<^>v^<><>v>v>>v^v^^>v^^v<>^<^>>>>^>v>^^<>^vv>>^<^<>vv^^v^v^v^<^vv>>>v>^>v^^v>>>v^vv^^^>^^^vv>>^<^v^v>^^>^>v<><^<^^>^>><>v>>^><>v<>^^><>><^^v<<><<>v>^^vvvv^>^>>vvv>>^v^>^>vvvv>v<<v>^^^<^<^>v^^<^<>^v^^><^^<^<<<>>v^vv><<<>v><^<<<<>>^<>^v>v^>v><^><>v^v<^<^^v^vv>^><>^^<>>^^>v>^<<>vvv<^^<<<>^<^^>^<^v><<^v^^v<<<>>v<><<^^v><><^<<<>^vvv>><>v^v<>>v<>><<<<^v^v^><<v>^<^<>><>v>vvvvv<^><^>^<<><>v<>v<<>>><<<>v<><<^^<<<^^^v^v<^>v>^vv<<>^^^>vv^<>v^><<>>^>>>><<vv>v<><^v>>^<^^^^v^^^^vv>v^v>>^v^<<^v<<>vv^^vv^^<^<^^v>>^vvv>>>vvv>><^<<^<^^<>^v<^v^<<>>^v^<^<><<^^<^><^><>>vvv>v>v^>>^^^v<>>><><^<^>><v^<<>v^^>>^v>^^>vv>v><<^>v^^>><>>^<<v<<<>v^vv<>^<><^v>v>^^>^<<>v^^>><>vv>^^vv>vvv^<<^>v>v>^v<^<^v^^^<<<^>v^^v<<><v<^v>^><<><^^vv>v>^^<v^vv>v^>vvv<^^v>v^<v<^>>>^v^^^>^^^<<>>v<<v>^><<>^^>>>>^v><<>^v^^^>>v<<<>vvvv>>^><<<<>^v<>>>^v^v<^vvv>^v<<>><^><<><<>^^>>^^<<v^vv^>v^>v>v><^<><^^vv^^^>^<^^<^v^>^v><>>^v<v>>>^v>v>^>^vv^<<>^v>v>^^^>^<^^v^>^<>^><^><^v^>^^^vvv<>>vv>^<>^^>v^v<<>^^>v>^><^<<<<^>vv^v^v^>v<>v<^vvv^<>v^v^vvv<^>v>vv^<>^^>^>v^v<<<>vv>>>vvvv>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>>>>>vvvv<^v^>v>vvvvvv<^<^v^<^v^^v>^v<<^<>v^<<^^>vv^><><<>>v^>>>v^>^>>>vv<^v^^vv>v<>^><^vv^<^v>^><^<>v^>v>vv^<>v><>><^<>v>^v^>>^v><>>><>v><>vvvvv<<^^^<>v>v^>^v>v^^v^^vvv^>v^vvvv>><>v^vv^>v<>^v^v<<^^vv<>>>^>>^>>>>v><>v^v<>^>><<>v>vv>^>^^>>>vv<^>v>>^<^>^^^>>^^<<>vv<<<<<>^v>^><^<<>v><^>v^^v<>^^><>^<^<><>>^v<<>><<^>v><>^<<>><<>vvv +>v>v<^vv^^<<>v<><^>>vv^v^^>><><>v^>>vv>>^^<>>vv<<^^>>>vv^v>v<^^>v<^><^<^>^vvv^<>^<^^^<^>>^^>>v><><>><<>vv<>><<><^^<>>^^<^<^v^>^vvv<<<><^>v>^^<^>^v^><^>v^^v^v>>^>^>^>>^>v>^^^v<<^<^>v^<^<^>>v^<^<<<^v<>><^>^>v^^^<^v>^>^^vvvv><<>vv<<<>v^vv>^><^^^><^^v^^^>v^v><>v^><>>v<>vv><>^^>>v>v>>^<^v^^v<<>v^^v<^v^^v^^><>^<>^^vv^v^^v^>><^^>v>>>>^><>^^v>^^^<>v^^^^>^v>vv<^v<^^^^<>v^<^v^^v>v^>^>>vv>v>v^^^^^^v^^><^<>^>>><<^v^>vv^<^^v<><><>>v<>^>v>>v^vv>v<<>>v>^>^>><>vvv><^^>>>vv^<><^v<>v>^>><^^^><>>vv^>>vv^>v^<^>^v<^^v<v>^vv>>v<^><>^>>^^<>vv^<^v^<><>>vv><<>v>>v^^vvv>vv><<^<>^vv<>^<^^vv^<<^v<<>^<^>^v>><>^<^>><><^vv^v>>^>v^^v<>v<>^>v^^v^^v>v>v><>^>><^v>^>><>vv>^>>v><><>^vv>v^^^vv^^vv>^^<^>vvv>^><>vv>vv<<<^v<<>^<^>>v<>v>^vv<<>v<>v^v>v>><<^>^v>>>>vv<<<^^>>^>^^v^v^v>^>v^v<>vv>^v><><>v>v^^<>>v^^><<<^>^^<><^v>^v<>>>^<^v<^^>^^>>^^>^^<>^>>>v<><>>^^v^v^^v<^>v^v<^<<>^v<v^vvv^>v<<>^v><<^vv>v^<<<<<^>^vv>>>v^<>v<^>v^>>vvv^vv^>><^^^^^v<^^<^>>v<>v^>>^^><^^>^v>v^><<^^^v><>^^><>v^vvv><><>v>v><<<^^>>v<^<>vv^vv<<>^^>v>^v^<>v^^^^v>><^v^<>>^>^>v<><^vvv<>v^^^<^v<^v>>>^^>v<<<^>><^vv^v^v^<<>>^>^>>^>>vv^v<<<^^>^>><^^v^>^^<>^^>^^^<^<><><^^>^vv>>^^>v<<>>>vv^v<>^>vv<<^vv^><>vv<^<>v^v^>vv^v^vv>^><>v<>><^>>>^>v<>v^>vvv><^v>><^^<>^v><^vv>^<^^<<>v>v^v<^v^v>>vvv>v><v>>^vv>v<^>>>vv<^<^>v^v><^^^>>>>^vv^>>v>^^^v>^vvvv>^<<>^>><>>>^^v<<>^>>>^>v^>>>>^v><^><v>><>v>><^v^^^^>^>>v^><^v^v>^v>vv<>^^<>>^^vv<>v>><>>>>^v><^^^v^^^^vv<^>><><<^^v>v><>^>^v<^^v>v<^>v>^<>> +>v<<<^v>v<><<>>><><<>v^<>^vv>>>>v>vvv>^>^>>^<><^^<^v^>>>^^^v^>v>vv<<><v><^>>^v^v<><><<><^><>^<^<><^>>^^<>vvvv>v^>^>vvv>^v^<<^<>^v>>^<^^v<^><>>>^^>^vv>^^<^^><^<^>^^^>v><^v<^v><^>^v>^^v^<>>><>>><<<^v>>v>^^^<^<<^v>>>v^<^>^>^v>^<^>>v<>v>^vv^^<<>v^^^><>^^^^<^^><^^><>^><^<><^vv<^^^^v>>v><>^<>>>v^>>v^^^<>v<^^v<>>^v><>^^v>v^<<>^v^vv<<><^^>vv^v<>v>vvv>v^^>^>>v^v>^><^<^^<>^^^v>^v^><<><^>^v>^v<^>^^<^<<^<<^v^>v^^<>>^>>><>^>^v<v<^<<^<^><^<^>^v<^vv>^^v^vv^v>v^v^>>v<^<^>^v>v^^<^^v^>vv^v^^v^^^>><^^^><<>v^^^<>v>>vv^>v><^<^^^>><<^><<^^v>>v>^>v^<>v><^v>vvv><^^v^^>v>v><>v^v<>v^v<^^<^^vvv^>^^v^><>v^^>>^^^^v>>>>v><^v>>vvv^v>^^v>>>>v^^v>>vvv^v>^^vv^v^><<^<^<^^<<<v>^<<^^^^<^<><^>>v>>v<^^<<><^^vv><>><<^<<^v<>v^^vv< +<<><>vv>v^^^^><>v><<<<^^>v^<>vv<^^^v^<<^^><>>>>>v>>>><<v^^^^v>v>>vv^<><>>^^^vvvv^<>><<>vv>v><^^<^>^>><>^^v^>v^>>v<^><>>^<<>v><<vv<^vv>vvvvv<<^vv^>v^v^^<<><^^v<<><^<>>>v>^^v>v><<><>vvvv>v<<>v<>>^^<^<^>v^v><<>v^v<<><>>>>>>^v<>^v<><<^<^^^<<>>v<<>v<^>>^^<^^<>vvvv<^>>>vv>v^^^<<^^>^<><>>>^^>>><<^vvv<^^v>^v^^^>>^^^<<^^v>>>>^<<<^<><>><>>>>v>v<<v^><<<^<>v<<>vv>v<^^^<>^v>>^^v^^<><>^>><<<^<<^><>^^<<^>>v><><<<<<<<>^^<><^^><^v^<>vv<^>><>^>>>^v^^v^vv>v^vv>v^v^>>>>^>><>^>^>vv^^^vv>^>^^^v^>v>v^vv><^>v^>v<^v^>v^^v>v^vv>v>>>v><<<^>>v<<><><^<^>v^v^vv^<^^v^<<>>><<<<<^^v^<^>>>vv>>^><^>>^<>v>><>>^^>>>^><>>v^<^>^>vv^^<>^>^v><><^^>v^v<^^>v>^v<<<<>^>v>v^vv>v<^<>v<^^^<>>^>>v^v<>^>^><^v^^>v<<^v<^>^>>^^^^>><>v<><>^>vv<vvv<>>v<v><<^^^>v^>^v^^>v<>vv^v>><>>>vvv>v<>>^>^>^^^>^>^> +<<^v<>vv^^v>^>v^v>>vv<>>^^^v^>vv^<^<>vv^^vv><^<^^>^>><^>^<><<>^vv>v^^<^v^^<<^^<>^<^<^>>v<^^>^v^^^<^^^<>v^^>vv^^vv^<<<^<^vvv>vvv^<^v^>v>>v^v><>v^^^<>>^>>vv<^^vvvv<<>v>>^^^<>><^><^^>vv<^^>v^^><><^<^v^<^^>>v>^<^><><>v>><>>^^v<><><^^vv<>^>vv>^>v<<>>>^<^v^^v^v><>v>^>vvv>>>v^^><<<^vv^v^vv>vv^^<>>vvvvv<^<^^>^<<^><<<>^v^>v^^v^v><<>><<^^>>>vv^^<<<^^^vv>v<^^vv^<<>vvv>^>>v<<^v^^v^>><^vv<>^v^<>vv^<^v>><^v^>^v>v>vvv><<vv^v>^^vvvv^v<^>>v>^^^<>>>^>><^v<^<<>vv^>><^v^^>vvv>>^<<>^>v><>>>^v<^<<^>v<<^>>>>>>>v>vvv^>v<>>>><<>>vv^>^^^<><<>v^>v>vvv^v<^vv><<<<^^<^><>><^^>vv>v^v><>vv^<<<>>v<<^^<<^^^^>^<^^><^<<<<<^v^^><<^v>^^vv>^vvv>v>v>>v><>>^>v<v^v>^vv>>^vv>v<>>v^<^v>v^v<v^^^>>>>vv<^v +vvv>><<<<^>v^>>><^><<<^<vvvv>^vv>^^<^<<><><<<^>vv>vv^<>v^>v>><^<<^vv<><><<^^>v^<>v>vv^v>>^>^<>v^>^v>^v<><^<^^vv^vv>^vvv^vv<<^v^v^^v^<^<>v>v>^^^v<>^v>><<>>>v<^<>^vv>v><^v^v^<<^>>v><>^^^v^v^v>vv<v^v><<><^^><<>>v>>v><>^^>^><^<<>><>v>vv^<><><<>vv<^v<><^^<>^^^>^v^>^>>vv^vvv>>^^v^^>>v><^v>v>^>v<<<>vvv<>vvvvv^v^^v<>v>^^>v^<<^>>>v^>v<>>>>^<<>^><>>^^<<>v^>><<>>vv^<<^v>^>^>vvv^v<>^<^^v<>vv^^^>>>><^v<^v>>>><<^^<>>^<^v^<^^<><><^vvvv<>^v<<<>>v^^><<<>>v^<>^>^>^^^>>v^^>^v>>^>^<>^>^<^>v>vv><^v><>^^^>^^vv>vv<>v<^v>^^><^<<<^^<>>v<^<<<<>^>v^v^^>v<>^vv<>v<<>><<>^>v>^v<<>v^v>^>>^>v^<><<^^^^<<><>>^v><>>><^^>>^vv<<^^vv<><^v>^^^^v>v>^v<>v^^v^>>^>>><^^><>v><^<^>v^<<<^v<<>>v>>><^v>vvv<^<>^v^>>^>v<vvv^v>v^v<^^v>v>>^>^v<>vv>>v>>v^^v^^>^^^<>< +^v^^^v^v<<>>vv^v^^^^vv><^><<>>^^^>^<<^<^^>>><^^>v^<><^>^v^^^<^v<>><<>>>v>>vv<><<^^v<<<<<>^^v<^v><^^vv<<^><><>v<>v<<><>>v<^v>v>><><^^v^^^vvvv^>^^><<<v^^<^>>^<^<>^^>>^>v>^<<>>^^>><<<><^vvv>>^^>>>vv<v<<<<>>v>>>v^>>^^^><^^^v^<>vv^^^<>^>>^>>^v>v><^^>v^>vv>^>>>>v>^^<^v>^>^vvv><><^<^<>>^^v<>vv<<^>>><<v>v<^^>>^><<^vv^<<<<<<>>^>^^v^<>^><<>^v<<v>>v>>^^<>^^<<>v<>^>><^<><<^vvvv^>>^^^<^v<>^v><<^v><^^vv^<<<v>^<>>^^v^><><^<<<>^<^v^><<>vvv<^>^>v<<<<^^v>^^v^>><^v>vvvv^^<<>vv<^>>^^<>^<>^v>^>>v^><^^v^>^^^^v<<^v^<>v^<<v>v<<^v><>v<<^>v>>^^<^>^v^>v<^^v^v<<>v<^^^>>^><>>>>^>v^><><<^v<<^>>v^<><<^^<>>^v^^^<^<^><^^><<<>v>>>v^>v^v>vvv<<<<>>v^>v>^vv>>v>v>v<>^vv^^<^v>^v>v^^v^> +^^v<<^vv^<^<>>>v>>^^v><>v>^><<<><^^<>vvv>^^>^>><<^v<><>^^vv<<>v>><^<^^<^v>v^vv>vv<>>v<<<<<<<<><^>^>>v^^<^><>v<><<<>^^^v>^>v<<>vvv^<^^>>>>v<^v>^><>^^vv>v>v^>>v<<>^v<><<>^><<^>^>v^<^^^v^^v<<^^vv^v<^<^<>^<>>><><^^^><><>^<^><><><>v>>^>>^>>>^^^<^<^^v>>v<<>^<>>^v^^^vv>^v>>>>v^>^>>^^<<^>^vv^v<^^vv^v^>^<<<>^<<>>^^^v^^^^<^v^v^<<>v^>^<>><><>>vv>>v<^<<^v<^<<<><>><v^^>vv^>>>><^v>v<<<>^^^>v><^>>v<^^^^vv<^^^^^<^v>v>><>><^<^>^^<>vv^^v^<^v<^^>^^^v>>vv^<<><^^>^v<<^><>v^v^^^^^^vv><<>^>v^>v>>v<>vvv<><>>>v<>^<<^^v^^^^vv><<<^^^^><<><>>^<^^>^^<>vv^v^>>^^><^^>^^^v^<^^>^v<<><>v^v<<^^>^^>^^>vvv^^<^vvvv^>^>^>v^<^^^^^^vvv>vv<<^v^><<^>v<<^v>^^>v>^v^v<>>^v>^v>^vv^>v>v>>>>^^v^><^<^<^^^^>v^^>^^v^^><>><^^<^v^v><^v<<>vvv<^<<^v^^<>^<><<^<>><^><<>><> +^^<><<<>v<<<>v^>v^v^^>>vv<<>>^>^vv^>^>>>^^vv^^v<>>>v<^>>^^<><>v>>v^^^>>><>^<^^v<<>^<^>>^<><^<<><>^^v><^><>vv>^v^vv^><<>^vv^^<^>v^<^vv><<^^>vv^v^v^><^>^>v><<^^v<^^>v>>>v^<^v>v<^<<<<<v^v>v>><v<^<<<^<<^^v>v>>v<^v^>>^>v^^<^^v<^<<^<<<<>><<<>^<>^><>vvv^>>><>>>^>^>^>^<<^v<>vvvv<>>>vv>vv^>vv>v>><^^^^<^^>v>^><^v^^<<><<^^v<<>>>^<>^>>^>^v>vv>>>^<^v^^v>v^v^<^v^v<^><>>>^<^<>^<>vv<<^^>^<^>><^^v<>>v<^vv>^<<><>v^>^^^<<^vv^>v<>>^^>>^v><^^^^<>^v^v^^^>^v^<>>v^v><>>v<^v>>^v<>v>vv>>^>>^vvv<>>vv^^^vv><^v><<>>vv<>^<<<<<>^^^>>^><><<<^>^^vv>^v><>^>>>^>^>><>>^v^v>v^>v>^vv^^^vv^<<^><^vvvv>><^>>^^^^>>>v^<^<^<^<^v^>>^v>^><<<<<>>><>v^v<>v<><>vvv<^>><^>vvv^v>v^v><>v>^>><^<>^^>vvvv< +v<<>^>v><^^^<^v^>^v<>>^<>>>vv<^^v>v<^^<<^>^>v>^vvv<^>>>v^v>><^vv^>><>vv<><<<>vv^v>>^>v^<^v^^<^>><^^><><^>>v^v^^<><<>>vv>v><<^v>v>>^v>>^>>^<^v^>v>v>>v>v<<<<><^vv<<<^>^^vvv<<>vvv>>vv^>><>vvv^^><<<>>v>^v>^>v^<<^><>^v^<><>v^<^<^<^^>^>^^^<^v^^><>^v<^v><<^<<^v>^>^vv<^v>>^^<^^vvvv<^<^<>vv^v>vv^vv<<^v<^<<^<^^>>v<<<>v<<>^v<<^vv^<^vv<^><<<>^v^>^^v^>v>^v>>>^<><vv>^^^>v>>>^^>>>v^v>^v>>v<^v^<>v^^><>v>^^v<^vvvv^><>^<^^><>><<>^^<>^^v<>>^^^>>vvv^^<^v^>v<>v^>>v>>v^>^^>v^vv^v>^>^v<<^vvvv>vv<^>^>^><^>^<>v<>^v>vv^<^^<<^^v<^vv>^>vv^><^^<>v<<<<>^^^vvv<<>v<^<^^>v^<^vvv<>v^^v<>^^<^^>v^vv>><>v^^v^>^v<>>>v^>v>^^<><>v<>>v><>^<<><>>>>v>>vv>v^>>^v^><<>><<<vv<^v><>v^vv<^><><<>v^<><^^<^>v^v>^v>^<^<^^>>^vvv<>>>v<^>^^^^<><^v<<^<>^^^^v><^v +^v^v<^v>>^^<<^>^v<<^v>>>^<><^>v>vv^v><<>>>>><>><><<>^^<>^^<<<>^vv^vvv>^vv<>^><^>v>v>v^<^>v>^>>^>v>v<^>>^^vv^v>v><<<^<^v<>v^>^v^v><^^vv^><><^>>v^v<<^v^vvvvv^^><^>>v>>^<>>>>>v><><<>^<><><<^>><<^>^<<^>vv>v>^>>^<^<>vv>^><>v<<<^>v><^^^<><>^v>>>vvvv>v^v<^>v^<>v<^>^^>^v>>v<<><^^v^<^^><>>^>v><<<^>vv>^^>>^v>v<^vv^>>^v>vvv>>v^^^v>>>^v>^<^^v<>vvv<<><<^<<<>^<>vv<>vvv<<>v^<^v>vvv<^v>><^vv>^>v^<<>v>v<<^>>^v<>^>^v>vv^v^>>v^^>>>vv^>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<>^^^<^^^^^v^>><><>v<><><^><^vv<>><^v^<^^v<><>v^>^^><><<>v>v>>v^vvvv<^^<>>v>^^><<vv^^v<>vv^>>>^^>^^^v^^v><>><><>v^vvv>>>^v>v^<><<^>v^>^^<><<^>vv^>>>>>><<><><^v<><^<^^v><^<^^^^>vv>v^^v<>v>vvv^^v^>><^v^>>>v>v><^>v>>^<<^^v^<<>^^<>>vv^v^^^<>^><><<>^vv^^<><>><^^v<>v>v>>^v><<^^>vv^<^v><><>vv^<<<^<^^<<><^^v>><^v<^vv>v^^^^v^<>v><v^>^^^vv<>^v<><v<<>v><>v>>>v>><<^>>vv><<>>vv<^^<^^^v>v^v^>>v^<>^<^^v<<>>>^^>^>>><<>^^^><><>v<>>vv>>^v<<^vv^<>vv^>>>^vv>v<<><><>^^><<<vv<>>vv^<^<<>^v>v>v<<><>>v>v^v<>v^<<>v^v^<^<<<>>>^>^<^vv^<><>>^^><^><<^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^>^^<^>v^vv<^><>^<<<>^>^>v^^v>>v^v^>^^<>><>^^v^^>^<<^<^<><>^^><<^v<<><>vv<>v>^<><^>>^>><>^^v^^<<<<>>v^><<^>>><>><>><^ +^v<<^^v>v<<^>>^<>v<>vv<<<<<<<^^^<^<^^>><><<^v>vv>^^>^>v>^vv><>>^^^>vv>v^>v>><><>v^>v^>^^<^<>^^<^>vv<>^<<>>^<<><^v^>>v^v>v^>v<>vvv^^<><^<>^>>>>>^^><<<^v<>v^><^>^v^v<<>v><<^>>^>>^<>v^<<><^>v>^<v^>>v^>^^><>>>^<<>vv^v^v>>>^><^^>v><<<>vv>^<v<^<^><<<^<^>>vvvv^>>>>><^^vv>^^vv^v^>><^^>^<^vv<^>v<<<>^vvvv<^>>>v^^v>>><<^<><>v<^^<><^^<^^^v^^>v<^^>^<><><>vv<^>^vv>^^>>>^><^>>^v<><<<>v<>v<^>>><<>^>v^^<^<<<>^^><^v<>v><v^^>^>v^v>>><>^><^>v>^<^>>v<>vvvvv>><^vv^<>^>>>^v<^<^>v>v^>vv^><>vv><^<><^<><<<>vvvv^v^vv<^vv^>^^>vv^^<^^v<><^v^>>v>v><^v^^>vv^v>v<<^^<^^vv>>vvv>^>^^<^>vv<^^vv^><>>vv^>><<<^<>vv^v>v^v>^^>^vv>^>v^^<^v>>^^v>^>><<<<>>^<<^^^^>vv^v>>>v<^<>>^v>vv<>v>>^v>^vv><v^<^v<>^>><^^^v>v^<^^>v>>^v>^<>v>^<^v^>>^>v^<<<^v<<>vvv>^>^>v>><<<<^>^<><>>>^v^v><<^v<>>>^<^>^vv>^^vvv><^vv>>v^^<><>>><<><<>^v<>vv<>>^<<^>>^>^><>v<^>^^^v>^v^v>v^^>v^>>>v><<>vvv^<^>^^>>><<^>vv>^<>v^v^^>^v<<^><>^>v^>^>^>v>><<^v^>^vv>^>v<<>v<^<^<><>^<>^^^v><>^>^^^>v^v<<>^v^^>v^><>>v^^^^^<><>v^>^>v<^v>>vvv<>^vvv^^^^vv<>v>>vv>><<>><<><<>>^<^<^v^<^v<^vv^<^<^>v^v>^^v><>^v>>^^^^><>>^<^^^v<<<>v>v>>v^vv><<^vv^>^>^<>^^v^>^^><>vvvv^^>v^<>^^><>>^vv>vv<<<>^<>>^><>><<>><>^^<<>v^v^v>v><>>>^vv<>^^<^<>v^^vv^v^^<>>v^v<^>v<^v><^><<<^>>><<<>v>^><<^^>^v<<>v<<^^^<^<^><^vv>>^v<>^><>^<<<>>^^>>>^v^>v>^v^>>v^^>^vv>vv><<<>^>>v<^>>^>>>>^<^v>v<^v<><>>>v<<><>><^^v^v><>>v<^vv^v>v^>v^v<>^^^<<<<<^^<<>^^>^>>><^^^<<>vv><>^<^v>>^vv>^><>^v<>^^vv<<^>^^<<<>^v^>>v^><>^v<>^v>><>^>v><>v<^^<>v^>^>^^>^^v>v<>>>>v>^^v^v^^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^ diff --git a/day15/test0.txt b/day15/test0.txt new file mode 100644 index 0000000..8163605 --- /dev/null +++ b/day15/test0.txt @@ -0,0 +1,10 @@ +######## +#..O.O.# +##@.O..# +#...O..# +#.#.O..# +#...O..# +#......# +######## + +<^^>>>vv>v<< diff --git a/day15/test1.txt b/day15/test1.txt new file mode 100644 index 0000000..6ee6098 --- /dev/null +++ b/day15/test1.txt @@ -0,0 +1,9 @@ +####### +#...#.# +#.....# +#..OO@# +#..O..# +#.....# +####### + +