Compare commits

...

2 Commits

Author SHA1 Message Date
65b0a425d2 Add solution day 15 2024-12-15 21:13:11 +09:00
3aa713288e Add solution day 14 2024-12-15 15:54:53 +09:00
11 changed files with 1181 additions and 0 deletions

12
day_14/example.txt Normal file
View File

@ -0,0 +1,12 @@
p=0,4 v=3,-3
p=6,3 v=-1,-3
p=10,3 v=-1,2
p=2,0 v=2,-1
p=0,0 v=1,3
p=3,0 v=-2,-2
p=7,6 v=-1,-3
p=3,0 v=-1,-2
p=9,3 v=2,3
p=7,3 v=-1,2
p=2,4 v=2,-3
p=9,5 v=-3,-3

500
day_14/input.txt Normal file
View File

@ -0,0 +1,500 @@
p=98,102 v=52,-49
p=36,69 v=19,-95
p=32,43 v=23,1
p=53,78 v=-68,-28
p=57,68 v=58,99
p=55,75 v=13,83
p=71,101 v=33,93
p=13,92 v=-74,78
p=47,96 v=66,-70
p=89,12 v=39,-13
p=100,64 v=43,-78
p=47,91 v=13,-88
p=14,87 v=38,40
p=66,17 v=65,23
p=0,67 v=-27,-16
p=71,17 v=-24,25
p=97,30 v=-13,-77
p=62,7 v=11,-26
p=43,62 v=-57,-71
p=78,66 v=79,-34
p=62,54 v=-90,7
p=98,98 v=64,21
p=34,2 v=-23,-80
p=16,94 v=-67,59
p=66,70 v=-76,-65
p=92,54 v=-48,-11
p=48,30 v=-66,-66
p=82,24 v=-40,67
p=39,89 v=54,65
p=37,102 v=84,52
p=70,95 v=36,57
p=9,80 v=-70,75
p=1,1 v=-9,-70
p=4,99 v=-73,79
p=64,61 v=-21,-5
p=88,67 v=42,-83
p=44,1 v=91,-20
p=8,85 v=38,9
p=67,57 v=83,62
p=20,74 v=38,81
p=76,23 v=72,-19
p=90,99 v=-91,-21
p=99,12 v=-99,22
p=49,65 v=19,13
p=74,48 v=93,44
p=73,97 v=21,27
p=15,95 v=72,-15
p=94,65 v=71,-90
p=13,58 v=71,-96
p=38,0 v=74,71
p=81,89 v=75,5
p=40,15 v=8,-87
p=45,83 v=48,-40
p=66,87 v=-7,33
p=67,40 v=-83,-36
p=73,9 v=-22,-56
p=52,25 v=21,56
p=50,78 v=98,99
p=96,31 v=64,-12
p=88,19 v=-37,-98
p=15,90 v=99,88
p=86,101 v=-80,-75
p=27,90 v=-64,87
p=33,83 v=-49,-70
p=87,38 v=-81,23
p=6,4 v=60,-50
p=61,38 v=-37,-10
p=3,36 v=-77,-91
p=25,1 v=46,-11
p=87,97 v=-87,41
p=26,35 v=-31,67
p=85,8 v=-48,60
p=14,96 v=92,-99
p=25,46 v=52,73
p=29,75 v=-10,-21
p=56,62 v=13,-50
p=14,58 v=12,-98
p=8,71 v=-85,32
p=87,52 v=64,-78
p=80,68 v=46,-94
p=98,37 v=35,-79
p=97,11 v=-23,-26
p=59,71 v=76,38
p=61,27 v=-28,-20
p=83,46 v=50,98
p=5,34 v=-73,79
p=86,50 v=93,98
p=94,101 v=50,3
p=31,70 v=97,24
p=14,21 v=40,38
p=87,95 v=-6,-65
p=33,11 v=-78,-92
p=92,85 v=-35,82
p=75,46 v=-72,-65
p=98,55 v=64,7
p=38,66 v=8,-53
p=88,97 v=-62,-76
p=90,75 v=-29,-21
p=32,50 v=68,-25
p=2,98 v=24,-14
p=24,12 v=-34,-61
p=32,82 v=-92,3
p=72,96 v=94,-95
p=55,72 v=15,-77
p=84,77 v=3,99
p=80,78 v=-47,-10
p=79,36 v=-69,48
p=42,6 v=33,-93
p=72,2 v=-65,-8
p=51,84 v=26,94
p=15,17 v=31,-68
p=23,7 v=45,-14
p=52,14 v=-9,64
p=8,29 v=16,-73
p=100,59 v=-45,-41
p=21,63 v=52,14
p=9,48 v=-67,-60
p=89,8 v=-31,79
p=21,100 v=48,59
p=81,49 v=-58,19
p=1,77 v=24,57
p=25,34 v=5,73
p=20,101 v=-67,-2
p=86,36 v=28,-95
p=97,31 v=51,-7
p=76,20 v=83,-12
p=96,77 v=-8,-22
p=84,94 v=39,-69
p=11,10 v=-99,-26
p=100,23 v=-1,-13
p=20,50 v=16,-54
p=15,81 v=-66,88
p=27,62 v=-71,-72
p=70,56 v=90,81
p=10,45 v=-81,-66
p=100,51 v=24,-90
p=31,73 v=49,-59
p=56,5 v=92,7
p=45,28 v=-46,60
p=84,81 v=-6,28
p=89,60 v=-91,8
p=66,42 v=54,-42
p=71,101 v=-76,-93
p=31,76 v=26,-52
p=97,55 v=31,73
p=31,26 v=-96,41
p=79,4 v=-29,-87
p=65,21 v=29,36
p=3,102 v=-8,87
p=20,65 v=-60,-90
p=87,60 v=-98,86
p=57,13 v=16,87
p=66,95 v=-43,94
p=33,32 v=68,47
p=23,80 v=-51,-10
p=67,56 v=-30,71
p=36,58 v=-53,-29
p=57,63 v=-54,-64
p=6,30 v=46,-98
p=0,40 v=86,59
p=13,102 v=69,55
p=93,14 v=-30,29
p=34,7 v=45,-25
p=36,7 v=-46,-8
p=39,100 v=19,-69
p=25,59 v=-64,-36
p=20,14 v=52,59
p=12,44 v=-29,-11
p=45,71 v=12,7
p=2,29 v=75,-66
p=88,54 v=75,32
p=27,51 v=70,-48
p=88,85 v=-68,55
p=31,64 v=-55,-89
p=21,16 v=9,41
p=40,58 v=26,55
p=96,55 v=-39,-8
p=30,29 v=-71,30
p=74,80 v=65,-63
p=98,78 v=2,38
p=54,93 v=-62,-82
p=35,70 v=-31,32
p=73,17 v=-29,72
p=0,97 v=-88,-62
p=15,26 v=38,-43
p=20,76 v=-71,-58
p=0,63 v=24,68
p=21,24 v=42,31
p=78,68 v=97,63
p=79,44 v=79,-84
p=60,100 v=58,95
p=46,72 v=-7,-83
p=25,29 v=59,18
p=88,16 v=-24,-34
p=62,67 v=-54,14
p=58,35 v=-43,-12
p=40,34 v=80,7
p=32,90 v=-55,4
p=76,1 v=-40,22
p=87,4 v=-57,52
p=76,93 v=28,-75
p=69,49 v=36,92
p=66,79 v=-36,-28
p=58,63 v=-7,-16
p=97,30 v=82,18
p=44,10 v=37,-20
p=11,31 v=16,21
p=78,20 v=-72,96
p=72,56 v=-79,-4
p=44,81 v=-75,-27
p=76,51 v=43,8
p=84,81 v=14,-69
p=0,11 v=71,-50
p=92,51 v=70,-69
p=73,69 v=32,-77
p=63,66 v=-36,93
p=25,2 v=-49,-50
p=90,73 v=10,9
p=47,48 v=37,-48
p=87,5 v=-58,38
p=11,19 v=27,29
p=3,82 v=92,90
p=61,68 v=-84,-70
p=25,40 v=52,7
p=92,47 v=-86,-21
p=95,21 v=17,60
p=2,47 v=-30,49
p=18,5 v=-56,77
p=23,31 v=-85,-30
p=19,7 v=-38,5
p=37,25 v=-18,96
p=37,2 v=99,95
p=21,58 v=42,8
p=59,92 v=94,82
p=61,63 v=-18,-41
p=4,65 v=78,-83
p=40,71 v=-64,-76
p=82,25 v=61,66
p=50,15 v=-57,18
p=54,97 v=-61,-39
p=94,5 v=-30,4
p=14,80 v=16,-28
p=46,40 v=-10,49
p=95,49 v=32,74
p=77,45 v=14,-24
p=37,16 v=77,-39
p=62,35 v=22,-61
p=36,100 v=77,4
p=75,53 v=-26,54
p=63,43 v=25,-75
p=95,83 v=-48,-81
p=10,34 v=-99,-30
p=19,9 v=13,-49
p=27,81 v=-81,99
p=52,15 v=69,-1
p=19,4 v=-92,-19
p=72,87 v=-18,-88
p=88,94 v=28,76
p=71,57 v=65,-47
p=85,48 v=-76,26
p=39,16 v=-77,-57
p=74,97 v=-8,-39
p=57,74 v=-16,-87
p=83,40 v=86,61
p=14,26 v=39,88
p=100,22 v=-71,-81
p=35,25 v=-3,11
p=98,79 v=28,32
p=73,34 v=34,46
p=71,17 v=-25,50
p=69,78 v=-85,44
p=39,33 v=89,65
p=82,100 v=10,-51
p=14,43 v=84,42
p=14,41 v=38,-78
p=70,91 v=89,-20
p=80,61 v=31,53
p=1,58 v=71,-29
p=14,21 v=-63,-43
p=40,4 v=25,8
p=70,72 v=29,20
p=39,50 v=13,-62
p=9,70 v=-1,-47
p=95,31 v=-32,-63
p=15,64 v=-92,99
p=26,33 v=-58,-92
p=23,60 v=70,-47
p=5,50 v=-22,-32
p=5,12 v=-89,7
p=21,63 v=48,68
p=56,62 v=-29,-10
p=59,77 v=-36,-10
p=76,92 v=97,-81
p=63,6 v=-65,-93
p=5,58 v=5,56
p=17,24 v=-24,18
p=13,4 v=-92,-76
p=55,18 v=-61,-92
p=17,83 v=38,-70
p=71,41 v=63,-86
p=59,94 v=90,67
p=47,46 v=44,38
p=24,59 v=1,-65
p=36,69 v=72,-48
p=70,13 v=47,-50
p=78,11 v=54,-75
p=78,97 v=-51,82
p=66,37 v=-68,92
p=88,92 v=82,-15
p=29,28 v=46,-44
p=10,73 v=49,81
p=55,43 v=-79,79
p=45,57 v=-25,19
p=56,79 v=15,-28
p=35,81 v=98,14
p=16,12 v=20,41
p=86,60 v=-91,68
p=62,32 v=-92,-57
p=70,1 v=7,89
p=78,76 v=-40,-10
p=33,62 v=88,56
p=35,70 v=-17,-77
p=13,65 v=-26,35
p=45,57 v=62,-23
p=46,100 v=26,-12
p=79,24 v=75,5
p=12,78 v=53,-58
p=88,88 v=57,-75
p=8,70 v=74,8
p=78,40 v=29,24
p=16,2 v=59,52
p=100,84 v=-13,97
p=15,68 v=6,32
p=18,55 v=92,-35
p=26,11 v=63,-26
p=4,12 v=76,77
p=58,46 v=-72,-84
p=47,63 v=-90,-4
p=57,51 v=-46,79
p=37,26 v=84,-43
p=36,4 v=52,-33
p=99,74 v=17,-4
p=51,77 v=91,58
p=44,72 v=69,-73
p=77,14 v=54,-68
p=39,45 v=34,-24
p=8,29 v=-49,-60
p=38,34 v=-85,-7
p=96,68 v=-63,1
p=19,74 v=85,-85
p=29,61 v=7,-14
p=16,45 v=-38,-42
p=21,12 v=45,59
p=84,21 v=39,11
p=58,35 v=58,85
p=69,30 v=54,90
p=38,101 v=-28,-81
p=78,11 v=-22,-2
p=4,13 v=30,30
p=11,93 v=85,-39
p=10,53 v=25,88
p=40,23 v=-29,95
p=92,5 v=11,-12
p=74,32 v=43,-24
p=88,69 v=90,-85
p=57,34 v=22,96
p=37,19 v=62,67
p=15,28 v=-38,18
p=92,52 v=-8,-23
p=17,97 v=-9,-69
p=83,26 v=-87,48
p=56,35 v=40,90
p=10,90 v=64,-22
p=97,48 v=-19,7
p=57,100 v=33,28
p=12,14 v=-13,-79
p=17,1 v=-80,-32
p=35,97 v=-85,91
p=89,38 v=-41,13
p=8,11 v=-85,66
p=73,91 v=61,-3
p=100,71 v=3,-37
p=52,84 v=-14,88
p=97,20 v=-37,-25
p=6,95 v=85,-81
p=82,56 v=66,-7
p=71,101 v=-83,10
p=27,56 v=5,-22
p=48,43 v=-43,2
p=72,86 v=55,-4
p=68,62 v=86,-72
p=82,53 v=-33,-85
p=65,66 v=-27,67
p=64,38 v=-65,86
p=100,35 v=13,-13
p=53,101 v=80,-8
p=58,35 v=33,-61
p=28,20 v=-31,84
p=43,65 v=22,27
p=86,100 v=-67,-42
p=95,75 v=6,-22
p=99,52 v=-30,-27
p=70,62 v=25,-29
p=92,75 v=-37,93
p=40,55 v=91,-16
p=57,46 v=1,50
p=55,93 v=40,40
p=77,63 v=43,87
p=39,1 v=-21,-1
p=38,27 v=55,35
p=48,102 v=-39,89
p=97,33 v=78,-79
p=82,36 v=-73,-35
p=56,84 v=74,-75
p=83,85 v=-22,99
p=91,64 v=34,-84
p=47,65 v=67,67
p=13,7 v=2,5
p=17,6 v=-63,-31
p=75,59 v=25,-35
p=11,34 v=-9,-55
p=39,43 v=82,-44
p=72,12 v=-79,47
p=38,4 v=-67,-33
p=75,48 v=76,-90
p=32,100 v=-82,73
p=39,9 v=-93,-47
p=83,27 v=57,-13
p=39,99 v=13,-29
p=97,88 v=-32,-60
p=43,90 v=-28,14
p=80,42 v=52,-67
p=33,45 v=-46,84
p=48,83 v=43,-60
p=59,30 v=-61,19
p=2,89 v=-77,27
p=81,57 v=83,2
p=78,29 v=-33,72
p=78,28 v=-51,-6
p=52,0 v=-32,-57
p=11,25 v=-27,-91
p=30,102 v=74,71
p=21,9 v=-45,83
p=58,32 v=-43,91
p=70,40 v=-22,-91
p=74,94 v=54,-93
p=12,38 v=20,42
p=9,5 v=-1,17
p=91,4 v=10,70
p=48,36 v=73,91
p=28,86 v=34,-10
p=64,74 v=80,-3
p=22,87 v=63,88
p=63,91 v=-39,94
p=29,91 v=14,-93
p=67,63 v=33,87
p=59,31 v=-76,-13
p=33,5 v=-16,19
p=84,94 v=21,-99
p=18,63 v=-91,60
p=32,95 v=-6,-33
p=94,13 v=-52,41
p=77,32 v=61,-18
p=20,65 v=-20,-90
p=43,89 v=8,3
p=35,42 v=56,-38
p=16,33 v=24,-54
p=43,96 v=30,88
p=40,21 v=59,62
p=59,37 v=40,-61
p=10,81 v=-2,-92
p=52,48 v=72,-24
p=71,70 v=-40,-89
p=42,99 v=-64,-93
p=68,4 v=-97,-33
p=52,42 v=79,-64
p=52,97 v=66,4
p=28,64 v=73,39
p=57,94 v=-25,45
p=47,5 v=40,-25
p=59,25 v=43,77
p=49,71 v=-54,62
p=92,2 v=79,-27
p=66,51 v=-7,-96
p=14,18 v=23,42
p=69,51 v=69,-11
p=75,80 v=-25,-34
p=90,5 v=-30,-39
p=7,44 v=60,-54
p=25,71 v=86,92
p=25,99 v=-38,-93
p=59,94 v=94,4
p=41,14 v=-17,65
p=48,86 v=-10,-64
p=78,86 v=-40,45
p=3,16 v=27,89
p=36,56 v=25,-42
p=38,65 v=30,38
p=76,101 v=77,79
p=56,82 v=-79,-40

