From 937b2adab362ad05a0c94710f55d822d2ba90ea8 Mon Sep 17 00:00:00 2001 From: minimav <6566948+minimav@users.noreply.github.com> Date: Thu, 1 Dec 2022 08:44:48 +0000 Subject: [PATCH] Puzzle 1 2022 --- 2022/Cargo.lock | 262 +++++++++++++++++++++++++++++++++ 2022/Cargo.toml | 14 ++ 2022/README.md | 5 + 2022/create_puzzle.py | 80 ++++++++++ 2022/examples/puzzle_1/main.rs | 73 +++++++++ 2022/src/main.rs | 1 + 6 files changed, 435 insertions(+) create mode 100644 2022/Cargo.lock create mode 100644 2022/Cargo.toml create mode 100644 2022/README.md create mode 100644 2022/create_puzzle.py create mode 100644 2022/examples/puzzle_1/main.rs create mode 100644 2022/src/main.rs diff --git a/2022/Cargo.lock b/2022/Cargo.lock new file mode 100644 index 0000000..5e4465c --- /dev/null +++ b/2022/Cargo.lock @@ -0,0 +1,262 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "advent_of_code_2022" +version = "0.1.0" +dependencies = [ + "itertools", + "regex", + "rstest", +] + +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "futures" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" + +[[package]] +name = "futures-executor" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" + +[[package]] +name = "futures-macro" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" + +[[package]] +name = "futures-task" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + +[[package]] +name = "futures-util" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "itertools" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf247779e67a9082a4790b45e71ac7cfd1321331a5c856a74a9faebdab78d0" +dependencies = [ + "either", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd7356a8122b6c4a24a82b278680c73357984ca2fc79a0f9fa6dea7dced7c58" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "rstest" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c9dc66cc29792b663ffb5269be669f1613664e69ad56441fdb895c2347b930" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5015e68a0685a95ade3eee617ff7101ab6a3fc689203101ca16ebc16f2b89c66" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "syn" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e90cde112c4b9690b8cbe810cba9ddd8bc1d7472e2cae317b69e9438c1cba7d2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" diff --git a/2022/Cargo.toml b/2022/Cargo.toml new file mode 100644 index 0000000..50705e2 --- /dev/null +++ b/2022/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "advent_of_code_2022" +version = "0.1.0" +edition = "2021" + +[dependencies] +itertools = "0.10.2" +regex = "1.6.0" + +[dev-dependencies] +rstest = "0.15.0" + +[[example]] +name = "puzzle_1" diff --git a/2022/README.md b/2022/README.md new file mode 100644 index 0000000..667b436 --- /dev/null +++ b/2022/README.md @@ -0,0 +1,5 @@ +## Advent of code 2022 + +Using Rust. + +Use `cargo run --example puzzle_` to run specific puzzle solutions. Each puzzle needs to be added to `cargo.toml` for this to work. \ No newline at end of file diff --git a/2022/create_puzzle.py b/2022/create_puzzle.py new file mode 100644 index 0000000..ceebc40 --- /dev/null +++ b/2022/create_puzzle.py @@ -0,0 +1,80 @@ +import sys + +from pathlib import Path + + +MAIN_TEMPLATE = """use std::time::Instant; + +fn part_1(contents: &str) -> u64 { + 0 +} + +fn part_2(contents: &str) -> u64 { + 0 +} + +#[cfg(test)] +mod tests { + use super::*; + use rstest::*; + + #[test] + fn test_part_1_example() { + assert_eq!(part_1(include_str!("./example.txt")), 1); + } + + #[test] + fn test_part_2_example() { + assert_eq!(part_2(include_str!("./example.txt")), 1); + } + +} + +fn main() { + let start = Instant::now(); + let contents = include_str!("./input.txt"); + let part_1_answer = part_1(contents); + println!("Answer for part 1 is: {}", part_1_answer); + let part_2_answer = part_2(contents); + println!("Answer for part 2 is: {}", part_2_answer); + let duration = start.elapsed(); + println!("Took {:?} to solve this puzzle", duration); +} +""" + +CARGO_TEMPLATE = """ +[[example]] +name = "puzzle_{puzzle_number}" +""" + +if __name__ == "__main__": + try: + puzzle_number = int(sys.argv[1]) + except IndexError: + try: + max_puzzle_number = max( + int(str(p).split("_")[-1]) for p in Path("examples").iterdir() + ) + except ValueError: + max_puzzle_number = 0 + puzzle_number = max_puzzle_number + 1 + print( + f"No puzzle number supplied, using {puzzle_number} based " + "on existing folders" + ) + + puzzle_folder = Path(f"examples/puzzle_{puzzle_number}/") + + if puzzle_folder.exists(): + raise ValueError(f"Path {puzzle_folder} already exists!") + + puzzle_folder.mkdir(parents=True, exist_ok=True) + + files = {"input.txt": "", "example.txt": "", "main.rs": MAIN_TEMPLATE} + for file_name, content in files.items(): + file_path = puzzle_folder / file_name + with file_path.open("w", encoding="utf-8") as f: + f.write(content) + + with open("Cargo.toml", "a") as f: + f.write(CARGO_TEMPLATE.format(puzzle_number=puzzle_number)) diff --git a/2022/examples/puzzle_1/main.rs b/2022/examples/puzzle_1/main.rs new file mode 100644 index 0000000..c4338d2 --- /dev/null +++ b/2022/examples/puzzle_1/main.rs @@ -0,0 +1,73 @@ +use std::fs; +use std::time::Instant; + +fn part_1(contents: &str) -> u32 { + let mut max_elf: u32 = 0; + let mut current_elf: u32 = 0; + for line in contents.lines() { + if line.is_empty() { + if current_elf > max_elf { + max_elf = current_elf + } + current_elf = 0 + } else { + current_elf += line.parse::().unwrap(); + } + } + if current_elf > max_elf { + max_elf = current_elf + } + max_elf +} + +fn part_2(contents: &str) -> u32 { + let mut max_elves: Vec = Vec::new(); + let mut current_elf: u32 = 0; + for line in contents.lines() { + if line.is_empty() { + if max_elves.len() < 3 { + max_elves.push(current_elf); + max_elves.sort(); + } else if max_elves.iter().any(|x| ¤t_elf > x) { + max_elves.drain(0..1); + max_elves.push(current_elf); + max_elves.sort(); + } + current_elf = 0 + } else { + current_elf += line.parse::().unwrap(); + } + } + if max_elves.iter().any(|x| ¤t_elf > x) { + max_elves.drain(0..1); + max_elves.push(current_elf); + } + max_elves.iter().sum() +} + +#[cfg(test)] +mod tests { + use super::*; + use rstest::*; + + #[test] + fn test_part_1_example() { + assert_eq!(part_1(include_str!("./example.txt")), 24000); + } + + #[test] + fn test_part_2_example() { + assert_eq!(part_2(include_str!("./example.txt")), 45000); + } +} + +fn main() { + let start = Instant::now(); + let contents = include_str!("./input.txt"); + let part_1_answer = part_1(contents); + println!("Answer for part 1 is: {}", part_1_answer); + let part_2_answer = part_2(contents); + println!("Answer for part 2 is: {}", part_2_answer); + let duration = start.elapsed(); + println!("Took {:?} to solve this puzzle", duration); +} diff --git a/2022/src/main.rs b/2022/src/main.rs new file mode 100644 index 0000000..f328e4d --- /dev/null +++ b/2022/src/main.rs @@ -0,0 +1 @@ +fn main() {}