Solved 2025 Day 1 Parts 1 & 2

This commit is contained in:
JISAUAY 2025-12-01 14:23:49 -06:00
parent 4f07ea9f81
commit 1a711cd261
23 changed files with 9528 additions and 0 deletions

71
2024/day15/input.txt Normal file
View File

@ -0,0 +1,71 @@
##################################################
#OOO.O.#...O.O..#.....OO...#.....OO.O..OO.....#..#
##.O...O.OO#.#.O.#.O.O...O#.OO.....OO..OO.O..#...#
#OO.O....O....O..........O.O...O........#.OOO....#
#..#.O#..O.O..O.O#..OOO...OO.#......O...O.O.#.OOO#
#...#..OO..........O.O...O....#....O#OO.O..O.#.#.#
#.#.O....O..OO....O#....O..OO...#.......O..O.O...#
#O...O.#OO..O...........OO.....#O...O.O.#.OO.OO..#
#O.O......O..#..O.#.##OO........#..##O.O#......#.#
#..O........#............OO...OO...OO###..O.OO.OO#
#..O..OO.......O.......#O..O#O..#.O..O...#......O#
#OO..#........#.O..O........O.OO.O#...O#......#..#
#.......#...#.....#..O.O.......OOOO#....O..#.....#
#....O....O.O.OO#OO#..OO.....#.##..O#O.....OO..O.#
#...OOO..O...OO..O..O.OO.O.#O..#O#..O.O...O...#.O#
#O.O...O..O....#.OO....O......O....#...#.O.OOO#.O#
#O#O#.O#......O.OO.O..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.OOOO.....O#
#.O.O...O.#..OO.....O.#..#..#....OO.......O.#OOO.#
#.O#...O..O...#...#..OO..OO.OO.OO..O#.....O...O.O#
#...O.O.OO.O.O.O.........O.........O..........O#.#
#....#....O##.OO.OO......O.OO.#.O.#.O...O....O..##
#..O...O..O.O..#O.O..OO.OOOO..............O#O....#
#...O#OO....OO.O..OO.OO.@....OO.O...O....O.O...#O#
#...O....O..#.##..O....OO.O.O.O..#.OO.#OO....O.OO#
#..O.O..#.O......#O..#O.O.#....O....#...O...O..OO#
#..O...OO.....O.O..O.O..O......O.OO.OOO...OO.O#..#
#....#.O..OOOOOOO..O#.O....O.O..OOO.O...#.O...OOO#
#O...O...O#...##...O....OO...O.O.OOO.O#.#....OO.O#
#..O.#.O#.OO..O.O.#..OOOO##O.O....OO.O.O.O#O.OOO##
#.O.O..O.....O..OO..O...O.............O.O........#
#.O.O.....O#OOO..#O#O...O.O.O..O.OO...#OO....O.OO#
#....#....O#OO...O..#...O.O...O...............#O.#
##....##...O#..O.OO.O..O.O..#..OO.O#....O.O..#O.O#
#O...O.O...........O##..#.O......#..#.#..O.O#..OO#
#.#.O.O...OO..OO.O......O..O.OO.O.......O..#.#...#
#.......O..#..#...#.......#OO.OO...OOOO.......#..#
#.#.......O.......#....OOO......#....O.O.O....O..#
#O#O..#..OOOO..OO.O....O.O......O##.OO......O.O..#
#..OOO.....OO..#......OO.##.O..OO...O.....OO....##
#.OO...OO..O#..O.#O.O..OOO..OO.O.OO......O....OO.#
#O..O.......O.O....OO....#.......O.....#.O.......#
#...O#...OO..#O##.O.O.O#O..OO...OO.O.OOO...O...O.#
#.#...OO.....O.#.OO...OO..#O...O...O.....O..O..O.#
#..#O......OO.....O..##...OOO..O.OO..O....#...#OO#
#......OO..##...OO.....#.....###...#O#O....#.....#
#O.#O#......#..OO........O#.OO........O...O......#
#...O..#...#O.....OOO...O..#.O..O.#O.O..O.....O..#
##################################################
^<>^<^>v^^^v><^<^v^<><><^^^>><>>vvv<vv>^^^^v^<v^v>>v>><<^>>^v<<>vvv<^>^<^<<vv^>>><>vv^>vv^>^<vv<^^><^>>v<vvv^^^v^v^>>>><vv><>^v^v<<^<>><v^v>^<v^^><<><vv>vv^vv<<<vv^^<<v<v><<^^<v<<>v^^^<^^^>>>v^^<>>^^>>><><^<><><v>vvv<^<v^v^<>^><><>>^>v<^>>><<v<>^>^v^v>v>^>v^v<v<>^v<^^<<^vv<^v><^v<><>vv><^<v>>^<>v<vv<<v<<<v>v^>>>^><>vvv><v<>^<v<vv>^<^>^>^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^vvv^^<>v><>v^^>>v^>v<^vv^v^>>v>^vv><><<^>^>v^^>v^>>^^>v^<<>>^^v^^^>>v><<<<v<<v<v^><v>^<^>^^^<v^vv<><<v^^>^>v><v<>^>><v^<^><^vv<>>^vv><v^>>>^<><vvv^^<v>^^^<>^v^^<><v<>vvv>><>>>^^>^<>v>>v<^^v>^<^^v<v>>v<^^v<v>^<>v>^^<<^<vvv^<<v^<<<><>>>^><^<v^^<v>^v><^<<<<>^v>><><^>^^v^>^<v<>^<vvv>>vv>v>><>^<>>^<v^^<><^>v><<<>>>^vv<<^>vvv<^v<v<<vv^v><<v^<v>><>v^<<<^><<<<<v<v^>v^>>v^>vv^><v^><<>><<^>>>^<v<><v^<<^<>^<vvv^>>v^><><>v^>>><v>^v><^v^<v<><><vv>><v>v^<>v^vvv^>>>v><<<v<<>v<>^<>v^^^^v>v>>v^<^<^<<
>>v^><^^^^><^<<vv^^v<^<><><vv<^<v^^><<<^>>vv<v^<^<v><^v^>^v>vv>><^^^^<v>>^v>^><v>>vv>^vvvv^^v^vv><v>>v^^>^vv>>vv^v>vvv>v^<v<^<<^^v^^>><><^>>><<v<>^<<>><>^>^v<<<vv^>>>>>>v>vv>^^v<<^^>v<v^>v>v^<^>vv^<^vv<^v^>^^v^v><>^>^v<>^^><v>v^<^v^><<>^<vv<>>^^<>v><^>><v>v<^>^^<<v<>^^^^>>vv^^^>^>^^v<>^>v>v^v<^^<>^v>v<v^<v<v>v>>>v><^vv^<<v<^<vvvv<^^v^<^><^vv><^^<^>v^>^^^^^<>v>vvv>^^<^<v><>><>^v>v^v^<^<>v>^>^^^><v>v>^<>^<<^v><>^^v<<v>^<><^>>vvvv^<>><v^vvv>^><^<<<<v^<<^^<<>><<^^><v^v^<>v>v>v^^>v<<^>v^vv<vv^>vvv<v>^v^^<v^v<vv<<v<^>>>>^^<v<v<>><>v>v>^>vv^v^<v>v^><vv<>vv>v^<^^<v^^<<><>>vv<v^<vv^^>>>^^^<>v>>vvv^>><<^>v<^^><<vv><<^<vv><^><v>><^^<<^v>^^><<<>^^>><v>>><v<<<<v^>^^>v>v^<^<<>vvvvv<<<^v>vvv<>^^<<^vv<><v^>^v^>^v>>v>v<>^<<^<>v>^>><^>^><>^<<^v^vv<<^><<^<^>v^^>^<<<v>^<v<v>v^v<v>>^vv>^<^>^>><^>^vvvvvv>^>^<><v<>>>vvv^>v^^<>v<^>v>v<<><<^>^v>^><v^>v^<^<>v^<<v><>^>^^v<^>>^vv^<>^v<><^>>v^>^<<^vv<^>vvv^>v><<>^^^v>v<<^>><vvvvvv><>^<><<<>>v<>>v<v^^>vv^>><<^v>>>v>^v>><^>^v>^>^^<v<<vvv^v<>^^v^<<v<^^>v^>>^<v>^^^vvv
v<<^<^><><>^>v^><vv^<<<<^>^^>>^<<^^<>^^^v<<v^<v<>><v<<^<><^^v<<<>v<^vvv>v^v^<<>>vv>^^v<^<v^<<<vv^>vv>>>>>>^<^^>^v<<^<<>^^>^>^><v^^v<vvv<v^>^^<^<<vv^<<^>>><^<>v^<>><^<<<v<^^<v^<>v<>^<<><v^<<>>>^v^>>^^v<<>v<v^v^v>^>^^>>^vv^>^<^^^<^^v^><>><vv<^>>v>>^v<^>vvv^>^^<v<^>>^><v^<v<v<<^<><<>^><<^>v^^v>^^v<<<vv>>^<<><v>><<vv^vv>^<v>v^^v><><><<>^>>vv^^>v^>v<<<^^<^>^vv><^^>>^v^^<<^vvvv^v>>v<vv^<>>>v^<^>>>^^<>^<v>>vv^v^<<^^v>^vvvv>^v<>vv<<<><v^^v><vvv<<<v>^><vvv>v<<^><^^><<<^^^^^>v>^vvvvv>^>^<v>^>v>>vv^<^<^v<<^>^>vv<<v>^>>v>v<>><<><><v^>>v^v>^v>^<v^<<^>^>>vv>>v<<<><^>>>vv^>v<vv>>v^vvv>><<^<v>^<^<>>v<<v>>>^><>^^^^vv<^^<^vv><vv<^>>v^<v^v>^v^>>^v>^><v>v^>^>^vv>^^<v>^>>^>^v<^^^v^>>>^>^><vv<<^<^<^>v^<<^^>^<^>vv<^^^v^^>^^v<>^^<^v^<^>^^><><>v^vv^>^>>>>^>v>vv><^vv<<<^>^<<^v^<^>><<^<>^><>^v^>vv>^v>>v<>v<<v^^><v^<^<v^vvvv<>^v<><vv^<<^^v^><>>>^^^<<^>>>v<<>>vv<v<v><v>v>><v>>^>v^v<v^<^^>^vv>>>v<^<<<v^v<<>v><vvv<v<^>^><>v^^^><<^<<>><<<<^>^<>>^^^>^>vvv<<<<v>>v^<vv><><^<v^v^<><v^^>^<^<^>^^v^>v^<v><v<><v>>><<vv<>><>^
>v^vv>^^>^v^>^<>><^vv<>>^v>v<<<^<<^>>>>^^v^>v^<vvv>>>^><<<^^v<v>^>^^^>><><<^vvvvv^<>^>^>^<^^<>^>vv<>^>^>v>^>>vv<v^<>>v^<<^^v^^v<v^>^^v<<>^^v<>v>vv<^<v<<<<<>^><<^<^^>vv>^<v<><^<^vvv<>>^><^^<>vvvv<<^^><<v<<v<<v>vvv^>^<><<^>>v><vv>v><vv<^<<<<<<^><<>v^vvv<>v>>>^<v>>v<^>v^v^^<^>>><>>>^<>v<>>>>>>><v^vv>><>v>v<<<v<<>v^>v<<vvv>^^<>><>><^^^^^^v>vv^<^^<><>^vv<v>^v^<<^v>>^v^v>^v>vv<^<<^v<>vv<>vv>v>^vv^<^>vv>v<v<>^^v>v<v^>v^<>v^^>^<^^vv<<><>>^>vv^<^>v^vvvv^v^<^v<<v^<>v<^<^^>v^^>^v><^v>v<v<>>>^^vv<v><^v<<<>^<^>v<<<v><<^<^>v<>^vvv<<<<v^<>v^>v^^<^^v<>><<><^<>>^vv>^^<>v<^^<>^>^<v^^^<^<^>^v<^<^^vvvvv<v>>^>^<v<v^^>v>^>vv^v><>^<v^>^>v>>^^^vv^<<^v^v^v^<v^<vv<<^<<<^><<<><v^v^>>><^<><>>^>v<>v>v>>>v>^^>><>>v<^<>^<>>^v>>>v^>>>v>v<^<^v<vv^v>>v^<<^v<v<<<^<>>>^<v<><><vv<<<><^^vv^<>vv<^<<><>>^v<>>v^vv^<<<^vv^vv^^v<^v<<v>>>^v>^<>^v>v<<^vv^>>^^^<^>><v<<<><v<v^vv<v>>><vv>>^<<<^v>v<>><<v<v^^^<<v>^v>^><<^><>vvv^^^vv^><><v^^><v>><><>^vv><vvv<v>^>^^<^>v^<vv<<<<>v<v>^^^^><^v>>^<^<>^<^^v<^^>>>>>><^<^v<^v<v<vv^>v<^>v<>^>>>
<<^>v>><>><><<>><v^>^>>^>^<>^^v<<<v^v<vv^<><^>^v><^><>vvvv^<^^>>v<<v^<^v<<vv<vv>>^>^v>^v>>^vv>^<>^v><^<^vv^vv^^<<>^^v^v>^v<>>vv<>v>vv<^<vvvv^<^>^v^v^<<vvv<v<^><><^>^^>^<>v<^v>^<>v<^<^<^>>^<<^^<v^^^^>v^vv^><<v^^v>^<>^v^>^^v>^>><^>^>^^v><<^<^>v<^><v>>>v>v^>^<<v<><^><^^<>^^vvv^v<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<^^<>><><^v>^<><<>^><<>>v>^^v^><>>>>v<<><>>^^>^^vvv<<v^><>><>v<<<vv^>v^v>vvv<^><v^>^vv><v>>>v>>^><^vv<^^<^^^<>v>^<^<vvv<>><vv<v^vv^^v>v^>vvv>^^<vv<<>><v^^vvv>^<<<>^v>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>>^^>vv>>><<^>v<^<^>v<<^^<<>>>^^<^>>>^>^<<^^vvv>>^>>v^<>^v<><<^>><>v>v>v<>^^v>^<vv<<^<^^v^<<>>vv>>v<^^^v><>v>^v^<>><^^^vv^>^^vv<>><vv<<^<<v^^<v>>><^<>v><^>vv>>v^^^>v>v>>vvv<>^>^^<^vv^<^<>^><^<>^><v^<>^><<v^v>v^v>^^>v^^>vv^>^v>^>>v>^>v<<^v<^<>>vvv<^^vv^<
<<vvvv^<>>>vvv><<v<>^<>>^^>v<<v<^^v>>^v^^^v<>v^^v^>^^<^^<^^><<^^^>^^><>v<^^><^<<vv^v<<>v>><^^<^>^<v^>>v<^vvv<^^>>><>><v>vvvv^<<<v>><vv^vvv^><>^<>vvv^<vv>>v^^^v<^^^^^<^^<<><^^^^v<<>><^>>v<vv>>>>>v^v>v><<^>v<^^<><<>v<<<v^^^><v^^v>^<>^<^>^v><v>v^<>^v<>><v^vvv<<<<><<<^^<v^>v^v<<^^><>><v<^^^v<<^^<^>vv<<v<<^><<^<>><^^><v<>>^<>^<<^^<v^vv^vvv^>>><vv<<>>>><<><>^>^^>>v^v^>^>v>v>vv<><v<v^^^^vv>>^^>><<^v^>^vv>>v>><<><>^^vv^v^>>vv^>v^>^>vv<v>vv<^>^>^><^>v^<^^vv>>^<v<^><>^^^^<^><<^<^^^v>v^<<><<vv>v<vvv>><v<<<^<^^>>v><^>^vvv<v^v<^><^<v>><<<v<<^^v<<vv>^vv<vv<<>vv>v>v>v>><><<<>v^v>^^v<v><v>v<>^^>><>>>^>v<v^v>>^^v^^<>^>^^vv<><<<v<^<v<^<v>v<^<^vv<v<<><v<<v^^^v<>v^vvv<<v<>>>^^^v>v^<<<^^>^>v^^v^>^>^vv><^^^>vv<v<<^v^v>>v^<^^^v^^<vv<<<><v><>>^vvv<v^vvv<<v^vv<v^v^>vv<v<>>^<>>><^><><<<v>^>>>^<<<v>>v^v^<>>v^^^vv^^<>^><^<>>>v<v<><^>v^<vvvvvv^<<vv<<>^^>>vv<^<>v^>>><vv><v>>^>><>^<<<v><>^<v^^<v<vvv^v>v^v>vvvv^^v^v^v>><<>>><^^>><v^>v>v<^>^<>^<><<<v^>v^v^><>^><v<>^v>^^><^^vvv^><><<vv><<^>^<<<<v><<^^>^<v<>vvv<v^>^v<v^
^v<>^^^<<<v^v^vv<^<>>^^<v>^>><<^v^<^>>^v<v>^v^><<>v<<^<^<<^>v^<v^>>v>^v^^vv>^><<^v>^<^>^>v^^v<<><>^>^<>><^><<^v<<vv>^vv^v^>^^>^^>^<<^<<^<<v<v^^><v^^>v^>^>>>vv^<>>^<>v>>>^><<<><>^>^<^v>>^<v^>>>>v<>v<^vv^<v>^<v>^>v<v<>>v^>vv<^<><>vv>^^<v<><<^v^>^v^vv>v<<v^v<>v^v>v><^^<v^>v^^v<><v^>vv^>^<>v^<vvv<vv>^>^vv>v^<>vvv<^vv<>^^<<^^<<vvv>>v^v^<^^^<v<^v^^<>^>^^<>>^^v^v^><^v><>^><v<v^<>v^><>^vv<^<<>vvv^^<v^<^>><v>v>^v>v>^^v><v<v<vv^>>vv><^<>^>vv<>v<>>>^<>^^^vv>v^>v<>v^vv^^<vv<v<v>vv>><v^vv>><>v<vv>^><<vv<>v^<<>^<><v<>vv><<<^<>>v^<>^><^<>^>^v^><^^<v<>>vv^><^v^^>v^v<^^^<>^v^^<<><<>v><>>>><>v<<^^^vv>^^>^<<<>>>v>>v>>^>^><vv^^v^vv^^<vv>v^^<v<><^vv><vv<v<v^^>^<<<>^><>^v<v><v^v><>^v>^><<^>^>v><<v<<^^vv^^>^^<^>v>v>^v<<v^v^^vvvv>^<^vv>v>v>>v>>><v<^><^<vv<^>^>v>^^<>^^v>^<<<>^<vvvv><^v>v>^^^>vv^<><v><<<>^^^v<<<<<<>v<^v^>>>vv<^<><^>^^>>><>>^>>>><v^<>^^<>^^^><v<<^vvv>vv>v<<<><<v<><v>vv>v>>^v<v>^<vv^>^vv^<v>>v>>><>v^^>><>^^<<>vv^v<>^<<><<v^^>v<^v^>>^<v<v>v><>vvv^<<^>^>v<>^vv<>^>>^<><>>>v^<>v^v^<^>><vv><<<>>^v>vv^
>v^vv><^>>^v^<<<<>vv>^<vv^<v^vvv^^<><^<v>v^<><<>vvv^<^v^>>><v>v>^^>>^vv^^v><v><><<^>^<v^^v><<>^><>^<v>v^<><><<>v<><^^><^<<>>>v^>>v^^^>^^v<v<<^>><>>v>^^v^<v^^>^^v<^^v^v>^>>v><>vvv>vv^^><<<v^>^><v<v^v>^>>^>^<v>>>^>><>>v<<<<v^v^v<>>^<v>v<<v>^<><vv^>^><<v^v<^>>><>>^v>^v>>v<v^>^<<<^v>>><><^vv>>v<^vvv^>><>>>v<<>vv><>v^^v<v>>v<v^>v><<<v<^>^vv>v<>v^^<<<v<^<>>^<<>^^>^><<^^>^^>v^>>^>v>^v^v>v<>>>^<<<<^v^^>^>^^v>^>^v>^^>^vv<>vv^><v<v>>>^v^>><>><<>v^>>v<^v<><><<<>^v^>>^^<v^>v^^>vvvv>^><<><v^>v^^^^<^><vv<v<v<<<v<<v<v>v<vv^<^v<^v^^v<<^v><^<>^^v<>>^<^<>v>^>><<><v<^>><<>^^^v>^^^>^v^<>v^>><>^<vv^<v<^>>>vvv>^^>vv<^>^<<>^v>><vv<<^>^<^^vv<^>vv<^>^v>>>v^>>^<v>v><><v^<<>v><^<v>^>><>^v<<vv<^><v>>vv>>>^v<^v<<<>v^<>><>^vvvv^vv>>>>^v>><^v><^<v^v>^<<v^^^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<vvv<^<^v>>><^<<>>><<v>>><^v>><v<><v<><^<^^v^^>>>>>>>>^<<<v^>^><^>vvv^^^^<>^<v>vv>^vv^v^>v<>>^>>^><^v<v<<^><vvvv^<^^^<<v^^<v^>><<<^<<<v>v^><>>v<><><^v<^>v^v
><>^vv<v<^>><^<><<^^^^v<^>v<<><^^^v<vv^v^<^v^<^v<v<>vv<v^<<<^>v^v^^v^>v>><>^^>>>vv^<<^>^>><v^vv^>v>v^^<<>^>v^^v<^v>^>vv^v<><>^>>^>v<<>v^^<^^^>>v>><v^v>><^^^vvv<vv^<v<<^>v<^^v<vv>v<v>v>v^^v^^>^v^>^v^><v><<v>^<v>^<>><v<<>v^<<>v>v<<<^^^v^^<>v<v^>^>>vvv>v><vv<v>v>^v^v<<^^vv><>^v>^v^>>^^v<>v>v<^^^<<<v<>v<v<v>vv^vv><<v^v><vv>>^<>><<^^<v<^>>^v<^vv<<<<>>><>^><<vv^^>v<vvv<<^v>vv><vvv<v^^>>>v^v>><>>^<>v><><v>v<<<<^^<v^<v^>v<<v^<^v<>^>v<<<^^^>^>v<^v^<<^<<>><v><v>><v^<^^^>v<<v>^vv><>>^>>>v^^vv^<>>^^^v^<>><>^vvv^v>^^v>^^<^^v<<^>^><>^v>v<vvv^<<v>vv>>>>^^^><<<>><>v^v<vv>v^^^^<>v<^^v^v<v^vv^v>>>>^^><><>>>>^v^>^v^v^vvvv>^^^<^><>^^<vv><v^<^v<><vvv>v>>><^<^^vv><vv<<>>^^^v^v><>vv><<>^v^>>^v>>><^vv^>>>>vvv^^vvvvvv<^vvvv<<v<<vvv^^^>v^<<^vv^<^>v^><v<>>v^<v^^^^v^^^^<<>>>v^^<^vv>><v<<<v^v^^<>>^vv^<v>>>>v^v<>^^>^>v<><vv^<<v^v>vv<<<<^<<<>^^v^v^^<<v^v^<v^^>><^<>v>^v>vv^><<v^v^^vv><^>><^<^^<v><<v<>^>>>>vvv<^>vv>^>v<>><<^>^vvv^>>v<><^>v^v<^<>>><^^^<v>vv<v^<^>^<<<^^<v^^v<^>^<>^^>v>^<v<>v><>^<<<^^^^<<><^^v>><<<v><^<^
vv>>^vv^^<^vv<^v>^<>^<v<^v^v^v^^>^^vvv>^<>^<<<<^^><vv^vvvv^>^^>>v<^><v^vv^^^<>>v<^vv^^^<^<<^^<>^<^^<^<v<<^>>>^<^><>>>vv>^>v^^>v><^<^<v>><v<v>>>v<^^>><v^v<vv>^v<vv<>^^<<>>v<v<^^^<<v^^<<^<^^<^<>vv<v>>v<<<<>v<v>><>^^vvv<<>><>>^v<vv<v<v^><^>>^v<v^<>>>>>v>v<>>^<>><>>v<<>v<^>^^v^^vv<<^<<<><^<<vvv<^^>>>v^^^v><<^<^<^^>v<<><<^>>v>^v^<<<^vv>>>^^^vv<<<>^>><>v><<<v^^^<^><>>v>^vvv<<v^>v<v^v>>><<<vv>>^v<^><<^v<<^v^>>>v<^<^>^^><>>v>^^^>vv>vv<v<vv<<<>vv<>v^>^^vv^<>>vvv>^<>v<>vv^v>v^^>>><vvv<v<>>^^v><vv<<vvv<>>v>^^<>^><v^><v^^^^<vv>^<v>v^v^v<>v>^v^v^>^<<v>><vvv^^v<^>>vv><><<v>>>>vv>^^vvv>v<vv<<vv<<^<^><<v>v<<v^v^v<v>>v<<<<^vv>v^^>>v<^>>v^>^<>>v<<^<><vv>v^^^v^>><vv^>>^^<>^<<<>>^<<^v<>^<<<vv>>>^v^<v>^v<<<^^^>v<vv>v>^<>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>>vvv^v<^<v>>>^^<><v<^v>vv><v<^<^>^>vv^v^<^^vv>^>><v>>^>vvvv<^<vvvvv^>v><>><v>>v<^<^v<v>^>>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><^v>^^^<v>>><<<<^v^><^v>v>>^><<vv<<^<^^v<v>>v>^<>vv>vv^^>>v<<><>v>vvv^v<>v^^<^v<<^^^^<^>>v<<<^^>v>vv<>^^<^^^>^<^v<<><^<v>>vv><<>^vv><^<v><^^^^vv>^^<>>v>^v><v><^v^>vv><<^v>^v<<>v^<>^<^>^><v<>v^>^v<>v>^<<<vvv^^v>>vv>^^^>^^><v<^^><>v>><^v^>^<v^<^^^v^^>v<v>^>><vv^>><<^v<>><<<v>^v<v<>v<^>>^^>^>v>v^^>v>vvv^>>v>>^<<vv><v^vv<>vv<v<v<v<><v>v^^v^<>^^^^v>>^v^<^<^^>><^^<><>^v<^>>^>^^<vv><<<><<^>>v>vv^^v<v^v^v>^<<<<^^^>v><>><vvv>>>>v^v^>>>>>>v^^<<><<^>^<^>^<>v>v><v<v<^<>><><>vvv>>v<<vv^<><>^>^^<^<^v^^>^<<^^<^>^^<<>^><^<^><<<v>v<<>>v^<<>>>^v<>v<vv>>>^vv^>v^>^^v<^^<><>v<>>v^^><v<<<<^^>><vvv><v><<<<v<^<<^vv<>>><>>>^^<>^^^^^^v<v>vv<<<<v^vvv>v^v<^<<^v<>^v>>^v<<<<^<>>vv^vv<v><^>>>>>^v>v>>^^v^<<><<>v<vv<v^vv<v>^<><<<v>^<><^><><vvv>v^^^><vv>>v><^^^<<<><^<^<<>^^^v^v^<vv<<>><v<v^<>^<vv>v><>><^<^^>vv>>v>>><>^<v<v><^v^<v>>^>>v<^v><^^v><v^<^vv<v>^<v><<<>>^vv<^^^<>>><^<^<v<>^<v>><v<<>^<v<v<<>>>>^<v<<<><>><^<>^>>v>^^<>^v^vv^>><^>v<vv<>>v^vv><^^<v^v><^^<v>^^^^<^v^^>v<v^^<^^>v>^><v^<^>>vvv<^>>vv>
<^<^<v^^v^v>>^>vv>>^><<v^<><>^<^>vv<>^<v<^^<^v<<>^v^^><<<<vv>vvvv>vv<^><v<^<<^v^<v<<><^^>>^><^v^<^^><v>v^<<v>>^>>^^^<>v<v^><>>^^vvvv<^<<<>^<>><^^<v<<^^vv^^>v<<<v>>v<><v<<<^^<^^>^>><^>v^^<>^>><>vv>^^<vv><^^vvv^v<^<^v>^^<v^^<><v<^><v^><^>v>^>>>^<vvv>v>>v^v><>><><<<v^v^^<^v>^>^<>>^^v<><^v^<<^^<^v^vvv>>v^^>>v>><^v^>><<^>>><<>^v<^^^<><v>v<^>>><>v^><v>>vv<<><^><<<<^v<<v<><<v^^<vv><v<<^v>v^<^>>v><<^><^<>^^<vv<<<<^vv<<<>vv>^<<<<<^>^><v>^^><><^^>><<>^^><<^v>^<<>v<>v<v^<^^v><<><<<><>>^<^^v^^<v<vv^>^>v<<^^^<v^v><<^><^^v<>^vv^<<<^<<<v<>v<^^>^><^^<^<^<v><>vv>vv>^^^^<<<<>v<<><<<^^>^>^><v<v<>vv>^><^><<^<<^<>>v<^><>^v<vv^^<<>v<><v<<v>>>><v^<^^<>^>>^<^v^^<>v^v>^<<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^<vv^<>>^v<v<v<>^v<<>>>>>^v^^v<<>v<<v^>^v<<><v^>vv<vvv>^vv^<^<vv><v^^>><>><<><^v^>v^>^<<>^>^^vv^^<<^>><v^v>^<v<v^^v^<>>vvvv^<>v>v<^><v<v><^^<v^^vv^<^<<<vv>>^v<vvv<v<^>>>v^><>^^^^^^v^<v^<^v<v^>>>v<v<vv<^^<><><v<^v^<^^<<>vv^^^<>^<^^<v><
>>^v<<v><<^>v><<^<^<<<vvv>^^>>v<>^<^<^^^<v>v<vv^>>v<>v^><>v>^<>vv>><^^<^<>>^vv<vv>^vvvv<<^<>><>v>>^><>v^vv<^v^>v^^vv<<>v<<vv><^^>>v<v>^<>^^^><>v^<<>vv^><<>^>>>>^<^<^^>v>><^^v>v^v<><><^^^^><>^<v^<>^<<>vv<v^>vv<v^^>^^><v>v^v>v^^>>><<^v>>><<<<><<>v>>v<<v^>vv<v^v<^v^v>^>>vv^vvvvv^>v^vv>^<><^><v^v<>^>vv>>^vv^v><^<><v<<>>^><^vv^<v<<v<^<<vv>v^<^v<<<^^v<>><^v<v^^v^<<v<>^>^>>>v<<vvvv><^v<>>><vv<<>>vv^>^^vv>^vv<<<>^v^<vv><v>^v>vvv^^^v<vv<^<<v<>v<^<vv<>>^^<v<><<>v>vvv^>^>vv><<>>v>><<>v<v<<^v^<>>v<>^^^^>><vv^><<>vv^><<<<^<<v<<<<^^v>^vv>>^<^^^<^v><v^vv^<v<<<<<<>><^vv<>v>>v<><<^<>>vv><><vv^><^v<<<^^>>v>^^^^v<<v<v^<<><<^^^vvv^^^v>><v<<<^<>vv^<^^<>v^>>^^v^vv<v^v>^><^^>>^>>vv>v<>^^>v<vv<v^>>v>v^<>v>><^^vvvv^<<<>v<v>^<<^^>^^<vv>^><^vvvv>>v^<v^>^>>>v<<<<<><v<v>v>>v>^>v^<<><^^>><v^^v<^<<<v^<><^<^>^>v<>^>v^^v<vvv>^<<^^>v<vvvvv>><<^>><<v<>^v>v>^v^>v<v^<^v>v^>vv^><<>^^<v<<^<v<>^<vv<^v<>>>>v>>^<<v>>v>v<^<<^v^<><>vvv<^<>v><v^^^^^v^vvv^^>>><<>v<v<v^v<><^^^<^><<><>^>>>>^^>><>^^v<^^^<>^^^><>>>v>^>^<v>v^<>v>^>v>v<
^>v<v^^<v<v><v>v>^<<<<^><<<v^>^>^^<^^<^<^v<^><^v>^<^vvvv><><<^^<v<v<vv>v>^^<v^><^v>>^>><^v^<^<v<>^<^vv>v^vvv^^><>>v>>^<^^^<><v<^<^^<<^vvvv^>v^^<^>^>v^<>^<<><v<v<<<><v>>>>^^v^^^<>>>>vv<v^<<<<<^><>>^^v<<><<v>>>v<>^<<^<^v><^>v<v>^<vv>^><v<^^^^v^v<<v<v<v>>vv>^^v><><<<vv>^vv^v>v<^^vv^v^^<^<^^vvv^^^^^v^^><vv<^>^^><v^v^>^>^>>>^>v^>v<v<v><^^<>v^vv^vv<>v^^v><v>^v<^^^<v>v><v^>><<^>><^>vvv^vv<^><v^^^vv<>v^^<>^<<^^>vv<<v>^>^>v><<^<v>>^>^v^^>v><>>>^^^^^v^vv<<^<^^v^v<v>vv^vvv>v^<^v^^>v^vv>^<v^<>v^v>>>v<^<v<<>>v^v^<<<v>><<v>><^vv>v>>>>^v><>><>v^vvv>v>^>v>>><<><><v<vv>v<vv^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<^v^v>>v^<v^><><><>><v>v>^>>>^<<><^<vvv^^v<<^<<^v^<>^^>^<v^^>>v>^v<>v^<>>^><^^<vv><<^^^<^>^<<<>>^vv><>^<^^^>^<><^v><<<<^>^>v<>v^>>^^vv^<v^<v<^vv^vv^>vv>^<><^v<^^<>v<vv^vv>v>>^^<^v<<^><v>^v<^<^>v^^^v^<><^<<^<<<v>>>>^><v>^>^^vvv>v><v>^v><vv^<<><v>^>v<<v^^v^v^>vv<v>v>vv<v<v<^v><<^>^^v>^<vv>>v<v
^<<<>^^<>v<v^>v<v^v^^^<>v^^^v^^<v><v<^^^^v^<>^^>^v^<^>^<^<^><><<>^^^v<>><><>>>>>vv^v^^v>vv^<<^<<v>>^^<>>^<>^vvv^vvvv<<<<v<v^v^v<^^>v<>v>>v<>^<^<^<^v<<>v>^<vv<^v^<><<>>v^<v>vvv^>^<<<^<v<v^<v<^^<>><><<>><>>^v>vv<<vv><^^^^^v<v^>vv^><><v^>v^^^<v>v^^^^vv^^v<<^><<v^>^^<^<^vvv<vv<^v>>v>>>v<v^>v<v<<>v^v<vv><^<vvv<>><^v^v<<^^<>>><>^^<^<<v<^>vv^^>v>v^>v^^>v>v>v>^><^<><v^^<vvv^>><><^v^<v^>vv<v<>>>^<<^<^^<v^<v>>v<>^>>^^vv>>^^vv<v>>^^^<v<v<^>^>^>^<>>v<<^^v>^^^v^<>v^><<>>^><^>><v<<v><vvv^^^^v>vv^<<<^^v>>^^<^v^v<><^<^vv<<v><v^>>v<^<v>>>><^v<<^<^<vv<<^>vv<^>>><^>^<^<<^^^^<v^<v^<v^>^<^>v<>v^^>^<v^>^>^>^v<^^<<^>>^>v>v>>^<^>>vvv^>>^<<v^vvv>vv^>v<vvvv>><^v^<vv>v>^v>^^>v>^<>vv<vv<<vv^^>>^v<^^v><>v<^<>v^>><v><^><>><v>><^^v<v<<v^v<>v<^^<<^^<<<<^<><<>v><>>>>>v><>>^^><v<^^v<<v<>v<vvv<>><>>^<v^v>>><v^^>><v<>>v<>^<>><>vvv^>>v>^>v^>v><^<v^>>><^^v>^<<v<^v^^v><v^^v>^v^<>^v>v^><^<v>^vv<><>^vv>vv<vvv><v^<>><^<<><vvv>v><<vv^><<<>><><^^v^vv<v>>>^>>>v>^<<<<^>v^>>v<^>v><<v^^>^>^>v>^<v>v^v>v>>><^>>v<v<<^v<v<<v>vvvvv<v^^^<
<^><<^>v^v>>^>^vv<v^v><>v<v<>>^<^^<>^>vv<^v<^^v>^<^^<<<>^>vv>^v^^vv><<>^vv>v^>>v<^<<<^><>v><^><<vvv^<<^vv>v<><><^v>v^v<v^<<>^<^>>vv^v^v^<^^vv^^v^v^v<^<>>v<<><v^v<^^v^^<^<>v<>>>>>>v^>>^v^<^>^>v>^^v<<^<>>><vv^>^>><<>>^><v<>vv<><vv>v^><><>^>^<^<^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^^v^>^<v<>>><vvv<<^>>v^v^>^>>^<><>>^<<>^vv^^>^v<>>^^^vv<^>^<v^v^vvv^v>^vv^^^<^^><v<^><vvv<>v>^^>>v^<v^<^>>>>>v^><>>>^^<<<^v^v^^<v<^v><^v><>^^vvvv^<<<v^vv<^v^v<v^<v<<^vv^^v<<<<>>^<>>>v^<>^>^<>>>>^<<>^^^>v^<>v><<>>>^v^vvv^v>v><v<>v><<vv<^<^>^>vv>^>>^v^<^><<>^v^v>>>^<v>^v^<>>^<>v>^><><v>>^<^v<v^vv^><^<<<^vv^v^<>^><v<v>>v>>^<>^v^>vv^^^^v>>^>>vv>>^v<<<^>^^>^<v>vv^<<<^^>>^<><^<<^<vvv^<>v<>^^^<vv<vv^>v^>><vv^<^^><<>v^vv<><<v^<<v^>>^>><<v>>^^v><<^^<^<<<><v<v<^<<vv^<vv^^>>v<^>^>>v<^<^<<>^^^^^<v<^>^^v>>v^^>^><><^v<<<^>>>^^^<v^vv^^<v>^>v<v^<^^<<vv<>^>>^>>^><^<>vv>^>v<><^<<>v<<^>vv>^^v>^>^v^>^>^>^^><^>v^>><^<<v^>^vv^<<<>^^v<vv<^>v>^<>vv><
^^<v>><v^vv^>^vvv<v^vv<vv^<v^<><v<>v>^<<>^<vvvvv<vv>^<>>^vv^^^><^<<<v<><vv^<<<^^>>v>><^v>v^>^v<^v^>><v>^<^v<v^v>^^^>v><v^<<^^<^^^^^<v>^<>>^vv>v<^v><>^v<><v^v>^><<>><v^<>>v>>v>vvv^v><v^^<<>vv^><<><><vv^v><v>vv>>^v^<<^v>><><><>>><v<v<<<v<>><<^^<>>vv<>v^><^>>^^^v<>v>v>^^vv^v<>^>v^<>^<^>><>>><<>v>><>^v^v><>v>>^>><^^<<^v^>^>^<^<>>v<<^^^vv><<<^v>^^<v>v<vv^<^<>v^^^>>v>v>v<>vv<^<>vv><><>><^>>vv^vv^^^<><>^<v^vvv>^<>vv<<v>v^<>>v^^^v><>><><v^>^v^<<^^v>vv<^>>v^<vv>vv^^>>><><v^v^<v<<>v^^>^v^^v^<<>>v>^^v<>v>>v^v<v^>v^><v^v>^<^<^<^vvv>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<^<<vv^><>^>^>^<>>v^><<><^^<^><<^vv<>^>>^^^v^^<^<><^v<v>>^<^^v^v<<v^v^<vvvv^<<>><<v>v^>v<v<<>^^>vv^<><v<v><^<><^<^>v>>v<v<vv^^<<^^<>^<v^<^^v^^>^vv<^<^>^>><vv<vv>v>^<>>v^><v<^>v>^><vv>^^<><>v<v>v<>^<^v^<><v<vvv<^^><v>^^>v><^<>>vv>v^<>^<^v><<<^^>^v^^><v^<vv>^^^v>^v>v>>^^v<^v^<>>><>v<>vv^>>^vv>v^v<v>^vvv><^><>v^><<<<^<v^v><v<<^^><vv>v^<^>
^>>^^^vv>>^^<<><<^v>>><^>^v^^v^v<<vv^<^>><v^>vv^><^<^^v^>><<^>><>v^v<v>^^vvv<<<vv>^^^><^^v<v<<<><<<^>><^><^^><<>^><>>^<vvvv^^<^>v><v>><>>^><^^^^^vv>v<<><vv<^^^v><^>>^<v>^vv^>>^vv<vvvvv<^><^vv^^>vv<^><v^>^^v><><<<v<^>>v>>>^v>^vv>>>v^<>><v>>vv^<^v>v>v><>vv^>>>^v<>v^<vv^^vv>v<v<<^^vv><v>^^>v<><<v><>><>^v^vv^<^<^>^>><>^<>^<vv^v<><v>^<>v<>><v<>><<v>vv^>v<vv><<v>^<><^<><^>>^v<vv^^v^>^><^vvvv^<>^vv<><<^^^v^<>^vv>v^<v<>v>v>^^<<^^>^vv<v><v<v<<^<><<<><^v^^>^<<><<^<v^<^><^>^<^<>^^>><^^<v>vv<v^v>v>><<^<^^<v^>^^<^<^^<v^<<><>v^>v^^v><<^><^^^^<>^><>v>^v<vv>^vv^^>>^^>>v^<<<^vv^>vvv^^^^<v<>>v<<>>><^v<><<v>v^v^^^v^<>>v^v>^>><^^<<v>>><<^^>>v^^<^>>^>vv^^v<<v^<v<^>^<v><<<v^v^^><<v>^^^v<v>>^>>^><^^vvv^^>>>^v<v<^>^v>>v^>><^v^v^><>v><>v>vv^>>><^<^vv<><<^<<><<^^^^>v<^>v<v<><vvv>^>>vvv>v>^<^v>^vv<<^<^v<>v<<v^^v<>>^^<>>^><<vv<><<v^v>>^^v^<><^v>^>^>>>^^<^^>vvvv^vv<v^^<<><>^>v^v>><v^<<<v<^v>vvv>>v<<>^vv<v>^vv><>^^<<^<<<<<<<>^^<>v<<<^<<<<<<><>^>^vvvv<<^>><^^^vv^>v^v<<>^><v^<><v>>^<vv^vv>^>v^<<<<vv><<<<^<<>^<>v^v^^v
v^v^<<v>vv^^><>v><^^^<v<>^^>>>>>^<^<>^^<^<<>>vv<>>v^>^^><<^^<v>^^>v>>><v<v><<><>v^^v>^vv<v<vv<v<><>>v^><<vv^<<<^>v<<v>>>>>v<^vv<>>>v>^<^>^>>^>^^><>^^^v<^v^<vv>v><^<>v^<>>^<<^<>>^^vv^v^<<<^>v<<<<^<v<<<<>^><v>>v><<<>vv^<^>^^<>>v<v^<v^><^^v<<^>^^v^^>><^vv<><<>>^^<vv<<^v<^><>>vv^^^<>>^v>v^v^v^>^v<><>^vvv>><<^>v<v>^^<<^v<<v<^<>v^<^>>vv>v^v<vvv<>vv^^>^<v><<<><^><<<v><v^>v^v>v>><^>^><<v<><vv><v<^vv<^><vv>>^v<v><<v^^>^^><vv<v>><v>v<^vv^^v^<v>^vv><vv^^^>^><>^^<v>><>vv>>^v>>>>v>><>v^v^^<^>v<^>>^>vvvv>^^><^<v^^vv^v^<^><vv^^^>^^><><^vv<^<^vv^^<<vv<v<^>vv^^><v<>v><><<v>^><v^><v>^<^vvvv<^<v<v^v<v><>><><>v<^>><<^<<^v<v><v<>>v><><<<vv^^><vv^<v<vv>><^><>v^v^v>^v>>^^vv<><v>>><><>v^v>^^<^<v>^^>vvv<v><^^>>v^>>v^^v<><<^v>><^>>^<v<>v^><>^>v><^><<^v^^v>^><>>>vvv<v^^<><^<<<<^^vv><<>vv^v>v<>vv>v^^v<^><vvv>>vvv<v<^^<<<<<><v^>>^>>v><^v^<^<><<<v<v<^v^^v<^^^><v^^vv^^<<^v^^^^<>^><>^v^v^v<^<<v<^>>^>v^v^<>>>>v<<><vv<v<^>^^>><v^vv>^^vv<>vvvv^<<<<vv<>^^vv>>v>v<^v^v>v^^v<>v>v>v<vv^vv<><^<>^>^>>^>^<vv<<vv^<><<<vv^v>vv^<>
<v<^<v<^>>^vv^>^v^<<^><^<v^<^^^<^<<>>>^^<<^<vv^v<v<<v<vv<<v^><^<<>>^<^^v><^v>>^>^^<<^^v^vv<v<<>^^<^>v>v^<vvv<><^^<<vv^<>>^^^>>v>><^<vv<^><>^<^v^>vv>v^^v^^>^^<>^>^>^<v^v><^><^><>^^><<v^v<<<v^v<><<<v^<><>v^vv^v<>v>v^<^>^<<>><v<vv<^^<<>>^>^^<^<vv^v<><^v<vvvv>>><vv<><v>vv><v^^>^vv>>vvv>^^<>vv>v><<v>>^<>v>^^>^v^^vv^^v>>^<>>^^<><vv<<v<^<v<^v>vv^<>v><^>^<<v^>v>^v^<<vv<<^^<v^<<>v>>^v><<^>^^<<><<<^^v^<>>vv<>v^v^>v<<v^v<^^<>vv<v>><>v<^^^<>>v>v<^<v^>v>>>v><<>>>vv><>^<^>><v<>>v^><^^<v<^^<>>>^>v<<>>^^<><^vv<vvv<^>><^vvv<^<<v>v>^v<>^<v<>>^<v<^<<v<^v<v<<<vv<^>><<>v>vv><>v^>^<>v^vv<<>^^^v>v^>>^<>^>v^^^^<v>>^^>^<<v^vv>^v^^v^v^<^v^><>^v<^^^<v^^>>^><<^^<v><v>^^v>v>>>v^>v<vv<vv^^><vv^v<<<<<><<v^<<>>v<<v<vvv>v>>>^>>>^<>>>>v^>vv<<>^><<v>^v^v><<vv<vv<>v<<><>v^vv>^>>^^><^<vv^<<>^v^vvvv<<^>v<>vvv^<><<<<>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>^<v^<>^^><<<v^<>v>^v^vv>vv<<>^^<^>>^<<>><>^v^<<<v^><<^^^<^v<<v^>^^vv>