103
day_14/output-step-7502.txt Normal file
View File

@ -0,0 +1,103 @@
..................................1.1................................................................
.....................................................................................................
...................................1..........................1......................................
...............1..............................................1..................................1...
.....1.......................1..............................1........................................
.....................................................................................................
.....................................................................................................
.....................................................................................................
.............1.........................1.............................................................
........................................................1............................................
.....................................................................................................
.....................................................................................................
......................................................................................1..............
........................................................1.1..........................................
....................................1................................................................
.....................................................................................................
....................................................................1................................
.................1...................................................................................
....................................1...............1111111111111111111111111111111..................
..................1..................1............1.1.............................1..................
.......1............................................1.............................1..11..............
....................................................1.............................1..................
.......1........................1...................1.............................1..................
....................................................1..............1..............1..............1...
.................1..................................1.............111.............1..................
........1...........................................1............11111............1...1..............
....................................................1...........1111111...........1..................
....................................................1..........111111111..........1...1..............
....................................................1............11111............1..................
....................................................1...........1111111...........1.......1..........
.....................1..............................1..........111111111..........1.................1
....................................................1.........11111111111.........1..................
......1.............................................1........1111111111111........1..................
............................................1.......1..........111111111..........1..................
....................................................1.........11111111111.........1..................
....................................................1........1111111111111........1..................
....................................................1.......111111111111111.......1..................
....................................................1......11111111111111111......1..................
....................................................1........1111111111111........1..................
....................................................1.......111111111111111.......1..................
....................................................1......11111111111111111......1..................
...........1..........................1.............1.....1111111111111111111.....1..................
.......1...1........................................1....111111111111111111111....1..................
....................................................1.............111.............1..................
.........1......................................1...1.............111.............1..................
...................................1................1.............111.............1..................
....................................................1.............................1.......1..........
......1...1.........................................1.............................1..................
.....................1..............................1.............................1..................
.............................1......................1.............................1..................
.................................1.........1........1111111111111111111111111111111..................
............1....................................1..........................................1....1...
.........1........1...........................................1......................1...............
...................................................1.1..............1................................
.....................................................................................................
....1..............................................1..........................1......................
....................................1..............................1.................................
..................1..................................................................................
....1...............................................1..............1.................1...............
..1.1....................................1................1..........................................
................1..............1...............................1.....................................
......1..........1..............1.......................................1............................
......................................................1..............................................
.................1............................................................1......................
.....................................................................................................
..................................................................................1...1..............
.....................................................................................................
....................1................................................................1...............
.....................................................................................................
.....................................................................................................
............1...........................................................................1............
.....................................................................................................
.......1...1.......................................................................1.................
........................................1.......................................................1....
...........1........1............1..................................................................1
................................................................................................1....
...............1...............................1.....................................................
..1......................................................1..................1.......................1
.........1...........................................................................................
1.....................1.........................................................................1....
...............................................................................1.....................
.....................................................................................................
........................................................1..........................1.................
.......................................1.............................................................
.....................................................................................................
1..................................1.................................................................
.......................................................1.............................................
.......................................1.....................1.......................................
..............1.1.....................................1......................................1.......
.....................................................................................................
.....................................................................................................
................................1....................................................................
......1..............................................................................................
.......................1....1........................................................................
..........................1...................................................1...........1..........
.......1...................................................1...................1.1...................
.......................1.............................................................................
..........1...........................................1..............................................
...................................................................1.................................
......................................1............................1.................................
..........................................1............1....................1........................
.....................................................................................................
...1.................................................................................................

