diff --git a/2022/Cargo.lock b/2022/Cargo.lock index ed5d433..8973e1c 100644 --- a/2022/Cargo.lock +++ b/2022/Cargo.lock @@ -40,6 +40,10 @@ version = "0.1.0" name = "aoc-2022-08" version = "0.1.0" +[[package]] +name = "aoc-2022-09" +version = "0.1.0" + [[package]] name = "either" version = "1.8.0" diff --git a/2022/Cargo.toml b/2022/Cargo.toml index 9f9ce28..25cf03c 100644 --- a/2022/Cargo.toml +++ b/2022/Cargo.toml @@ -8,6 +8,7 @@ members = [ "./day-06", "./day-07", "./day-08", + "./day-09", ] diff --git a/2022/README.md b/2022/README.md index a5aca2d..6fcea80 100644 --- a/2022/README.md +++ b/2022/README.md @@ -12,7 +12,7 @@ | 06 | ✓ | ✓ | [Rust] | | 07 | ✓ | ✓ | [Rust] | | 08 | ✓ | ✓ | [Rust] | -| 09 | | | | +| 09 | ✓ | | [Rust] | | 10 | | | | | 11 | | | | | 12 | | | | diff --git a/2022/day-09/Cargo.toml b/2022/day-09/Cargo.toml new file mode 100644 index 0000000..17c3056 --- /dev/null +++ b/2022/day-09/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "aoc-2022-09" +version = "0.1.0" +edition = "2021" + + +[lib] +test = false +doctest = false + + +[dependencies] diff --git a/2022/day-09/Justfile b/2022/day-09/Justfile new file mode 100644 index 0000000..7d08527 --- /dev/null +++ b/2022/day-09/Justfile @@ -0,0 +1,5 @@ +@part PART INPUT_FILE="inputs/puzzle.txt": + cargo --quiet run --bin part_{{PART}} -- {{INPUT_FILE}} + +clean: + cargo clean diff --git a/2022/day-09/inputs/puzzle.txt b/2022/day-09/inputs/puzzle.txt new file mode 100644 index 0000000..64edb2f --- /dev/null +++ b/2022/day-09/inputs/puzzle.txt @@ -0,0 +1,2000 @@ +R 2 +D 2 +R 2 +U 1 +R 2 +L 2 +D 1 +L 1 +D 2 +R 2 +U 2 +D 1 +R 2 +D 2 +U 1 +R 1 +D 1 +L 1 +U 1 +R 1 +L 1 +R 2 +U 2 +D 2 +R 2 +L 2 +U 1 +L 2 +U 2 +L 2 +R 2 +U 2 +R 1 +U 2 +L 2 +D 1 +R 1 +U 2 +D 2 +R 2 +L 2 +U 1 +D 1 +L 2 +U 2 +L 2 +U 1 +D 2 +R 1 +D 1 +R 2 +U 1 +L 2 +D 1 +U 2 +R 2 +L 1 +D 2 +U 1 +D 1 +L 1 +U 1 +R 1 +D 1 +R 1 +U 1 +D 2 +L 1 +D 1 +R 2 +D 1 +U 2 +D 2 +U 2 +L 1 +U 2 +R 2 +L 2 +D 2 +R 1 +L 2 +U 2 +L 1 +U 1 +L 1 +R 2 +L 2 +R 1 +D 1 +U 1 +L 2 +R 1 +L 1 +U 1 +D 1 +U 1 +D 1 +R 1 +L 2 +R 2 +L 1 +U 1 +D 2 +U 2 +L 2 +R 2 +U 1 +R 2 +L 2 +R 2 +L 1 +U 3 +D 1 +L 1 +D 3 +U 1 +D 2 +L 1 +R 3 +D 2 +U 3 +R 1 +D 3 +R 2 +D 1 +U 3 +L 1 +R 2 +L 3 +D 3 +U 2 +L 2 +R 3 +U 3 +D 3 +L 3 +D 2 +L 3 +R 1 +L 1 +D 1 +U 3 +D 3 +U 2 +L 3 +R 3 +U 1 +D 2 +R 2 +L 2 +D 3 +R 3 +U 1 +R 1 +L 3 +U 2 +L 2 +U 1 +R 1 +D 1 +R 3 +U 2 +D 1 +L 1 +U 1 +R 2 +L 1 +R 3 +L 1 +U 3 +L 2 +D 2 +L 2 +D 3 +L 2 +R 1 +U 2 +L 3 +D 1 +L 3 +D 1 +U 2 +L 3 +R 2 +U 1 +L 3 +D 3 +R 3 +U 2 +R 2 +D 3 +R 3 +U 2 +R 2 +L 2 +U 3 +R 1 +L 2 +D 3 +U 1 +L 1 +U 1 +L 2 +R 3 +L 3 +D 3 +R 3 +U 3 +L 1 +R 2 +D 3 +U 1 +R 2 +U 1 +D 1 +L 1 +D 2 +L 2 +D 3 +U 2 +D 1 +U 3 +D 3 +U 3 +R 3 +L 3 +U 4 +L 3 +D 1 +R 4 +U 3 +D 2 +R 1 +D 4 +L 3 +U 1 +L 1 +R 2 +D 1 +R 3 +D 3 +L 3 +D 4 +L 3 +R 4 +U 3 +R 3 +D 1 +R 3 +D 3 +R 3 +D 4 +U 4 +R 2 +D 3 +R 3 +D 2 +U 1 +R 2 +D 2 +U 2 +D 3 +L 2 +R 4 +D 4 +U 4 +R 3 +U 4 +R 1 +U 2 +R 4 +D 2 +L 4 +R 4 +U 3 +L 2 +U 2 +L 3 +R 3 +L 1 +U 4 +L 3 +U 3 +L 3 +U 1 +R 2 +U 3 +R 2 +L 3 +U 1 +D 3 +R 4 +D 1 +R 2 +L 1 +D 1 +U 2 +D 3 +R 4 +U 1 +L 3 +R 4 +U 4 +L 4 +R 2 +D 1 +U 4 +R 1 +D 3 +L 3 +D 1 +R 3 +D 2 +U 2 +L 1 +U 2 +D 3 +L 1 +U 3 +D 3 +L 3 +U 2 +L 3 +U 2 +R 1 +D 1 +R 1 +L 1 +D 2 +R 3 +D 2 +L 2 +R 3 +D 5 +R 5 +U 4 +D 5 +U 5 +D 4 +R 4 +D 2 +R 5 +L 4 +R 2 +L 2 +R 5 +U 5 +R 1 +D 2 +R 1 +L 3 +D 5 +U 3 +D 4 +R 3 +U 4 +D 1 +U 4 +L 5 +R 1 +U 4 +L 5 +U 3 +D 4 +L 2 +D 4 +U 4 +L 2 +D 1 +R 3 +D 1 +R 2 +D 4 +R 5 +L 1 +U 4 +L 4 +U 3 +L 1 +U 1 +R 4 +U 3 +L 1 +R 3 +D 5 +U 2 +R 4 +D 3 +L 2 +D 4 +R 5 +D 2 +U 3 +R 4 +D 4 +L 2 +U 4 +R 5 +L 1 +U 5 +D 1 +R 3 +L 4 +D 1 +U 3 +D 5 +R 2 +D 2 +L 5 +U 2 +D 3 +L 5 +D 5 +L 1 +R 5 +D 2 +U 3 +R 2 +L 2 +U 1 +L 5 +R 1 +L 4 +D 5 +R 5 +D 2 +U 5 +L 5 +D 1 +L 1 +D 3 +R 1 +D 2 +L 2 +R 4 +U 5 +L 2 +R 1 +U 3 +D 1 +U 1 +D 5 +R 2 +D 2 +R 3 +D 6 +U 1 +R 6 +D 4 +U 1 +R 5 +L 6 +R 2 +L 6 +U 6 +R 5 +D 2 +U 1 +D 2 +L 2 +D 5 +R 3 +U 4 +D 2 +L 1 +U 1 +D 3 +U 1 +D 1 +R 5 +U 1 +R 1 +D 3 +U 5 +L 6 +R 3 +L 6 +U 4 +D 2 +R 1 +L 6 +R 2 +D 3 +U 2 +R 2 +L 1 +D 1 +U 1 +R 4 +U 1 +R 2 +U 2 +L 2 +U 2 +D 5 +L 4 +U 6 +L 3 +D 6 +U 5 +L 6 +U 3 +R 5 +U 2 +R 4 +L 6 +D 1 +R 5 +D 4 +L 2 +R 2 +U 1 +D 2 +L 2 +U 4 +R 1 +D 2 +U 2 +R 6 +L 2 +D 5 +R 5 +L 3 +D 1 +U 1 +L 2 +D 4 +R 6 +L 5 +R 3 +U 1 +R 3 +L 1 +R 3 +U 1 +L 1 +U 4 +D 4 +U 3 +R 3 +U 1 +R 2 +D 1 +L 6 +U 2 +R 2 +D 1 +R 5 +L 2 +D 5 +L 3 +R 6 +D 2 +L 2 +D 3 +L 5 +D 7 +L 7 +D 4 +U 5 +R 7 +L 7 +D 3 +U 5 +R 6 +U 3 +L 6 +R 5 +L 4 +D 4 +R 4 +L 6 +D 6 +U 3 +D 3 +R 7 +U 1 +L 5 +U 3 +L 4 +U 3 +L 5 +D 1 +R 7 +U 3 +L 6 +D 1 +U 3 +L 2 +U 6 +L 6 +D 1 +U 1 +D 2 +L 5 +U 4 +R 5 +D 7 +U 3 +D 4 +L 1 +D 3 +R 7 +D 2 +U 4 +L 1 +D 3 +R 3 +D 6 +R 4 +U 3 +D 4 +R 6 +L 7 +U 5 +L 7 +R 3 +L 7 +D 5 +R 7 +D 4 +U 3 +R 6 +U 7 +D 2 +R 2 +L 2 +D 1 +R 3 +U 3 +D 5 +U 3 +L 3 +D 6 +L 6 +R 1 +L 5 +D 6 +U 4 +R 2 +L 2 +D 1 +U 7 +L 5 +D 3 +U 1 +L 1 +R 1 +L 6 +R 1 +D 6 +U 4 +L 7 +U 6 +R 6 +L 2 +D 5 +R 1 +D 6 +L 1 +R 3 +D 1 +U 5 +L 1 +D 3 +U 7 +D 5 +U 7 +D 7 +U 4 +R 3 +U 4 +L 8 +U 1 +R 1 +D 2 +U 5 +D 2 +L 5 +D 6 +U 4 +R 5 +L 5 +U 7 +L 3 +D 1 +L 2 +R 8 +L 1 +U 8 +L 2 +D 3 +R 6 +L 8 +D 2 +L 1 +U 4 +D 1 +R 2 +D 7 +U 5 +D 4 +U 4 +L 2 +D 6 +U 1 +D 5 +U 2 +D 2 +L 8 +D 6 +L 2 +U 1 +R 7 +D 1 +U 5 +L 6 +D 3 +L 2 +D 8 +R 6 +L 5 +U 2 +L 6 +U 4 +D 6 +L 7 +U 8 +L 5 +D 8 +R 8 +D 6 +L 3 +U 6 +L 1 +D 8 +R 7 +L 7 +R 2 +D 6 +R 1 +U 5 +L 5 +R 5 +L 3 +U 8 +L 1 +U 2 +D 5 +R 8 +U 5 +L 5 +D 2 +R 5 +U 1 +D 8 +R 3 +U 1 +R 6 +D 6 +R 5 +D 6 +L 8 +U 8 +L 8 +U 8 +L 8 +R 8 +U 8 +R 5 +L 1 +D 3 +U 1 +D 6 +U 1 +L 8 +U 3 +R 5 +L 2 +R 1 +D 2 +L 2 +U 4 +D 1 +R 1 +D 2 +R 2 +U 4 +R 3 +U 8 +D 9 +L 9 +D 5 +L 4 +D 7 +L 9 +U 4 +L 9 +D 7 +U 4 +L 3 +U 2 +R 5 +U 3 +L 1 +R 5 +L 8 +U 4 +R 6 +L 8 +U 1 +R 7 +D 6 +R 6 +U 7 +L 9 +R 7 +U 8 +R 5 +U 6 +L 4 +D 4 +L 3 +R 8 +U 6 +L 7 +R 4 +D 7 +R 3 +L 3 +D 2 +L 2 +U 5 +R 8 +L 7 +R 9 +D 8 +U 1 +L 1 +D 4 +U 6 +R 4 +L 2 +R 9 +L 9 +R 2 +D 3 +L 4 +U 6 +R 3 +D 5 +L 4 +R 8 +U 3 +R 5 +L 3 +D 7 +R 1 +D 2 +U 5 +L 7 +D 6 +R 1 +D 9 +L 9 +R 8 +U 8 +L 8 +D 7 +U 3 +L 2 +U 4 +D 8 +U 6 +R 3 +U 5 +R 7 +D 1 +R 8 +L 9 +U 7 +D 9 +L 2 +R 7 +U 1 +R 6 +D 3 +L 5 +U 10 +L 8 +R 3 +L 4 +D 9 +U 4 +L 5 +U 5 +D 10 +R 8 +U 6 +L 3 +U 4 +D 6 +L 8 +D 2 +R 8 +L 9 +U 3 +R 5 +D 1 +R 9 +D 6 +L 5 +R 10 +L 8 +R 9 +L 6 +U 8 +L 8 +U 5 +R 3 +U 6 +D 3 +L 10 +D 9 +U 5 +L 3 +U 6 +R 2 +D 7 +R 9 +L 5 +D 3 +U 3 +R 2 +D 10 +U 3 +R 2 +U 6 +L 10 +R 3 +U 3 +R 4 +L 8 +R 1 +L 6 +U 9 +L 7 +D 7 +R 6 +U 3 +R 1 +L 6 +D 5 +L 3 +U 2 +L 5 +R 9 +D 5 +R 4 +L 2 +U 5 +D 7 +L 10 +D 9 +U 7 +D 9 +R 5 +D 3 +L 1 +R 10 +L 4 +U 6 +R 7 +L 2 +R 6 +L 3 +R 3 +D 2 +L 1 +R 2 +L 7 +D 8 +R 5 +L 7 +D 8 +U 5 +L 8 +U 4 +R 8 +U 1 +D 1 +U 4 +D 6 +R 8 +U 10 +D 5 +U 5 +L 1 +D 2 +R 10 +U 10 +R 2 +L 9 +R 2 +D 3 +L 6 +R 10 +D 10 +R 9 +D 7 +U 3 +R 4 +D 9 +R 4 +D 9 +U 9 +L 8 +D 7 +R 7 +U 7 +R 7 +D 9 +L 7 +U 5 +L 10 +R 8 +L 11 +D 9 +L 5 +R 11 +L 6 +R 1 +U 2 +D 9 +L 3 +R 6 +L 6 +R 2 +L 6 +D 6 +R 2 +D 5 +L 8 +R 9 +U 6 +D 6 +L 1 +R 3 +D 2 +R 5 +D 6 +L 1 +D 10 +U 2 +R 4 +U 6 +R 11 +D 1 +R 2 +L 4 +D 9 +L 4 +U 8 +D 10 +U 4 +R 10 +D 1 +U 11 +R 2 +L 11 +D 7 +U 1 +L 7 +U 10 +D 10 +L 11 +R 1 +U 8 +R 1 +L 11 +R 3 +D 10 +R 10 +L 9 +U 7 +R 9 +L 6 +R 7 +U 5 +R 6 +U 4 +L 11 +U 7 +R 7 +L 4 +U 4 +R 2 +D 3 +R 2 +L 9 +D 4 +L 11 +R 6 +D 2 +L 9 +R 7 +D 6 +U 5 +L 8 +D 9 +R 11 +U 11 +R 6 +D 11 +L 9 +R 4 +L 6 +U 10 +R 11 +U 5 +L 6 +R 12 +D 3 +R 4 +U 12 +R 6 +D 8 +R 1 +D 2 +L 11 +R 6 +D 5 +U 10 +D 5 +R 8 +L 6 +D 5 +U 5 +R 8 +L 1 +D 10 +R 5 +U 6 +L 8 +R 4 +L 10 +D 6 +R 3 +D 9 +L 4 +R 9 +U 5 +R 2 +U 11 +R 9 +U 8 +R 7 +L 2 +D 7 +U 7 +D 8 +U 12 +R 6 +D 12 +R 5 +D 10 +U 2 +D 8 +U 6 +R 3 +U 5 +R 5 +L 11 +D 10 +R 3 +U 11 +D 8 +R 7 +L 3 +U 9 +R 4 +L 2 +D 4 +R 8 +D 9 +R 2 +D 3 +U 6 +L 5 +D 4 +L 2 +R 9 +U 5 +D 1 +U 9 +R 9 +U 11 +L 12 +R 10 +D 5 +U 1 +R 9 +U 4 +D 8 +R 1 +D 5 +R 7 +U 11 +L 6 +U 1 +R 12 +D 1 +R 7 +U 12 +D 9 +R 12 +L 1 +U 3 +D 6 +R 11 +L 6 +U 8 +D 11 +R 7 +U 5 +D 4 +U 1 +L 11 +D 1 +U 5 +R 13 +L 9 +U 4 +D 4 +R 10 +U 4 +D 7 +L 4 +D 10 +R 6 +D 5 +R 9 +L 10 +D 2 +U 11 +D 8 +U 1 +R 8 +U 5 +R 8 +D 10 +L 10 +D 7 +R 5 +U 6 +D 7 +U 9 +R 8 +D 4 +R 2 +D 1 +L 1 +U 2 +R 10 +D 2 +U 13 +L 9 +U 13 +L 12 +U 12 +D 6 +L 1 +R 4 +L 7 +R 4 +L 2 +U 8 +R 7 +D 10 +U 2 +L 8 +D 5 +R 9 +D 9 +R 2 +L 3 +U 2 +D 11 +U 5 +D 12 +R 3 +U 10 +D 2 +R 1 +D 13 +U 7 +L 7 +R 1 +U 1 +R 1 +U 6 +D 12 +R 7 +L 7 +R 9 +U 10 +R 13 +D 3 +R 12 +U 1 +L 6 +R 9 +U 10 +L 1 +U 13 +R 2 +D 8 +U 12 +D 10 +L 7 +U 6 +D 9 +L 11 +D 8 +U 4 +R 1 +D 11 +L 8 +U 1 +D 4 +R 7 +U 7 +R 5 +L 1 +R 14 +L 8 +D 10 +R 13 +U 13 +R 9 +L 13 +U 2 +D 7 +R 11 +D 2 +L 9 +D 11 +L 2 +U 12 +D 11 +R 12 +D 3 +R 6 +L 11 +R 7 +D 3 +U 6 +D 9 +L 10 +R 13 +D 7 +U 14 +L 10 +R 11 +D 12 +R 12 +U 13 +R 4 +L 14 +U 5 +L 4 +U 10 +L 3 +U 13 +R 9 +D 7 +U 8 +R 5 +L 14 +U 5 +R 6 +D 13 +L 13 +U 9 +R 13 +D 1 +L 8 +R 9 +U 8 +L 7 +U 4 +D 4 +R 4 +L 5 +U 11 +R 14 +L 2 +U 1 +D 14 +R 13 +D 3 +L 13 +D 2 +U 9 +D 14 +U 1 +R 1 +D 12 +L 6 +R 4 +U 4 +L 11 +U 14 +D 13 +R 12 +L 7 +U 13 +R 4 +U 14 +L 14 +R 11 +L 8 +D 3 +U 4 +R 1 +U 5 +D 12 +L 5 +U 14 +D 6 +R 6 +U 4 +L 1 +D 11 +U 9 +R 5 +U 13 +D 7 +L 5 +D 3 +L 8 +U 7 +D 4 +L 13 +R 1 +D 11 +L 7 +U 6 +D 9 +R 10 +D 6 +R 9 +L 2 +D 6 +U 12 +L 10 +D 3 +U 6 +L 4 +R 4 +U 12 +D 13 +R 9 +L 1 +R 5 +U 14 +R 14 +D 7 +U 10 +R 3 +L 4 +U 6 +L 13 +U 14 +R 10 +L 7 +D 12 +U 5 +L 11 +D 7 +U 9 +D 4 +L 1 +R 11 +D 9 +L 5 +D 15 +R 4 +U 12 +L 1 +U 8 +L 15 +D 15 +L 3 +R 11 +L 9 +R 1 +U 12 +D 9 +R 7 +D 6 +U 2 +L 12 +U 13 +R 11 +L 15 +D 4 +L 8 +U 6 +L 7 +R 2 +U 7 +D 2 +U 13 +D 10 +L 13 +U 1 +D 6 +L 11 +R 14 +L 5 +U 2 +R 11 +D 10 +L 4 +R 14 +U 13 +D 9 +U 2 +D 4 +R 14 +L 4 +R 4 +L 4 +U 6 +D 11 +L 10 +U 9 +L 3 +U 12 +L 8 +U 9 +D 4 +U 4 +L 10 +U 1 +D 8 +U 15 +D 3 +U 12 +R 3 +D 8 +U 1 +R 10 +L 1 +U 5 +D 1 +L 1 +R 3 +U 1 +R 8 +U 10 +R 1 +U 11 +R 15 +D 16 +U 13 +D 7 +U 7 +D 14 +R 9 +L 13 +R 12 +U 2 +R 11 +L 11 +R 3 +D 11 +U 11 +R 2 +D 3 +U 6 +L 14 +R 6 +L 6 +U 3 +R 3 +D 1 +U 5 +L 3 +R 4 +D 9 +U 15 +R 2 +U 5 +D 5 +R 14 +U 6 +R 1 +D 4 +U 2 +D 3 +R 8 +L 4 +D 2 +U 12 +D 2 +U 7 +L 14 +U 1 +R 10 +L 4 +D 12 +L 9 +D 16 +U 2 +R 7 +D 16 +U 9 +D 13 +U 7 +L 14 +D 5 +R 12 +U 13 +R 13 +U 2 +L 11 +D 9 +U 2 +R 8 +U 5 +R 7 +U 9 +L 11 +D 16 +U 10 +R 5 +D 7 +L 6 +D 8 +U 4 +R 3 +D 5 +L 5 +U 11 +R 4 +D 12 +R 12 +L 10 +R 15 +U 9 +D 12 +L 11 +U 6 +D 11 +U 12 +L 6 +R 3 +U 12 +D 5 +L 1 +R 12 +U 14 +L 1 +D 2 +L 4 +D 7 +L 12 +U 10 +L 12 +U 4 +D 14 +R 13 +U 9 +L 2 +U 6 +L 1 +U 9 +D 16 +L 2 +R 16 +D 5 +L 7 +U 13 +L 15 +R 1 +D 8 +R 15 +D 5 +R 12 +L 5 +R 11 +U 17 +D 13 +U 13 +L 4 +D 8 +L 1 +D 7 +R 11 +U 7 +R 11 +L 9 +D 3 +L 2 +U 4 +D 16 +L 10 +U 11 +R 5 +U 4 +R 6 +L 11 +R 17 +U 13 +R 12 +D 11 +L 17 +U 15 +D 4 +R 9 +U 9 +L 10 +D 5 +R 14 +U 10 +R 5 +U 15 +L 12 +D 14 +R 14 +L 11 +R 5 +U 7 +D 1 +R 4 +D 14 +U 3 +R 6 +D 5 +R 1 +D 12 +L 14 +D 6 +L 15 +U 16 +D 10 +R 12 +D 9 +U 1 +D 1 +L 4 +D 6 +U 16 +R 11 +L 11 +R 3 +L 2 +U 12 +R 9 +D 16 +R 12 +L 14 +U 6 +L 7 +D 5 +U 4 +R 13 +L 8 +D 16 +U 5 +D 5 +U 6 +R 14 +L 6 +D 7 +U 3 +L 15 +R 14 +L 17 +R 17 +U 16 +L 4 +R 3 +U 1 +D 15 +L 12 +D 11 +L 18 +D 18 +U 10 +D 4 +U 1 +R 11 +U 18 +D 12 +R 11 +U 13 +D 14 +R 17 +D 18 +U 13 +R 8 +U 4 +R 9 +D 18 +L 6 +R 7 +L 14 +U 10 +L 10 +U 16 +D 15 +L 15 +D 3 +L 2 +D 7 +R 3 +D 7 +U 11 +L 6 +R 8 +L 3 +U 3 +R 8 +D 8 +U 10 +L 15 +D 1 +U 16 +R 1 +L 13 +R 7 +U 10 +L 12 +R 8 +D 3 +L 14 +D 12 +R 12 +D 3 +L 2 +D 15 +R 3 +L 14 +D 4 +R 5 +L 13 +D 9 +U 2 +L 5 +R 13 +D 4 +L 14 +R 14 +D 16 +R 1 +U 11 +R 6 +L 7 +U 16 +L 15 +D 6 +U 7 +R 16 +D 2 +L 15 +D 18 +U 3 +D 1 +R 7 +D 1 +L 4 +D 16 +U 12 +L 12 +R 7 +U 5 +L 5 +U 13 +R 13 +U 7 +L 9 +R 9 +U 8 +D 6 +L 3 +U 4 +R 12 +L 12 +D 16 +U 12 +L 4 +R 11 +U 9 +D 13 +R 15 +L 3 +D 17 +R 6 +D 13 +R 6 +D 5 +L 19 +U 10 +D 3 +L 2 +U 13 +R 2 +D 3 +L 3 +U 3 +R 1 +U 12 +L 2 +D 19 +L 17 +R 10 +D 11 +U 8 +R 10 +L 15 +R 4 +D 9 +U 4 +D 11 +U 4 +D 3 +L 5 +D 15 +U 1 +L 19 +D 16 +R 11 +U 12 +D 16 +L 4 +R 13 +U 2 +L 19 +U 9 +R 5 +D 7 +R 19 +L 9 +U 2 +D 2 +R 3 +U 10 +L 13 +D 16 +L 2 +D 5 +L 8 +R 9 +L 18 +R 9 +U 13 +D 7 +R 14 +U 8 +R 18 +L 18 +U 8 +L 13 +R 9 +U 5 +L 16 +U 4 +D 4 +R 10 +U 13 +R 2 +L 6 +R 18 +D 3 +L 11 +R 12 +L 2 +R 12 +D 7 +U 12 +R 13 +U 14 +D 1 +R 8 +L 13 +U 5 +L 9 +U 19 +D 14 +L 4 +U 8 +D 8 +U 1 +D 16 +U 4 +D 8 +U 20 \ No newline at end of file diff --git a/2022/day-09/inputs/test.txt b/2022/day-09/inputs/test.txt new file mode 100644 index 0000000..cbea2b3 --- /dev/null +++ b/2022/day-09/inputs/test.txt @@ -0,0 +1,8 @@ +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 \ No newline at end of file diff --git a/2022/day-09/src/bin/part_one.rs b/2022/day-09/src/bin/part_one.rs new file mode 100644 index 0000000..ddf8738 --- /dev/null +++ b/2022/day-09/src/bin/part_one.rs @@ -0,0 +1,95 @@ +use std::{env, io}; + +use aoc_2022_09::{parse_input, Instruction, Position, VisitedMap}; + +fn main() -> io::Result<()> { + let infile_path = env::args().nth(1).expect("input file"); + + let result = solve(&infile_path)?; + + println!("{result}"); + + Ok(()) +} + +fn solve(path: &str) -> io::Result { + let instructions = parse_input(path)?; + + let mut head_pos = Position(0, 0); + let mut tail_pos = Position(0, 0); + let mut tail_visited = VisitedMap::new(); + + tail_visited.insert(tail_pos.clone(), 1); + + for instruction in instructions { + (head_pos, tail_pos) = + apply_instruction(&instruction, &head_pos, &tail_pos, &mut tail_visited); + } + + Ok(tail_visited.len()) +} + +fn apply_instruction( + instruction: &Instruction, + head_pos: &Position, + tail_pos: &Position, + tail_visited: &mut VisitedMap, +) -> (Position, Position) { + let mut tmp_head_pos = head_pos.clone(); + let mut tmp_tail_pos = tail_pos.clone(); + + let (change, amount) = match *instruction { + Instruction::Up(dist) => (Position(1, 0), dist), + Instruction::Right(dist) => (Position(0, 1), dist), + Instruction::Left(dist) => (Position(0, -1), dist), + Instruction::Down(dist) => (Position(-1, 0), dist), + }; + + for _ in 1..=amount { + tmp_head_pos += change.clone(); + + let dx = tmp_head_pos.0 - tmp_tail_pos.0; + let dxa = dx.abs(); + let dy = tmp_head_pos.1 - tmp_tail_pos.1; + let dya = dy.abs(); + let same_row = tmp_head_pos.0 == tmp_tail_pos.0; + let same_col = tmp_head_pos.1 == tmp_tail_pos.1; + let mut head_changed = false; + + if (!same_row && !same_col) && (dxa > 1 || dya > 1) { + let x = if dx.is_negative() { -1 } else { 1 }; + let y = if dy.is_negative() { -1 } else { 1 }; + tmp_tail_pos += Position(x, y); + head_changed = true; + } else if dxa > 1 || dya > 1 { + tmp_tail_pos += change.clone(); + head_changed = true; + } + + if head_changed { + tail_visited + .entry(tmp_tail_pos.clone()) + .and_modify(|v| *v += 1) + .or_insert(1); + } + } + + (tmp_head_pos, tmp_tail_pos) +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn sample() { + let result = solve("inputs/test.txt").unwrap(); + assert_eq!(13, result); + } + + #[test] + fn puzzle() { + let result = solve("inputs/puzzle.txt").unwrap(); + assert_eq!(6026, result); + } +} diff --git a/2022/day-09/src/lib.rs b/2022/day-09/src/lib.rs new file mode 100644 index 0000000..b541abd --- /dev/null +++ b/2022/day-09/src/lib.rs @@ -0,0 +1,73 @@ +use std::{ + collections::HashMap, + fs::File, + io::{self, BufRead, BufReader}, + ops::{Add, AddAssign}, + path::Path, + str::FromStr, +}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct Position(pub isize, pub isize); + +impl Add for Position { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0, self.1 + rhs.0) + } +} + +impl AddAssign for Position { + fn add_assign(&mut self, rhs: Self) { + self.0 += rhs.0; + self.1 += rhs.1; + } +} + +pub type VisitedMap = HashMap; + +#[derive(Debug)] +pub enum Instruction { + Up(isize), + Right(isize), + Left(isize), + Down(isize), +} + +impl FromStr for Instruction { + type Err = String; + + fn from_str(val: &str) -> Result { + let parts = val.split_whitespace().collect::>(); + let [direction, distance, ..] = parts[..] else { + return Err("Invalid instruction".to_string()); + }; + let distance = distance + .parse() + .map_err(|_| "Invalid distance value".to_string())?; + + let result = match direction { + "U" => Self::Up(distance), + "R" => Self::Right(distance), + "L" => Self::Left(distance), + "D" => Self::Down(distance), + _ => return Err("Invalid direction value".to_string()), + }; + + Ok(result) + } +} + +pub fn parse_input

(path: P) -> io::Result> +where + P: AsRef, +{ + let file = File::open(path)?; + let instructions = BufReader::new(file) + .lines() + .map(|line| line.unwrap().parse().unwrap()) + .collect(); + + Ok(instructions) +} diff --git a/README.md b/README.md index 96a2b1d..7508f61 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ - [2019](2019/README.md) (0% completed) - [2020](2020/README.md) (20% completed) - [2021](2021/README.md) (68% completed) -- [2022](2022/README.md) (32% completed) +- [2022](2022/README.md) (34% completed)