342
2024/day15/main.py Normal file
View File

@ -0,0 +1,342 @@
ROBOT_SPEED: int = 1
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, other) -> bool:
return other.x == self.x and other.y == self.y
def __add__(self, other):
return Coord(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Coord(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return Coord(self.x * other, self.y * other)
def __rmul__(self, other):
return Coord(self.x * other, self.y * other)
def copy(self):
return Coord(self.x, self.y)
class Warehouse:
robot: Coord
walls: list[Coord] = []
boxes: list[Coord] = []
width: int
height: int
def __init__(self, warehouse_map: list[str]):
for y, line in enumerate(warehouse_map):
for x, c in enumerate(line):
match c:
case "#":
self.walls.append(Coord(x, y))
case "@":
self.robot = Coord(x, y)
case "O":
self.boxes.append(Coord(x, y))
self.width = len(warehouse_map[0])
self.height = len(warehouse_map)
def __str__(self) -> str:
w = [['.'] * self.width for _ in range(self.height)]
for box in self.boxes:
w[box.y][box.x] = 'O'
for wall in self.walls:
w[wall.y][wall.x] = '#'
w[self.robot.y][self.robot.x] = '@'
s = ''
for row in w:
for c in row:
s += c
s += '\n'
return s
def move_robot(self, command: str) -> None:
dx, dy = 0, 0
match command:
case '>':
dx += 1
case '<':
dx -= 1
case 'v':
dy += 1
case '^':
dy -= 1
movement = Coord(dx, dy)
new_pos = self.robot + movement
if new_pos in self.walls:
return None
if new_pos in self.boxes:
if self.push_box(new_pos, movement):
self.robot = new_pos
return None
self.robot = new_pos
def push_box(self, box: Coord, movement: Coord) -> bool:
new_pos: Coord = box + movement
if new_pos in self.walls:
return False
if new_pos in self.boxes:
if not self.push_box(new_pos, movement):
return False
self.boxes.remove(box)
self.boxes.append(new_pos)
return True
def score(self) -> int:
total = 0
for box in self.boxes:
total += 100 * box.y + box.x
return total
class BigBox:
right: Coord
left: Coord
def __init__(self, left: Coord):
self.left = left
self.right = Coord(left.x + 1, left.y)
def __add__(self, other: Coord):
return BigBox(self.left + other)
def __eq__(self, other) -> bool:
return self.left == other.left and self.right == other.right
def __str__(self) -> str:
return '[]'
class SecondWarehouse:
robot: Coord
walls: list[Coord] = []
boxes: list[BigBox] = []
width: int
height: int
def __init__(self, warehouse_map: list[str]):
for y, line in enumerate(warehouse_map):
offset = 0
for x, c in enumerate(line):
match c:
case "#":
self.walls.append(Coord(x + offset, y))
self.walls.append(Coord(x + 1 + offset, y))
case "@":
self.robot = Coord(x + offset, y)
case "O":
self.boxes.append(BigBox(Coord(x + offset, y)))
offset += 1
self.width = len(warehouse_map[0]) * 2
self.height = len(warehouse_map)
def __str__(self) -> str:
w = [['.'] * self.width for _ in range(self.height)]
for box in self.boxes:
w[box.left.y][box.left.x] = '['
w[box.right.y][box.right.x] = ']'
for wall in self.walls:
w[wall.y][wall.x] = '#'
w[self.robot.y][self.robot.x] = '@'
s = ''
for row in w:
for c in row:
s += c
s += '\n'
return s
def move_robot(self, command: str) -> None:
dx, dy = 0, 0
match command:
case '>':
dx += 1
case '<':
dx -= 1
case 'v':
dy += 1
case '^':
dy -= 1
movement = Coord(dx, dy)
new_pos = self.robot + movement
if new_pos in self.walls:
return
if box := self.is_box(new_pos):
if self.push_box(box, movement):
self.robot = new_pos
return
self.robot = new_pos
def is_box(self, pos: Coord) -> BigBox | None:
for box in self.boxes:
if pos == box.left or pos == box.right:
return box
return None
def push_box(self, box: BigBox, movement: Coord) -> bool:
new_box: BigBox = box + movement
# def push_box(self, box: Coord, movement: Coord) -> bool:
# if movement.y != 0:
# return self.vertical_push(box, movement)
# new_pos: Coord = box + movement
# new_pos2 = new_pos.copy()
# if movement.x > 0:
# new_pos2.x += 1
# else:
# new_pos.x -= 1
# if new_pos in self.walls:
# return False
# if new_pos2 in self.boxes:
# if not self.push_box(new_pos2, movement):
# return False
# self.boxes.remove(box)
# self.boxes.append(new_pos)
# return True
def vertical_push(self, box: Coord, movement: Coord) -> bool:
pass
new_pos: Coord = box + movement
# other_new_pos: Coord = new_pos
# if box in self.left_boxes:
# other_new_pos.x += 1
# else:
# other_new_pos.x -= 1
# if new_pos in self.walls or other_new_pos in self.walls:
# return False
# if new_pos in self.left_boxes or new_pos in self.right_boxes:
# if not self.vertical_push(new_pos, movement):
# return False
# if other_new_pos in self.left_boxes or other_new_pos in self.right_boxes:
# if not self.vertical_push(other_new_pos, movement):
# return False
# if box in self.left_boxes:
# self.left_boxes.remove(box)
# self.left_boxes.append(new_pos)
# self.right_boxes.remove(Coord(box.x + 1, box.y))
# self.right_boxes.append(other_new_pos)
# else:
# self.right_boxes.remove(box)
# self.right_boxes.append(new_pos)
# self.left_boxes.remove(Coord(box.x - 1, box.y))
# self.left_boxes.append(other_new_pos)
# return True
# def can_push(self, box: Coord, movement: Coord) -> bool:
# new_pos: Coord = box + movement
# if new_pos in self.right_boxes or new_pos in self.left_boxes:
# return self.can_push(new_pos, movement)
# return new_pos in self.walls
# def score(self) -> int:
# total = 0
# for box in self.left_boxes:
# total += 100 * box.y + box.x
# return total
def main() -> None:
with open('test.txt', 'r') as file:
data: str = file.read()
warehouse_map, movements = [s.split("\n") for s in data.split("\n\n")]
movements = ''.join(movements)
# Part 1
print('<', '=' * 25, ' PART 1 ', '=' * 25, '>')
warehouse = Warehouse(warehouse_map)
print(warehouse)
for command in movements:
warehouse.move_robot(command)
print(warehouse)
print('Score: ', warehouse.score())
# Part 2
print('<', '=' * 25, ' PART 2 ', '=' * 25, '>')
warehouse = SecondWarehouse(warehouse_map)
print(warehouse)
# for command in movements:
# warehouse.move_robot(command)
# print('Movement: ', command)
# print(warehouse)
# input()
if __name__ == '__main__':
main()

9
2024/day15/test.txt Normal file
View File

@ -0,0 +1,9 @@
#######
#...#.#
#.....#
#..OO@#
#..O..#
#.....#
#######
<vv<<^^<<^^

91
2024/day16/main.py Normal file
View File

@ -0,0 +1,91 @@
class Coord:
x: int
y: int
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __str__(self) -> str:
return f'({self.x}, {self.y})'
def __eq__(self, other) -> bool:
return other.x == self.x and other.y == self.y
def __add__(self, other):
return Coord(self.x + other.x, self.y + other.y)
def __sub__(self, other):
return Coord(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return Coord(self.x * other, self.y * other)
def __rmul__(self, other):
return Coord(self.x * other, self.y * other)
def copy(self):
return Coord(self.x, self.y)
UP = Coord(1, 0)
DOWN = Coord(-1, 0)
EAST = Coord(0, 1)
WEST = Coord(0, -1)
class Maze:
map: list[str]
start: Coord
end: Coord
def __init__(self, file_path: str):
with open(file_path, 'r') as file:
self.map = file.readlines()
for y, row in enumerate(self.map):
for x, char in enumerate(row):
if char == 'E':
self.end = Coord(x, y)
elif char == 'S':
self.start = Coord(x, y)
def get_pos(self, pos: Coord) -> str:
return self.map[pos.y][pos.x]
def is_wall(self, pos: Coord) -> bool:
return self.get_pos(pos) == '#'
def is_end(self, pos: Coord) -> bool:
return self.end == pos
def lowest_score(self, pos: Coord, score: int | None = 0, dir: Coord | None = None, facing: Coord | None = EAST) -> int:
print(pos)
if self.is_end(pos):
return score
if self.is_wall(pos):
return float('inf')
if dir:
if dir != facing:
score += 1000
facing = dir
score += 1
pos += facing
return min([self.lowest_score(pos, score, dir, facing) for dir in [UP, DOWN, EAST, WEST]])
def main():
maze = Maze('test.text')
print(maze.lowest_score(maze.start))
if __name__ == '__main__':
main()

15
2024/day16/test.text Normal file
View File

@ -0,0 +1,15 @@
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############

5
2024/day17/input.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 62769524
Register B: 0
Register C: 0
Program: 2,4,1,7,7,5,0,3,4,0,1,7,5,5,3,0

167
2024/day17/main.py Normal file
View File

@ -0,0 +1,167 @@
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class Machine:
register_a: int
register_b: int
register_c: int
ic: int = 0 # Instruction Counter
program: list[int] = []
def __init__(self, program: str):
self.register_a = 0
self.register_b = 0
self.register_c = 0
self.program = [int(x) for x in program.split(',')]
def interpret_combo_operand(self, operand: int) -> int:
match operand:
case operand if operand in range(0, 4):
return operand
case 4:
return self.register_a
case 5:
return self.register_b
case 6:
return self.register_c
def adv(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_a = int(self.register_a / (2 ** operand))
def bxl(self, operand: int) -> None:
self.ic += 2
self.register_b = self.register_b ^ operand
def bst(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_b = operand % 8
def jnz(self, operand: int) -> None:
if self.register_a == 0:
self.ic += 2
return
self.ic = operand
def bxc(self, operand: int) -> None:
self.ic += 2
self.register_b = self.register_b ^ self.register_c
def out(self, operand: int) -> int:
operand = self.interpret_combo_operand(operand)
self.ic += 2
return operand % 8
def bdv(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_b = int(self.register_a / (2 ** operand))
def cdv(self, operand: int) -> None:
operand = self.interpret_combo_operand(operand)
self.ic += 2
self.register_c = int(self.register_a / (2 ** operand))
def run(self) -> str:
output = []
while self.ic < len(self.program):
opcode = self.program[self.ic]
operand = self.program[self.ic + 1]
logging.debug(f"IC: {self.ic}, A: {self.register_a}, B: {self.register_b}, C: {self.register_c}, Opcode: {opcode}, Operand: {operand}")
opcode_out: None | int = None
match opcode:
case 0:
opcode_out = self.adv(operand)
case 1:
opcode_out = self.bxl(operand)
case 2:
opcode_out = self.bst(operand)
case 3:
self.jnz(operand)
case 4:
opcode_out = self.bxc(operand)
case 5:
opcode_out = self.out(operand)
case 6:
self.bdv(operand)
case 7:
self.cdv(operand)
if opcode_out is not None:
output.append(opcode_out)
return ','.join([str(x) for x in output])
def part1():
INPUT_FILE = "input.txt"
with open(INPUT_FILE, 'r') as file:
data = file.readlines()
reg_a = int(data[0].split(':')[1].strip())
reg_b = int(data[1].split(':')[1].strip())
reg_c = int(data[2].split(':')[1].strip())
program = data[4].split(':')[1].strip()
machine = Machine(program)
machine.register_a = reg_a
machine.register_b = reg_b
machine.register_c = reg_c
print(f'Output: {machine.run()}')
logging.debug(f'Final Registers: A={machine.register_a}, B={machine.register_b}, C={machine.register_c}')
def part2():
INPUT_FILE = "input.txt"
with open(INPUT_FILE, 'r') as file:
data = file.readlines()
reg_b = int(data[1].split(':')[1].strip())
reg_c = int(data[2].split(':')[1].strip())
program = data[4].split(':')[1].strip()
program_len: int = len(program.split(','))
reg_a = 8 ** program_len - 1
# machine = Machine(program)
# machine.register_a = reg_a
# machine.register_b = reg_b
# machine.register_c = reg_c
# print(machine.run())
# print(program)
# exit()
# Naive solution but it works (in time)
while True:
logging.info(f'Testing Reg A: {reg_a}')
machine = Machine(program)
machine.register_a = reg_a
machine.register_b = reg_b
machine.register_c = reg_c
output = machine.run()
logging.info(f'Output: {output}')
if output == program:
print(f'Correct Reg A: {reg_a}')
break
reg_a += 1
if __name__ == "__main__":
part2()

5
2024/day17/test.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 729
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0

5
2024/day17/tests/p1.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 0
Register B: 0
Register C: 9
Program: 2,6

5
2024/day17/tests/p2.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 10
Register B: 0
Register C: 0
Program: 5,0,5,1,5,4

5
2024/day17/tests/p3.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 2024
Register B: 0
Register C: 0
Program: 0,1,5,4,3,0

5
2024/day17/tests/p4.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 0
Register B: 29
Register C: 0
Program: 1,7

5
2024/day17/tests/p5.txt Normal file
View File

@ -0,0 +1,5 @@
Register A: 0
Register B: 2024
Register C: 43690
Program: 4,0

View File

@ -0,0 +1,5 @@
Register A: 2024
Register B: 0
Register C: 0
Program: 0,3,5,4,3,0

402
2024/day19/input.txt Normal file
View File

@ -0,0 +1,402 @@
grbb, burb, wrwbrwg, uwwb, bwbbw, ubgrbu, gguu, uru, gwr, wrw, gubwb, g, gwbu, rbw, bbuu, rwgbr, urrr, rwww, wrrb, ug, rubbwuuu, gbrbr, brb, wrubb, gwrgbbgu, wggwbrww, rwwb, br, buuwr, rgrbb, wgubb, gbb, gbrb, rubw, ubr, guu, wrugbg, gubwru, bww, rbu, burr, ugu, bbggguw, bguw, ubu, uuuw, uugww, urugr, uwgur, gugrgggw, b, gugu, wgb, rwgwuu, guw, brg, ubur, wbwwb, ggbg, wr, urw, wur, brwgrw, uuur, rwwg, rrbrbggw, gwrurwg, rurru, r, bug, ruwrww, brgwu, bwgurbu, rwuu, guub, rrbwb, rbgwbr, grbrugbu, bwugwugb, guwww, ugwggg, buggrug, urb, bbbwuur, ururgur, wu, bbbru, ruuw, grr, buw, bub, gbwwug, rwrbw, wrbg, wubr, u, wgrb, wbuub, ugrugwg, wggbrr, gr, uur, ugb, wbg, uub, bbbrww, uwbr, buwguww, wbwgw, ubuuwr, wuuwgr, wggw, gwurgub, rwwu, bruwg, bgbrbwb, rbgg, rbg, bubggwu, gubgrur, gwb, rgu, wrr, uug, bgw, ruuugu, uwbg, rgurgwwb, wrwgb, brbbr, wgrgu, brgbwb, gub, uugw, wrrbb, wwruuru, grrw, urgg, gbwg, ubbur, bggwwgw, ubggw, uwgw, ruu, wwuu, bwuu, uggw, gwu, urg, rwbb, uwwub, ruug, bwbbu, wbb, bwwwu, rbwrruu, gg, ugrbbwgb, wbbwwr, bbwrrrb, rgwwu, bbr, wbuwb, grub, ubwwgu, ubb, brrbuu, grw, bwugg, wurbu, uwrb, rwgg, rurbuu, gbrug, brwgr, gru, bgrub, uuwr, gbwww, bbrw, rbr, bwrg, ruur, gbbgr, brgwug, ugg, bwgubu, rrg, ub, gbuwu, ubuwuw, ggw, wrgww, uuwb, bwr, bb, ruwu, bwugrw, buu, wug, gggwbwu, brurg, rrur, gb, wg, ggruwbu, gbg, bruur, gug, rgr, gwuuu, uwwurr, ubw, uugbuw, ruugwu, bu, ubrbw, ggu, rug, wgurwurr, ugrrbr, brgrb, rrbrgwww, rrgg, grb, brbw, bruwgw, uwbw, rgg, wrg, rrruwr, gguw, bugbbrw, bbg, rwg, wbuwg, uuu, wruwur, ugwb, bur, urgb, bg, uwubrwu, rwbwwg, rub, wwwwbw, rbbugbr, wgg, bwbb, brw, ggugb, guggw, bgg, wwr, gwrbb, rbb, bgb, brrubwb, wwu, bggrrwu, bugb, gwugw, grg, wrb, wuub, bru, gggrr, wuw, uwg, gbgurg, wguwug, gbwgw, bgrb, wguuw, rwr, ubuww, wruuw, wurur, wuu, bbw, brbgubb, bubg, wgw, wwuwrw, bbwu, bbrgubw, uwu, bw, wbr, bbu, bgr, ubg, rwrgg, uggu, wugggb, wwbgguur, wrwuwb, rgrr, wgbu, ggb, ubuw, rgugg, gwuru, guuubbw, bgbrrw, rrgwg, gbw, wbu, wuwg, gugb, uww, ruugb, rubu, ugwbw, bbrgrg, grbrr, guwgruwr, wwbr, wgruw, grwg, wgr, ururwr, gbbg, gbuub, uwr, grwgrwr, ruw, wru, ggr, guwuu, uwuuwu, gbu, rwbbgg, ruruww, wwwur, rgrug, rbbwg, rgwugwg, wbw, bbru, ggg, bbuugrrg, uugb, rw, gburwww, rububugg, gguubbg, rrrurwwg, buruwrb, bbwrggwb, gbrbwr, uruwwu, wwwurbu, rrwb, bbb, bwg, wurggubb, wgu, gwwg, wururruu, bbbu, ur, rwb, uwww, wgwr, rr, rru, uuw, uu, bwgw, brr, wub, bwgbrrw, gwrgrw, uw, ggguwbg, bubbur, ubbggu, ugr, rrrw, ru, rb, gwwbgw, rrr, rrw, gruw, rwrrbb, rugr, uubw, ruwb, uubbbu, gur, wb, rrrrwww, bbub, bgurwg, ubbugw, gwbw, gggbru, ugru, brru, ggwg, wwg, ugubr, urggbu, ggwuww, gbr, guwubu, rwu, gwg, rrbur, gwrg, wwubr, uwb, gbrr, rurburb, brrg, ggur, rurbw, uwbu, grbbu, wgur, urr, rgggg, rrb, ww, rww, bwwwr, wubwubgw, ggubw, wwb, uurb, wbrggwu, ugw, rggwwr, urwu, gwwggg, uwuubwr, gwuubww, uwbwu, www, gwgwr, bwu, gu, rur, wwwg, uwruub
rrwuwuurrrguggbrrrrgwwururguggwuwrwwurwuuwbw
wrrugrgbuuuurgubbbbbggrrwgrbgggbwuwwbuubwrbgwwgbww
uurwwrgbuuburbgbrrgugrgwugbwrwguruugwwgguwugrgwggrur
rgruurwubbgggwwuwwgurrwuugggbrbuwgwrubrgw
gugwbgbwbbgurrbrurwbwwgwwgbrgwuwruubwuwuggrrrgbgb
urwguwuggwbbwgbrbbgubwbggwggwgrbrrruguruggbgruwb
grwbubrugwuuubgbgburrgbuuuwruruuugrwgrrbwwrgbwrbwrugubgu
wwrbruwrgbgubuurwrgbubbwwgbwurwrrbwwurrgugggrbwurrrb
bwugbgrugbuwbuurrgurwbrggrggrbrgurgwwbbgrrbgbubrgrrbwgrbwu
grggrbwrwbuwrgwrbggwrrggugugggrwbwwrguuuuwgrrgbgwuurug
gbugrrruubgbgwrggbwgrwwubrrbubrgbbgubbbuurwbb
bgrrbbrwbrguurggwrrrgrrgwururbggururgwwgrwgbuugbg
uwwubbuwgwuggrruuuwbgwrrgwrbbrgggubwugubuuubwwbbwuwru
ruwgguggbgbbwwrbbrubrrruugbwwgrguwubwgbbgburu
wrbubwugwgurrrrrbwwwuubbubgrbbgwrurrrrbugggw
rbwbbrbrrwbugurbbbrubbgbbgbuwbrbbwrggwbrwbguguubggwgbruww
gggwrrgubuurrrrrurwubgwgbuuggrrwrurbbgugruruwrrgurugu
gurrbwbrbubguwbbrgwggruwuwrrrwwrggggrwuwubgubugwwgbgwrwgurgw
grbgrgguwrwrububbrburbgrubuwrwwbbwwgbbuwwwbubgrbgbr
ubbuwuguwbwwbubbbbburbuububwrwwbwgubrubuwwwuwrrwrwwggubggg
buwrgrrbuuwbbrgggbbwuruugbwwgwggwwgrrbbggrbuwuu
gguguwbwrrggguurrrwuwbrwwwwrruwuwguuggrrrbgwwgrbbbrgrbrgb
bgbugwgwwgwwwgrbwuwugwbgbururwugwuwwurwwbuubrw
gwggguurbubwbgwgrwwrgrubuurrrugrbbuugrrgbuurggbgwbwwwur
gwruwwbrwwgwrbgbguwwugrwruwrgubwbbwbbugrwbgguwurguwu
gwbruubwwrbbbbbgruwgwgwgbrwgururrrwugwgrubbggbuwuwwbb
buuuwwguwbwgwbbuwgubbrggwgggburwbgbwwrbuguwgwbwugrggr
ubwrubuwgbgbwgggwrwgrwrrggrgbgrbbuwwggbwgbwbbgurbrguguwrrgw
wrrubggwruurbbbrgbwguwbwgggbrrwrwgubwuguwbrgw
rgbwwuurgwbwrrwwgruurbruubwurggugbuubgrrrwbgrggrggrgwbr
grurgwbgbggbwbwwuuubugbuuugbbwrwuugbbubbuw
ubggwwbgwwrruuwwuwbrrbbwugwruurrugrbbwgbwwwgbwbwbwbubbrr
wgbwubuugwrrgwrwbbwwgrrgwuggrubgrrubwrubrwuurgruwwwgrwr
uggwguwruuwugbwbuwwgwugwrbbwrubrburgrgbuuburw
grbbrgbwbbubwrwrurgugbggrwbuugbubbgugbwrgrwwgbbbguuwg
rwurubwguwuububwrurwgrrwuubbubrwwbrgugrbgubu
grrbrgrbbuguwgrwugurrbbwrggwbguguugrurgw
gurrwrwgruubrubgrgbrwbrgwwrbrgbugrbwgwgbbgw
wubrubbuwrubrrrrwgbgugbrrbrgwbwgrwbuugugbgrbuur
bbrgbbgrbrbwgruwrgwgrgugrrwgruwwgwwbwwwguurbuwbwruwbubr
wugrwrggbwbwrbwrwbbggrgburuggwurbubruugbwgruwbrguwb
buwrbwruwrbgrrruugbruugrrwbgrwgwugrbwgbrwwuuwbwgurgw
wwggrrwwbgrbwguwwuwwurbgwburwggrwugwguubugwgugggbwb
ubwrguuwrgbgugurgguuwwggbuuubwgwwrwuguubgwbwgrwuwwb
rgurubgwubguggbgguwwwwwuuwugrwgubrrurgubrrgw
uggggbwwgbbrbwururggrwugggurgugubrbrgrurbgb
rwrrgbbbbrwggbrgguwubrgwwuugugwwwbuburugubguwguubuguwrrug
rggguuwuuburuwubgbuwwrububgwrrbwwrubbrgw
ggrbrbbrgrwuggwubrbbwwbgruubrbgggguuggrgw
rwgwubgrruggwruurwwuubgbrwggwbrwwbggbrgw
gbrrrggwbrrbwwuugwgbugrrgggwubgruwburburrbbrggwbbgww
wruwbbuwubbwwrrubbbrurwrbggwwgguurrruwubruuwwuwubgbwug
rbuwguwbugbrrrrbubbwubgwuwbuwwrwuugbubrggrbrwrwwbrwbrgrwbb
gwbuububgrwuuwbwbwbguwggubgrgubgwrrrbwgrrwwwbugb
wwrbugruuwrgwubgbwrwugwwrgrrubggubuwurwgurwubruu
ubgwwuburrwrgrbgurbgubgwwwbwurgbbbwwrgwrbgguguwbbuug
wwwburwwguwrbugwgwwrbwbruugbggburrgrbruwggrrgw
wubuwruubgwubrwwbrrrgwruwgbuugburrbgurbwrruugwbgrwu
brugwggbbgbbgggwbwuuwbuuggwrbuguurwubrggbrggbw
uuurbrwbbbbwggwbrruggwbwwurbbbbubbwwuwuurrgruububwrgrrwubb
gbwugbgbrurrbrggguwuwrgburwbwbuwuurwubwbwguugurrwrgguwgubg
bwrrrrbgwuubggbrbguuuuwwbwbgggbwbguuwbrgwggbuug
rrwwwubwurguurrggbbgrbrrbbrrbrrwurwwgrrbugugbb
wwbwrurrwrgbgggguruurwbrwbbrbwubwubgwgruruuuwrubbgwwrgw
wuburburbbrbbwrugbbrbbbuwbrwrbuwgugrugbgwrrgrwguggbg
gugrggwurbuuwgrwguwbrwubrbrwuwugbuwgbwbwrwrrwwrgbuurg
wwbwbwrwrruuwbbrrggbugwbrwbbbubugbrwruuwbg
urbwgrrgbbgbrgwbwwrrrbrgubrwrrwrwwgurgubuguwwuurgw
gwwrwbuurrbgbwwbwwwurburrgrwggwrrwwwrbbrwgrrgw
rwruurbbbwrbrgrwbbuwrwbbuurrgurrrwggbubwwwguwgbwgggruuugrr
uwbbuwbggbrrbwrrrrgbrbwwgbbruguwubwbwuwuggb
uburbbwbruuwugwrgwwuwrbrrrbgrbwrwrurrbubrgugurgbrgbgb
wbuwrwwruwguggbwrwwrbburgguwgruubuwgurugbgugbubbgbrrguwbg
rbguwgburgwgrwubggbbggwwguwuuuwgbbuwbrbrwrrbgguwr
guwbgwwwgbrrbuwbwbrbbwrbbgbguuwbwrbugbbbgu
rwrbgwggubwbwuubbwruwbgrbgrbuubrurgrwbgbgwbrwbburub
gggwbrugrbbbuwbuwrwgugrugrrrrbwrgbbwwgwwgugggr
wwrrbrwrgugrugwrbuugrrgrbwwrbuggbbruuwrrwrwrugbwbgurrrrr
burwrruurbgggguuwubrrrgubgruwwwrwuggbwbwuwurg
ubbgbbrguwubrwwbrurbuuuguwggruwgrgbbrgbbgbburwrbrguwrgw
rwrgbbrbwwrwggwwbguwrgrrrurgrrgruurbuugbbgb
ggugwrrgwgrrwbwrwgrurggggwurgbgwwurwrrwrrgwubrw
rgbuwbbrrguuwwgbrugruuurbgwuwwuurbugrbrugbuwubbruuggug
rwuwbwrgrwbwugrwubrgbubuwuwbbbwwgggugrbuwrrbbgbwurgw
gubgbwuurgbwbguuubgurggwwrgrwbuwbuugwuugwubwwwwggugr
wbrbrbugwrwrwurrbrruubgbbwwuuuuwwrwwwurruwgwbgugw
wurbrruububbrgwwrwbwurgggrrbrgrwbgbbrwbbrbwbuwugwgubwur
gbwbgbgurwurguwgrgwbwubgggruuuwuuggggbguugbrwgbwburgw
ugbwbbubwrggwuwwubbguurbbrubburuwugwrurbugurbubrgbrrrrr
wrwrrwgwbwrwurggrrbbgrwgbrbguububrwrururrrrrwuwbbgrrbrgg
uuubrrrubwguurguwgruwrbruwugrubuubbrbwbugwrwwbruurwbur
wwwwwbbbggggubguuugbbbbuburrugrbbwubrgbrguuug
wwbgguguugbggrrbwwuwrubgugwuwugbgrwwrggwgwrwurburgbrb
ubrgwbwbwwuwbwggrrrrwwbwgruuurbwrruwwrgburrwurrwrr
uuwrgwbbbrggrrruurwrrrrbrwgbgugbburbuburwrrbubr
gbwubgbggwwbgbwbbwwwwwrwbbwwrgbrgwwwrrbrgwwwr
bbuubrbuwrgrbrgrrbggbuwrugrwubwwwbwbbrwggugurwgbrgbrgbb
bbuwrurgurgrbubuguwrrurwrbggwuwguwugbwbwbbwrbugrw
brrbububggbrgurwurwbwuguwuwrgubwugwrrbugrbrwgwgrgguwg
burgwuurbrgruwbrrwurwuwwgwuubwrgrgwgrguubguggbbuugrrggrgw
rgwrgwurbgguuwrbguwwgwuwubgwguwgbruwrrguuwbbwbr
brrrubwrugrggugrwgbwgugggbuugrwguuwrwwgwuruwwbrg
rggbwgwgugrrbrbwububgrwgubrwbwbubwburbubbw
uubrrwwuugwubguruggugwwrrggrrwwgugrurubrgbwurgrwug
uwrwwbguggwugwwrguuwbrugggugbburgwubruubgugbwgurgw
wbwgugrurrbgbuggwwwrrwwgrgubgbbgbwrrwrrbubuwbr
uwggguggbgwgrgrbbgruwurwggburububrgbwwwguburubrugrruugbwu
wgwgbrwurgwbrrbgwruugurbgwguurbuwubbuubrbuwwwgbuwbb
guwrrbwwgburbgggggrguwuwbbwrbuurrwururgw
rurwbgrwurugrwwwbgrrubrwwwbugurbbwbrgurbgwrwwrgwrwwgwbr
rurwbbwwbubwbrgugwbggbbbguubwrbwbwggwwbguurrub
gbuwbugrrwgwrgbbguugwuwwwubuuwugggrbbbggwrugbubu
bguubggwggrwuruubgubrrrwbwuuggwwbwwuuuurbuugbggrrwbu
uguuwugurrbgbwggwrrgwruwuwrbruruuwwuwrubrruw
rbgwbrbrwbuuwgrgrwwggwrwggrgwgbgrubbgwwuwwrgw
guwuugbwubruguwbbgrbbbwbwbrrurgrbrurrbgbbbwbubr
uubrbuubrruwwggguugrugburwrrrubbbggbbrrbuwrwrurgw
wubbgrruruuwrgubgruwubruggwrwgbwwwggwurggwgrrub
bugbbrbwruuwbrbrguwrbbbgbgwbbbwbbwwwwbwwurruuubururuwwbuw
wrubrrguurwrbwwrwrwugwuuurbgbrgrwrburbrrgwwbbugwwbgbrugb
wwrrurrwugubgbuuurrgrbbwwgwurugurbgurbuwwrguurbguu
wbugrbwggburugrbgguggwbuubbgbggbbburgbbgugurrurgguggw
buurgrruuwwggbwwrrbrbwgbgruwbwwbwrrurwwbggbwwbuggbuwrgw
ggwuwgubbuwwwurbugrbwbrburrgggubuwwururruuwgbwurwwu
uwuburwwrrwggrgwbubwrwuggurububrrubgwbwbrruubrrbrww
wurgwwggruuurwuwbburbrurburbwubuubbwwwwuubwugbrrrgw
wwubbbgbwgbgruruwbrgugubrrwwugrrwwwubrrwuubrwwrgggbwrb
rbbbrbwburbuwwwwurrrgrbwubbbubbrbubggrguuwrrggwrgr
gwwrrwuurgruwburuugrwugrbgbwgugrgggwubbrguwrrwwgrwbrgw
wwbwggbbbuuuugbgwubwurrbgwrwggwgbrwgrbrwwuuuurwwwwwwguuwbu
wuurwbwrgbrwrgrwuruwbuugurgwwwbrwwgbwuwbuwburuuwbrwbwuwuwg
rgurgwwbwrbbbuuuugbrgububwgbrbwgguuuggbbgrrrgrgw
rubgruwurburuuuwbwrrbwuggbbuggwurbburrrurwgrrgruuw
urbgbggrwgrgwwuubwrguwwgbbbrbbrgugrwuwbuwwb
ugwwrwgurrruwbrbbrurgurrubrbgrrbuwbwwubgbbguugwuguurrgw
gbugwbrwbgrguwrrwgrwbbwgrubgrggrrwwwgguurguguggbgrwurgbr
grrbruubggggbbbrbrwgbubgbgwugbrrrgrbuubgrrwbbuwrgugrbw
uuuwbbbgrwurruwrubbrgggrrgubwwbbgwuugbubrrggbgbwguwwwru
guwrwggurbrguubgrruwgggugrbwwrwwbwwbuwgwwgwwuwggwbgbwgbww
uguugggrbwgrrgruwbuwugbrrwuggrwbwggbgbburburbw
bbbwrwbwgrugbbgrwruwwwuwwrbguwbbuuurrgwrbgguruugwbbbb
gwgwugwurwrwbwggwrgwuuugwgwbbuurguugbbruwwrwwgrwrgrwb
grwrwggrrwgubrrrbbubwwwwbugwurbuuuwbuwrbbwgwbwwubugg
wgbbrbbrbgugwugbrwwuwuuurgrgwbbwwwwuwguubbubwwwbrrbuwgwgwr
rwbububrwrggubbwrbuugbugrrrggbrwrrbwbbbbrgw
uwuuuugrguwububurbrrruwwgrbubwrwurwrggrrgw
bgurrrrbwgrgbbwbwbwgrubgurgbgbgwurbgugrwrb
rwrugruugugrwruwbwrrguruuurgwuuuwurbgbwrrwrgwurburwrrugbbrgw
ggbwrurrrgurwgwwuwgwggrbbwgwwuugrgggrbguugrur
gruubgbuubuwguggrwrgguwbwgrggrrbbruubrrrbbuw
rgggbugbgrwwbwbwburrgubrgugwwwrrwburbwuubwuwrrwuu
wguwggrbgrbgwwrgwuwbggbuwwwururuurbburwwwbbrburugrwrbwrrg
urrbrgbrgbbruuwruwubgwbrbuwruwbwbuwgrwuwwwuwbwwuwgggb
guwuwwwruuuugrwgurbbwgbwrbbrwrgbubrbwgwwuubgrbrwggrwwww
buwgggwrggrbgwwwwbubrbbrgbwrrgruwrurrgrgw
gwgbubruwbbwbbwgwbbruwbbubwugwugbbgwgbwuurgw
bwwgwwuugrwwbuurgrwrrrbrbrruwrgugurururrwbrwbwwrwurwuu
wwrwgbgugwuwuuurwgbbbggbbbugubbgbwgggrbwrgw
wburrrrguggbrwuwbbrwwwuuurrwrggrbgwrrwurgw
ururggggrwwrwgrbuwbbgwbugrrbgbwbgbrrbugwgbuuwwrbrw
wbwwrbgbgwgurrrwburgrurwgrgrubrrwwuububwrrrwwggubuwwrgw
brwrwgwubrrbgrwbrwbrurbburrgurbrgwggrubuwrgb
wggbgubrggbwrguwuubguwuubbwwguwggrrggbwugbbgugrgw
ggbbugbruwwubrrggrugurbuubbbwrwurbbgubbrrwgggbg
bwbgggguuggggwurgwbggbggugwrbugubbbbwrgwwwwwbwrrrgw
wrruggrwwgwbrwbgrrrwuurwuuurubwrgwwbrbgubrgwugbwgbwgrwrgw
gwbgbwbrwbbruuwbwugrgbbrruwurbggrburrbrggggub
uwbgwuurbgbgwwrgbbbbrbuwrwruwwuuurgrbwrgrruwwrbwrgrrw
rwguugrubggguuwrgwugwbgubrrrurwwgbuwgbgggwwwrrrwrgw
uugggwurbwrrrubwggwburwuwurwwguugrwruguuruguugwgb
grwguguuwwgwbwuuruwwgwrugggugbbwwgwruguburb
rbugruwbrgrrbrugwbwrgggubguwurruwrggbggguwwubbu
uwbgbuubbgurbggubbbuwwurrwbuurwurwrrwuwrrbgwrwwb
guuwrruggrbbrbwwrubwrwbwggbwubgrwwrbwggrgwbw
rbwgggrgurgguwuguurwugwuurburbgbbgburuwbrgw
rubugrgwwggbuubrbgrwwgruwbugbbbruwgwgbgrugrrrwbrrbuwuubwu
gurggrgrrrwrwuwbbggbubgurbwuwrgbbwbgrrggwrgwrgg
urgbrbbgguugwubrgwuuwbrbgbrbuurggrrwbrgw
bguwwwbwbruwggubwguwrwugrgrubrrbuuuuubrwbrwbubububbwruuru
ububgwgbrgrwwrguuwrgugbggwubrbgurwwbgguurbgrgwwgrbuggrwbrgw
uwbuguggbgrurrgrurrwbrubrrubbwrrgguwugubrrurbrbrrgwwg
wwurrbrguuwwrbguggbuwruwgruurwwugugggurggrrrgwrruwrubbwwur
wruurbrbbbuwurrrwwrbrwwbwrbrggubwuubbbbuwbrrrwbggwwrgg
bwrwburrgwgurbrbwbrruburgrgwwubguguwwwgwbrbuggrwubbr
gbgrwuugbuwrwgrgrburwwrggrbgwrgguugrwguubrgwwrrwrrgw
rgugubugbrwuwugwbgrwugrurwwrrwguwbbruwbwrww
wrurwbbgwrrgbgwggrrgbrrwuwubrrbuuwrwgrrgrggbbwrubwrbwwgrwg
rrubrwgwuwbbbugwrbbuuwgwbubgwgwuwuwgrurrwrwwgrgu
ubrurbbwururburwrbubbuggggrrwrrrgwgbbwuuggubwbu
rggwwuubbggugwubggwuwugwwrrguuwbwrrrbwwgbgwwbrurw
bgbgguwbbrwrwburbubwrgwruuwgwrbgbrggbgbgrrrrw
uwgrrggrwbbbuwbgbbrrwgwbbburwuuggwwurguuuwruwubrburgw
uubugwbbrrwbuwggwgrwgwrrwggwwuugburgrrugbbuwg
gbbwwgubugwbubwggwbrwwrwwrgbbbwgurugwrwwbwwgggbgrwwgubg
ubgbwwburgbwuuwbrruwbwruwuugwbgwggrgrwbwurbbbwrgurwbg
wrwgbgbgrwwbbbgwrggwbbwurggggbgwuuguugrgw
bgrbwggwgbrgguwwwwbuuurgwrwuubbuwuguwbgbwggbgbrwbbrrwbu
gwubwgbrurbwwrrgugwwgbwbwuuurgwbwrurrgwurgw
rurwuwugruguggwugruburbwuuwgbrwwbrbwrgbgwgurwurrgw
uburgrbugbbubbrubbrbgwbrrbugbguguurrgrrgwwrrbgbbbu
gbwbggrbuwbrrbbrgugwwrbuwggwggwgrrwwuurgurggbww
ubwbrbwwwwwrguruuuwwwrbwurrruguubruuwbuwruub
bbwwgrbbbbbbwwugggugwgrbwrbbbbbbrrwrrwrwgwb
wuubbrbbbuubruwurrwuuruurbwbguwuugbrugwwwbugbruu
gbwwuwgbubwwrwguugwwbwrgbwuuggrwbgbuwwguggb
wrwwwwbwugbgbuwwrrwuwbbuwgrgwwwwrbrgggubbrbuburwr
uwruubbrwwrrgrururgwuguwbgbbgrwrrugbwuububrbgwuwwrbbwwr
grggbuwbbrwbgubwwuuwbggrugwgggurbbburubuurrguuuwrrw
gbbbbugruwwuuubguuugbuwwwugrggbrggurwbwubrrbwurgwggbgrgrr
uguububuwwurruuggwgrruwbwrrbwwgwwgbgrrbgrgw
rrwuwguwubggrwbwbruuwggruuwrbwgrrgugbwrugwguwugbbrb
wbwggrbrwguwwugggwwrbwrrbrgwwwgubggbrgrrrgububgwubrgw
wrrrrrwrrwrrwuwrbugbbwuubugrburgrbbrruurbuwwbwrrbubrgw
gburugrbrugbuwgbbwuwgugrbwugwwrbuuguggurrgw
rbgwwwwgwwburwbbruurggwbwggwuggwrgggwgggwwubgrbggwugbgbrww
gwurwuugrbrwgbbbuwguggwrurrurwguurgururbbrruwwgrrwgbrgw
rwuwgbuwrbbgwbbwgggugggwrgwuguwururrrbwggrwubrwgrrwwbubgb
rwrgubburrbuwurubbwrbwgbgbuwrbrrubbwuuurguwururgw
ggbguuububgggurgruwgrrggwrbwubggurugugrgggwurwbgbwr
brgwrububuwrrwrbwuuugugwururbuuwurrubrbrwwuggggruburbub
uuuggrrbgurruurrbrurgguuuuggrbgbwgbrurwwgwurrrrgrbu
wrrrbrbggwwrgrgbuurbwggrguwwurwrrrrubgrgw
wbwbrwrubwbbubgugruwrwubwguurwbwbwwgurggggrgguuug
rrrbrbggwggggrurbugbuwwrgwburgbgrwgbwgrgwb
ugggurrgrgwgrruguwwwbugrbrbuggwwubgbbgrggrbbuuwuwwbbubrgg
wrwbuwrrburbgurggbwubrwurwbgrggbwbbruggguggbrr
rbbububbrrrrwrubwrwbrugrwbgguwurbwgburrgbwwwwuug
gbgubuugubwwuwrbwwgwugrwgrggruwbugwbuwubgbwrurwrgurrgr
uubwbgubbrrbbggrgwgubwwgrwggrbuwbuwrbwwrguubwrgw
ruwuurggwwuwbbrwbwugwugbwbgugwwburbgugwrwggrbruwgwbuggg
bburgrgwuurgbrbwbgurwwrrwwgbgurwubwbbggbbrugrruugbgr
grwuugwbbugrgrbuubrgurrbubbwurgbuurrurgw
ubwggrrrrurwggwubbbrgbrubwbrgrbrwuruubrubugbr
urguggggggguwbrbbubggbrwuurrrruugwrbuwrgwbubbbrg
gbgbwggwubrgwburbuwgburgubwbwgggguwwrrwuwwuggwubwbbwbrrgw
urbwbgbuguuuwwuwbgrbuwbbuuuwugwgwbgurwbwgwugbu
urrgrrruwwwubbbbgrruuwwgrwbbgwrbrubggubrwwbubguu
rbwwuubwwbbrbubrbgbgwbrrguwrrbwruwbugwbrgw
wwggwwwbrgwwurubbggrrwgwgwbrbgbbggbrgrubgrb
brbwrrugwgrgwgugrugugwurburrbwrrrgrrbrbbguwbuburgw
wruubbbuwwuubgwrwwbuurgbrwrbuggggbwuwrbubggwruwwwbbguu
burgbbrrurburwbuuwbgwbwrgrrwwuwuugbgubgbwwggubr
uuurgwugggubbbbugrugwuurwururuguwwbgrwgrgw
ubrbbbgrgwgubuwggwrrbuuuburuwwgbguruwbuuugwguruuurgubrbrug
rwgwguwrgrwbbbruwrbbwbguburbguwbuwrgrwwuubrub
rrbbgrurrwwwbwwgbbbwwbbrbbbbwwgguggwbubuwbuuwuubuurgu
ggwgggwbwbwuburugrrbwuwuwwbgbwrubrubugruubrug
wrbbgbgbubrugrruugbuggbbwubwwrbrgbwurrrubgrrrgubw
rwuurgubwbwurbuguwwuwuguwruuwrrwbbrrrrwrrbgrgggburwgrbb
wggwruurrwbuggruwbububgwrbburwgwbgrruwruggrgbgbguugwuwuw
rurbrwgrbwwgrurwgbwbwugubwbrbgrgbgubggwbbrubugrrr
ururuubgwwrwwwrbrgguwurgbbuugguugbuwurrwrurwuwrburburuwub
uwwwbwrbgururuggburruguurrrwgrbgwbwbrbgwburbw
ruwggwubwbwggruggbgubrubuuwuurugwrwuuwgbubrrurwuwu
wwrubrbwrbwwuwgurbrwrurrubbwrbwwbrbrbubwwubbgbubwruwgwuw
bwwbuggruwwurgbuwgurubuwugbgwuruurruwuurgrgrrr
urbuwrbwgwurwrggugrbruwbgwggwggrubwwuubwbbububg
rwbgwgbwwuggruubguubugbuggrrwbwrrbwbwruububw
rgbrrburwugurwrrrubwwgwrwuwwurbwbuugurbrbuuggrrwrrw
bgbrugurrrgrubrbrwwrbwurggubbuwrrgwrrgbrgw
ugrgbbbrwgrbguurwbburuurwwrggurgggrrubrrbrbrugwurubbw
rrwbgburwrwgwurwrwbrgrwgbuuurwuguubgguggwbbuwuubguwrrb
rguuurbruwgwrugwwguuuwwwrgruwururgwrruwbbbuuwggurbu
wuwguurrgwubruurruwbwbgwgrrbuwgrwbubwuwrbbubu
wbbggubrgbgggbrwbwwruwwruwwgwrbgrgbwbbuburb
guburbrwbgwubwwwubbggggwbwrguguwwbrbbgwuwguwrwgwg
gwgwggwuubuggrburwwrrgggubuurubbgbwbrgbwwwrbgwbbbubru
wbbwrbgbugbugwrgrwuguwrrrwgrugrbbuwbrwubuu
gwgrrgwrgwwbgbbrububbgwggrbgwrrwubgwbguggggurgw
bwbbgrwuwuugbbugbwwwgwwbrburggbbubrwuggurrbwwbrrgb
gbrrbgwwrrgubbgggrgbubrgubguwrugrrguwgruwubuwbgbwguwgruwrgw
bwwgwgrwbgrrgwrugrbwwwurwwrguubuwgwgrugrrgrgw
rwuubggrgubbwuwgrrwurwwwbrruwrububuggbrggrggwrgwrgw
rbuubuwrbbruwbuwgubguwrurwrgbwugbwwrgbrwwwggwbuubgw
ubrrbwwgrbrrubuwbrubbugwbugwrrbrrubrwrurubggrgrgbgburu
buwrwggubrbrrgrwwugwwburgburrgbuugrwruuuwuuwggubwbgwurw
bugbwrrrwbbbubwgrrwrrbruurgruugbbwbwwurgwwrgw
ugwgwrgbbguwubrrbugguruggbrwwgrwgrgwgrbrubuwwrwguwrwurgw
rubwgbrgguwrgbwurugburwwwrbrgwugbbgburubwrrgrgbggu
bwuubbuurbuwburwwuubuuwgggbbbgrwrgbwwwrbbrrubruuw
wbbwggbbwbrgwrrbgwwwwuburwuwwrgubgububwwuuwrbrrgw
rbgwrwuwuugrwwbwgrgbgruugruwrbwgwugrwbrggbgrgbrrrwuru
ubgwbwwrugggrwgurrwbwwrbwgrgwggwbrubwwwuggrwgbb
rgwubwbrgrbggbwuwuwugruggbrrgbbwrgruwuwrgw
urwrwrurubwwgbwgguruwbuugrugwggrwurgbrwbbrgbwbgbugrrg
bbrwgbuwubwubgwgrwrwuruwrrbubrwrgggugwruwwubw
rrbuwbwrrwgburbwguugwbwgwuwrwwrbwgwrgubbbugbrbggbbgbruu
ugwgubrbbwrbbgrgrubbwrubrbgwuuruwgugwbwgwwwrrggwgbrwuwbwb
bbrbrbwrggbbuwgwburwuwuggrbgrrugwgwurrgrwuubwguuwrgw
rbbuwwwbbgwurwbgbgrbguuwrrwggwguwggbuwbwbggwbb
uruurrrrbrrgwbrgbuuubugggrwwgrbugrgbruwbggwuugrugububgugw
wwuwwruuwwgrgwbuwruuwrbuubgrrububuggubwuuru
ubwbggggwubruguwwgbwbubwwubgwbuwbwbwggrgw
wurrbrbbubbbwguwbuugbwbrbwguwurwrrwgwwwugurrguuwuubbrugrwu
wrrgugrwwgugrwgwgwbwrwwrrbwubwwrguuruggrugbwgrwrrbgbrwwrb
uuwuggggwuuwbuubgbwrrrugwuuwbbwgrrbbrwbuururgbruwr
rwbubbgwugbgbgurgggugwggbwrwubuwbwwgggbwrwrgrwubrwgwg
wbwrwwurgrgrrrwwuwgbwbugbwgbwbbrggwbgwbgrggbgrrwgwrbrb
gugbguwbwrwbrgbgggrrwrgbuuuggbugbwubugbbgbrrbrruburgbu
rururwrrugubugububbubgwugurwgwwbrbgrwbrwbbwgu
wrbggguruwgwgbrwrgguburbgwburggrbrwwuwuggru
rbbbwbrbwbgbwrbbwuggrbgwbrgugggbwburwubgbrgwuuwrbguurwrg
gugrrggbbwrbwrwbubuurrbrbruuwwuuugurwrrrrggwuwgrruruw
uruurwbwbuwrbubbgrwwgbwurbguubbuwgrrwrbrrwrggbwrr
wrbwuuwgwrgrubrurruubburgbrbbubuguurugwurbgubuuwrwrbwr
wrugbwrugwggwrubguwguggbwrwwgbgwuubbubuurbubwbuuuwu
uuuwurgwgubuwrwwgrwuguwggrwgggrwruugbbugggbrwrbugw
bbbuuubwrwbwrwwurugrwwbrwrrrubrwwwggrurbgggbg
wbgguwwwbgbrwrrruurubggrwbwwrurgurwrgrrgbuwwggg
wuwwurugwugbuwgbuggwrbrugbgrgrruwwbwugbrwwbwrwgwgguubuurb
bubwubbggruggwububwuwrwgbugrwgbrwgruurbgrrrwbbrgrwurrgwuwb
rgrgrgubbwgwbrgrbururbwwwruwwwbrbwbbuuwbbwgbwrgg
wwgbbuwgubbubrbgrbwrggggbgrbwgwurrrggugwbgbgrrurruwrb
rgruruwrggwrrggbugwgguuggbgwbrwwguuuugbbbwruuugrugubbgwg
rrrrurrubwrrugbgbubrbgrgbwwbbrurrrrurwwgbggr
bwwrgguubgwgruuuwrwgubbgubuurrurbrgurgbwrbuwbgrruuuubugwb
rrwrubugggguwbuugrbubwwwrwbbrgggruwggbwubuubrurgw
bbgubbwrubguuubrwuggbwggggggbgubuguuwrwrggbwubgwrwuu
rugruwrbgrgguwwrwrbggruwrbwrrrurrgggubuggugubrww
bwwgrgwgwgbgggguurrwgwuugbwwrwbbuurrgwguubg
wgwgwuburrwbgbuurggugbburwubwuwgwuubwwrgbrrrw
wgggugwwwggbggbbgbwurwwwurbgrwugugggguubbbw
grburguwbwrrgwubbbuburgburrgubbruwrwggugrgrbrubg
uruurubuwgurgrubuwuwgbbrgguwubuurgwrwwbwbbuu
wgurrrgwuugburwrrwwbrugwbwwrgrgwwwugbwggbgruubwurgw
bggwrwggrgrwgrrbburubrbwwbrubbbbbuuuuubrwbbbwrbwubgbwrgr
uwuguuwbruurwgugbggrrgrruugrrbrwrurrgrrrgbbbgwurbubrgw
grwbwruwwbwrugubwrwguguwwrwgruwrgbguugwwwbuw
brbggwbruwggrguruuurrgrwgugwgurbrurrburwrbubuggbguwurrgw
rgubuguruuwuggurbuuuwwrrbbuburwruuwuggruggwrwwrgwrrubrrur
rgbwrggwrrgurrgrrbrgrggrbbbgwubbrbgubrguwuurbwggbgwwwu
grubgrwgrgrurrgrggubgugbgwrbbuwgbgruwwwbbrwruu
grgwrwrugggubwgwwgwwwgrgruurbrrwuurgubbbbgrbbwrwuubgrwwb
gwbuuubbwgwrbubuwbbbgrwgrwgwuubgwwrwbbbbwugugrrwwuuruuggu
bgwubrgwuwwuruwbbgugbgruwwuuuggbrgbggbwgwubbbrrbggu
rruuuburggwbrbwwbwrurgubburggbggwrugururbugwgwbgggu
buwubugbwrgwbrrwuuurubwuubgrwrwrbubwrbwrugrwrbgrur
rwbbwbrbrgwggwwubgbbbguubwwgbrwbwbguburrwbg
uwwbubbbbgugrrgbrwbgwuwwwgwuwwrwurwrgwwuugrbbwgbburrbgrgw
wbbgwrbrwbrubbrgbgwrrwggwubbbgbgbwwbggwrbguwwggurggurb
bwrbuwwgubwubggwgrwwgbgbgwguwuuguuuuggbugwgrwgwwgbr
ugruwubuwurwbgbwubuwggrbbbbburgbggrbrwrwrgrbugwwgubgguuwrgw
wuwgggggbrwugbrguwururruugwwgugggwbwbbruubgbbrwwrgw
rbbgggubgbburgbrrgubwubrburwggbrugbgbuwgbuwbubggugrrubuw
rgurugguguwwrgbbrwbggwrggbwbrwgruwuburbwbggrgwwwuwwgur
ubbbwurwuugrubwrurrrggwggbugbbwwurggubbwrrggwwbrbwbbbgrbub
bwgrgbugggbgrrwwbuwuwwwbrubwuugrurrwuwugbggbubrbgubrbbgww
brrggurwgwuuwburuwruugbwbuuuwuwrbugurubugbwwu
uubrbgguggbbbwgwubwgrrbgbwggrrubrrrwubugbbgwrrrbg
uwuruwrrwwgbwwbgbruuuggrguwbrubgbuugggrbgbugubbgwwrwrrgwbgw
wgrbwurwbubwggugrgwubuggrrurwwrwuuuuggbgrbbguuuwguwgg
wwururbgrurgwruuguwrruwuggrugwbrurruwurrbubb
urrrbggrwwwbwbbrubwrgbwwrwrwrrruuurwggrrwgurrrrgbrg
gbbugbwrggwgwrbbbgwgbuugbruguuuwuwrgbgrbwgrgw
uggbrrwwubgwbrwrwrbugurgrubwbgbuuububruurrbrbwbrgw
bubrrwuubuuugrbggrbrwgrrwwggwrurruuwguwrurg
ggggbbuwuugbubwgugurwwwrbgbrburrbwgbgrwrugrrbggbgubbwggrgb
wbrbwwwrubggwggbgubbrrubgrggbuggurgrwrrwruurubb
uwbgrbgubwguuwrbburrugugbwbrggubgrrrwbubrruwbggurrwbbrgw
ggbwbruwubggburubuuuuggbbburwgbwuwrwbwggwb
ggwwuwwuuwruwgurbuwbgguwurbuububrwbubgwububuggb
gbgbbbbrwwwgwbgrbbuwuggwrugbugbuwuuruwgwruguwuwgrrbggr
rruburbbrrguwwgguguwrruwgwrrbrwbbuuuwwgurbwuwbg
gwwwbwwrrgwwgurwruwbwbrgubwgbgbwurrrgwugbbugwrbrg
urgrwgbbwrbgwbwggbugguwwrgggugbbbrggubbgbrugwgrgw
uwgrwwbbbwwrgbbwrwrubuurbugwbwugrbbgrruururuuurbuurw
uggrwwbrurgbwrggugrrbbwwwwbrwgrwbbbuwgwuuwuwbrrb
wruuwuubrwbuubbbbwgwrubugbrrbgwgrguuuwbbwggwggugr
wuubrurgwrruwguwgrguwugugwggrrgwwbruwrubwrrbg
wwrugbubuurwuubburubwrwuwuuwrgbwbrggwbuwgru
wrbggbrbgwwrgrggggwruwrwbgbuuuubwwuuurrgbbrurbgggurrrgw
rwgwbbgbbbgrbgbwbrguuwgwrwrwwwuurwrruwburbwgbgbguguwrbwurg
gwrbwguubgrubgwwuguuwwgugbwggrgwrbrgwbbugugrbrbrrw
wgwugbbbbbugrbggubrwwbgguurggbgbbbwwrwwgrrrrbggrgrbb
gggbrbuuugubgwgwuggguwbgbbugwbwrgrbrrwugrggurrwgur
wbggbwgbuwuwgwgbwwgrrwrgugggwwbrwrrrbwwrgw
gwgubwbrgurrguubburuwguwwbrggwwbbbuwuubbggbruu
gubwrbrwrwrwwrwggbgwbggbgwgwwguwubrrwguuguubrrwruuwuwurrgw
guuwrurguurguruuuwrwbgggruwrbrbbwrrrwwbuburgbwwrubwrgwwbgb
rgwwuruwrrrrrrbwrrbgrurgwwuggrrubgwurwrugrrbrwgwwwrwurgwbrgw
ggwggurwbggwwubwrbrurbuubrrubguuruuwbgrububbgrgw
gbwwggggurwggbuwrrgrwrububwggbwbwbruubrgrrrubuurwwbuwwuu
ugggbwbwbrbrgwwburbrrubbwuuugurwbbbgbuwbbwuwrbgwgwruw
gwgrwurgwgwrwgbruruwrugwwguuuugugggrbgbwgbw
bwuwwguggbwrrbgburbwbguwwuwwbwurguwwbugwrgw
bbwbwwrgburgbbuurggwrururwruwrugbubuguwwbrubuugg
gbgwwrurgbuwuwbrwubwbbgruwbbgbgrubuwwgrwgg
rruggbugrgurwuburgubwbbgburrwwbggwwrrwbbwwbrwwrw
grrbwrgwurbruwrbgurubrbugbuwwrbrugwgwuurggbwrguggbwruw
ubbguuurwwrgbuuwwgrrbububugwbuuburwwuububwbwubrwguwwwrbw
rwugwbrrwwuwwuuruubwwbwbuwuwgurwurrrrbgubwggwrwbwrgbww
brbburrgububgburgbwuubrrubgbrrgwbuwwwbgwguwuurubrubur
bwwubguwbrwbrbugwurrruguwwbuuuwrbbbbwwbuwwbbgggurgw
wbuguubruburgwguwguwwbggruwubwbuuggwuwburburbuu
brwwbwrwbgwugubuubrbwrbgbgrggbuuwwurburgbbuwruggwrrrrgb
brrbbugwbgrrwwbuurbbuwbggubuwurbgwwbubwwubruuuwbwurgw
urbbgbwbwbgurbubuwurggrubwgrgwwrgrrggubwrgg
urgwggurwburbggugwwwugwbguwuwgbbrrbwurggugugrwurgwwrb
rggwuwruugrwgbwuburuwbbwrrrgrubuugwrurggburrgw
wrurbgbbugurwugrbbbwugbwubgubgruwuuguburrrwggbuuggbrrbw

72
2024/day19/main.py Normal file
View File

@ -0,0 +1,72 @@
from functools import cache
with open('input.txt', 'r') as file:
data: list[str] = file.readlines()
parts: list[str] = data[0].strip().split(', ')
starting_letter: dict[str, str] = {}
for part in parts:
first_char = part[0]
if first_char not in starting_letter:
starting_letter[first_char] = [part]
else:
starting_letter[first_char].append(part)
designs = [design.strip() for design in data[2:]]
# this solution is pretty slow and stupid but it works, i think some variation of KMP would be faster? like a graph based search with a large amount of pre-processing
# Could maybe use memoization on substrings
@cache
def search_designs(design: str) -> bool:
if not design:
return True
first_char = design[0]
if first_char not in starting_letter:
return False
possible_matches = starting_letter[first_char]
possible = []
for possible_match in possible_matches:
if possible_match == design[:len(possible_match)]:
possible.append(design.replace(possible_match, ''))
return any([search_designs(m) for m in possible])
possible_count = 0
for i, design in enumerate(designs):
if search_designs(design):
print(f'Design {i} finished search')
possible_count += 1
print(f'Possible Designs: {possible_count}')

10
2024/day19/test.txt Normal file
View File

@ -0,0 +1,10 @@
r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb

4099
2025/day1/p1/input.txt Normal file

File diff suppressed because it is too large Load Diff

45
2025/day1/p1/main.py Normal file
View File

@ -0,0 +1,45 @@
INPUT = "input.txt"
with open(INPUT, 'r') as file:
lines: list[str] = file.readlines()
place = 50
zeroes = 0
# returns new place
# dir, 0: L, 1: R
def move_dial(place: int, move: int, direction: int) -> int:
if direction == 0:
move *= -1
temp = place + move
if temp < 0:
place = 100 + (temp)
elif temp > 99:
place = abs(100 - temp)
else:
place = place + move
return place
for line in lines:
line: str = line.strip()
direction: int = 0 if line[0] == 'L' else 1
# We only actually care about the last two numbers
if len(line) > 3:
move = int(line[-2:])
else:
move = int(line[1:])
place = move_dial(place, move, direction)
if place == 0:
zeroes += 1
print(f'Dial Zero Count: {zeroes}')

10
2025/day1/p1/test.txt Normal file
View File

@ -0,0 +1,10 @@
L68
L30
R48
L5
R60
L55
L1
L99
R14
L82

4099
2025/day1/p2/input.txt Normal file

File diff suppressed because it is too large Load Diff

46
2025/day1/p2/main.py Normal file
View File

@ -0,0 +1,46 @@
INPUT = "input.txt"
with open(INPUT, 'r') as file:
lines: list[str] = file.readlines()
place = 50
zeroes = 0
# returns (new place, zeroes)
# dir, 0: L, 1: R
def move_dial(place: int, move: int, direction: int) -> tuple[int, int]:
if direction == 0:
move *= -1
temp = place + move
if temp < 0:
if place == 0:
return (100 + (temp), 0)
return (100 + (temp), 1)
elif temp > 99:
return (abs(100 - temp), 1)
elif temp == 0:
return (temp, 1)
else:
return (temp, 0)
for line in lines:
line: str = line.strip()
direction: int = 0 if line[0] == 'L' else 1
# We only actually care about the last two numbers
if len(line) > 3:
move = int(line[-2:])
zeroes += int(line[1])
else:
move = int(line[1:])
place, z = move_dial(place, move, direction)
zeroes += z
print(f'Dial Zero Count: {zeroes}')

10
2025/day1/p2/test.txt Normal file
View File

@ -0,0 +1,10 @@
L68
L30
R48
L5
R60
L55
L1
L99
R14
L82