91
day_14/solve_1.ts Normal file
View File

@ -0,0 +1,91 @@
export type Robot = {
pos: [number, number];
vel: [number, number];
};
export async function readData(path: string): Promise<Robot[]> {
const data = await Deno.readTextFile(path);
return data.split("\n").map((line) => {
line = line.trim();
const m = line.match(/p=([-\d]+),(\d+)\s+v=([-\d]+),([-\d]+)/);
if (!m) {
throw new Error(`Invalid line: ${line}`);
}
return {
pos: [parseInt(m[1]), parseInt(m[2])],
vel: [parseInt(m[3]), parseInt(m[4])],
};
});
}
export function moveRobot(robot: Robot, width: number, height: number) {
robot.pos[0] += robot.vel[0];
robot.pos[1] += robot.vel[1];
robot.pos[0] = (robot.pos[0] + width) % width;
robot.pos[1] = (robot.pos[1] + height) % height;
}
export function displayRobots(robots: Robot[], width: number, height: number) {
const grid = Array.from(
{ length: height },
() => Array.from({ length: width }, () => 0),
);
for (const robot of robots) {
const [x, y] = robot.pos;
grid[y][x]++;
}
return grid.map((line) =>
line.map((x) => x === 0 ? "." : x.toString()).join("")
).join("\n");
}
export function countRobotsInEachQuadrant(
robots: Robot[],
width: number,
height: number,
): [number, number, number, number] {
const quadrants = [0, 0, 0, 0];
const centerWidth = Math.floor(width / 2);
const centerHeight = Math.floor(height / 2);
for (const robot of robots) {
const x = robot.pos[0] < centerWidth ? 0 : 1;
const y = robot.pos[1] < centerHeight ? 0 : 1;
if (robot.pos[0] === centerWidth || robot.pos[1] === centerHeight) {
continue;
}
quadrants[x + y * 2]++;
}
return quadrants as [number, number, number, number];
}
export async function loadExample() {
const data = await readData("example.txt");
const width = 11;
const height = 7;
return { data, width, height };
}
export async function loadInput() {
const data = await readData("input.txt");
const width = 101;
const height = 103;
return { data, width, height };
}
if (import.meta.main) {
// const { data, width, height } = await loadExample();
const { data, width, height } = await loadInput();
console.log(displayRobots(data, width, height));
console.log();
for (let i = 0; i < 100; i++) {
for (const robot of data) {
moveRobot(robot, width, height);
}
}
console.log(displayRobots(data, width, height));
const [q1, q2, q3, q4] = countRobotsInEachQuadrant(data, width, height);
console.log("Quadrants:");
console.log(q1, q2, q3, q4);
console.log("Product:");
console.log(q1 * q2 * q3 * q4);
}

72
day_14/solve_2.ts Normal file
View File

@ -0,0 +1,72 @@
import { loadInput, displayRobots, moveRobot, Robot } from "./solve_1.ts";
function calcGrid(robots: Robot[], width: number, height: number) {
const grid = Array.from(
{ length: height },
() => Array.from({ length: width }, () => 0),
);
for (const robot of robots) {
const [x, y] = robot.pos;
grid[y][x]++;
}
return grid;
}
const pattern = [
" 1 ",
" 111 ",
"11111",
" 111 ",
" 1 ",
]
function findChristmasTree(grid: number[][]) {
const width = grid[0].length;
const height = grid.length;
for (let y = 0; y < height - 4; y++) {
for (let x = 0; x < width - 4; x++) {
let found = true;
for (let dy = 0; dy < 5; dy++) {
for (let dx = 0; dx < 5; dx++) {
if (pattern[dy][dx] === "1" && grid[y + dy][x + dx] === 0) {
found = false;
break;
}
}
}
if (found) {
return [x + 2, y + 2];
}
}
}
return null;
}
if (import.meta.main) {
// const { data, width, height } = await loadExample();
const { data, width, height } = await loadInput();
data.sort((a, b) => a.pos[0] - b.pos[0] || a.pos[1] - b.pos[1]);
console.log(displayRobots(data, width, height));
console.log();
for (let i = 0;; i++) {
for (const robot of data) {
moveRobot(robot, width, height);
}
// find chrismas tree
const grid = calcGrid(data, width, height);
const tree = findChristmasTree(grid);
if (tree) {
console.log(tree);
console.log(displayRobots(data, width, height));
console.log(i);
await Deno.writeTextFile(`output-step-${i+1}.txt`, displayRobots(data, width, height));
break;
}
if (i > 11000) {
break;
}
}
}

21
day_15/example_1.txt Normal file
View File

@ -0,0 +1,21 @@
##########
#..O..O.O#
#......O.#
#.OO..O.O#
#..O@..O.#
#O#..O...#
#O..O..O.#
#.OO.O.OO#
#....O...#
##########
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^

10
day_15/example_2.txt Normal file
View File

@ -0,0 +1,10 @@
########
#..O.O.#
##@.O..#
#...O..#
#.#.O..#
#...O..#
#......#
########
<^^>>>vv<v>>v<<

9
day_15/example_3.txt Normal file
View File

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

71
day_15/input.txt Normal file
View File

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

105
day_15/solve_1.ts Normal file
View File

@ -0,0 +1,105 @@
export type Map = string[][];
export type Move = "^" | "v" | "<" | ">";
export async function readData(path: string): Promise<{
map: Map,
moves: Move[]
}> {
const text = await Deno.readTextFile(path);
const [
map,
moves
] = text.split("\n\n");
return {
map: map.split("\n").map((line) => line.split("")),
moves: moves.split("\n").join("").split("").map((move) => move as Move)
};
}
export function displayMap(map: Map): string {
return map.map((line) => line.join("")).join("\n");
}
export function foreachMap(map: Map, callback: (value: string, x: number, y: number) => void): void {
map.forEach((line, y) => {
line.forEach((value, x) => {
callback(value, x, y);
});
});
}
export const dirToDelta = {
"^": [0, -1],
"v": [0, 1],
"<": [-1, 0],
">": [1, 0]
}
export function stepRobot(map: Map, robot: {x: number, y: number}, move: Move): void {
const {x, y} = robot;
const [dx, dy] = dirToDelta[move];
// Check if the robot can move
// like socoban, @ is the robot, # is a wall, . is a free space, O is a box
// multiple boxes can be pushed at the same time
let nextX = x;
let nextY = y;
while (true) {
nextX += dx;
nextY += dy;
const nextValue = map[nextY][nextX];
if (nextValue === "#") {
// The robot can't move
return;
}
else if (nextValue === ".") {
break;
}
if (nextValue === "O") {
continue;
}
}
let prevX = nextX;
let prevY = nextY;
// move the boxes
while (prevX !== x || prevY !== y) {
map[prevY][prevX] = map[prevY - dy][prevX - dx];
prevX -= dx;
prevY -= dy;
}
// move the robot
map[y][x] = ".";
robot.x = x + dx;
robot.y = y + dy;
}
if (import.meta.main) {
const {map, moves} = await readData("input.txt");
let robot = {
x: 0,
y: 0
}
foreachMap(map, (value, x, y) => {
if (value === "@") {
robot = {
x,
y
}
}
});
console.log("Robot", robot);
console.log(displayMap(map));
moves.forEach((move) => {
// console.log("Move", move, ":");
stepRobot(map, robot, move);
// console.log(displayMap(map));
});
let sum = 0;
foreachMap(map, (value, x, y) => {
if (value === "O") {
sum += x + y * 100;
}
});
console.log("Sum", sum);
}

187
day_15/solve_2.ts Normal file
View File

@ -0,0 +1,187 @@
import { displayMap, foreachMap, Map, Move, readData } from "./solve_1.ts";
const extendingTranslation = {
"#": "##",
".": "..",
"O": "[]",
"@": "@.",
};
function extendMap(map: Map) {
const extendedMap = map.map((row) => {
return row.map((value) => {
const v = extendingTranslation[
value as keyof typeof extendingTranslation
];
if (v) {
return v;
}
throw new Error("Invalid value");
}).join("").split("");
});
return extendedMap;
}
function getHugeBoxPos(map: Map, boxPos: [number, number]): [number, number] {
const [x, y] = boxPos;
const anyBracket = map[y][x];
if (anyBracket === "]") {
return [x - 1, y];
}
if (anyBracket === "[") {
return [x, y];
}
throw new Error("Not a huge box");
}
function IsMovableHugeBox(
map: Map,
boxPos: [number, number],
move: Move,
): boolean {
const [x, y] = getHugeBoxPos(map, boxPos);
if (move === "^" || move === "v") {
const dy = move === "^" ? -1 : 1;
if (map[y + dy][x] === "#" || map[y + dy][x + 1] === "#") {
return false;
}
if (map[y + dy][x] === "." && map[y + dy][x + 1] === ".") {
return true;
}
if (map[y + dy][x] === "]") {
const success = IsMovableHugeBox(map, [x, y + dy], move);
if (!success) {
return false;
}
} else if (map[y + dy][x] === "[") {
const success = IsMovableHugeBox(map, [x, y + dy], move);
if (!success) {
return false;
}
}
if (map[y + dy][x + 1] === "[") {
const success = IsMovableHugeBox(map, [x + 1, y + dy], move);
if (!success) {
return false;
}
}
return true;
} else {
const dx = move === "<" ? -1 : 2;
const [nx, ny] = [x + dx, y];
if (map[ny][nx] === "#") {
return false;
}
if (map[ny][nx] === ".") {
return true;
}
return IsMovableHugeBox(map, [nx, ny], move);
}
}
function pushHugeBox(map: Map, boxPos: [number, number], move: Move) {
const [x, y] = getHugeBoxPos(map, boxPos);
if (move === "^" || move === "v") {
const dy = move === "^" ? -1 : 1;
if (map[y + dy][x] === "]") {
pushHugeBox(map, [x, y + dy], move);
} else if (map[y + dy][x] === "[") {
pushHugeBox(map, [x, y + dy], move);
}
if (map[y + dy][x + 1] === "[") {
pushHugeBox(map, [x + 1, y + dy], move);
}
if (map[y + dy][x] === "." && map[y + dy][x + 1] === ".") {
map[y][x] = ".";
map[y][x + 1] = ".";
map[y + dy][x] = "[";
map[y + dy][x + 1] = "]";
return;
} else {
throw new Error("can't push the box");
}
} else {
if (map[y][x - 1] === "]" && move === "<") {
pushHugeBox(map, [x - 1, y], move);
}
if (map[y][x + 2] === "[" && move === ">") {
pushHugeBox(map, [x + 2, y], move);
}
const dx = move === "<" ? -1 : 1;
const nx = x + dx;
if (
(move === "<" && map[y][nx] === ".") ||
(move === ">" && map[y][nx + 1] === ".")
) {
map[y][x] = ".";
map[y][x + 1] = ".";
map[y][nx] = "[";
map[y][nx + 1] = "]";
return;
} else {
throw new Error("can't push the box");
}
}
}
function stepRobot(map: Map, robot: { x: number; y: number }, move: Move) {
const { x, y } = robot;
const dx = move === "<" ? -1 : move === ">" ? 1 : 0;
const dy = move === "^" ? -1 : move === "v" ? 1 : 0;
const nx = x + dx;
const ny = y + dy;
if (map[ny][nx] === "#") {
return;
}
if (map[ny][nx] === "[" || map[ny][nx] === "]") {
const [hx, hy] = getHugeBoxPos(map, [nx, ny]);
if (IsMovableHugeBox(map, [hx, hy], move)) {
pushHugeBox(map, [hx, hy], move);
} else {
return;
}
}
map[y][x] = ".";
map[ny][nx] = "@";
robot.x = nx;
robot.y = ny;
}
if (import.meta.main) {
let { map, moves } = await readData("input.txt");
console.log(displayMap(map));
map = extendMap(map);
let robot = {
x: 0,
y: 0,
};
foreachMap(map, (value, x, y) => {
if (value === "@") {
robot = {
x,
y,
};
}
});
console.log("Robot", robot);
console.log(displayMap(map));
moves.forEach((move) => {
// console.log("Move", move, ":");
try {
stepRobot(map, robot, move);
} catch (_e) {
console.log("Move", move, ":");
console.log(displayMap(map));
}
// console.log(displayMap(map));
});
let sum = 0;
foreachMap(map, (value, x, y) => {
if (value === "[") {
sum += x + y * 100;
}
});
console.log(displayMap(map));
console.log("Sum", sum);
}