From 492b61bd044225a6c87701d7dc8d51b8b4f0b010 Mon Sep 17 00:00:00 2001 From: Nikkuss Date: Wed, 3 Dec 2025 19:19:09 +0400 Subject: [PATCH] restructure and optimize (fuck you @Doloro1978) --- Cargo.lock | 578 +++++++++++++++++++ Cargo.toml | 15 +- inputs/{day1.txt => day01.txt} | 0 inputs/{day1example.txt => day01example.txt} | 0 inputs/{day2.txt => day02.txt} | 0 inputs/day02dolo.txt | 1 + inputs/{day2example.txt => day02example.txt} | 0 src/bin/day01.rs | 12 + src/bin/day02.rs | 12 + src/bin/day02/main.rs | 82 --- src/{bin/day01/main.rs => day01.rs} | 66 ++- src/day02.rs | 108 ++++ src/lib.rs | 7 +- 13 files changed, 776 insertions(+), 105 deletions(-) rename inputs/{day1.txt => day01.txt} (100%) rename inputs/{day1example.txt => day01example.txt} (100%) rename inputs/{day2.txt => day02.txt} (100%) create mode 100644 inputs/day02dolo.txt rename inputs/{day2example.txt => day02example.txt} (100%) create mode 100644 src/bin/day01.rs create mode 100644 src/bin/day02.rs delete mode 100644 src/bin/day02/main.rs rename src/{bin/day01/main.rs => day01.rs} (51%) create mode 100644 src/day02.rs diff --git a/Cargo.lock b/Cargo.lock index 16a33c9..fc3ec08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,13 +17,51 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloca" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7d05ea6aea7e9e64d25b9156ba2fee3fdd659e34e41063cd2fc7cd020d7f4" +dependencies = [ + "cc", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + [[package]] name = "aoc_2025" version = "0.1.0" dependencies = [ "color-eyre", + "criterion", + "criterion-macro", ] +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "backtrace" version = "0.3.76" @@ -39,12 +77,86 @@ dependencies = [ "windows-link", ] +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.2.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" + [[package]] name = "color-eyre" version = "0.6.5" @@ -72,6 +184,88 @@ dependencies = [ "tracing-error", ] +[[package]] +name = "criterion" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0dfe5e9e71bdcf4e4954f7d14da74d1cdb92a3a07686452d1509652684b1aab" +dependencies = [ + "alloca", + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools", + "num-traits", + "oorandom", + "page_size", + "plotters", + "rayon", + "regex", + "serde", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-macro" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "288a8f36b28a19d7dbd572c76006c0a0eba1f3bf912a254dda211c6f665e7ffc" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "criterion-plot" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de36c2bee19fba779808f92bf5d9b0fa5a40095c277aba10c458a12b35d21d6" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + [[package]] name = "eyre" version = "0.6.12" @@ -82,18 +276,60 @@ dependencies = [ "once_cell", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + [[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + [[package]] name = "indenter" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -121,6 +357,15 @@ dependencies = [ "adler2", ] +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.37.3" @@ -136,24 +381,199 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + [[package]] name = "owo-colors" version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +[[package]] +name = "page_size" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "pin-project-lite" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + [[package]] name = "rustc-demangle" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -163,6 +583,23 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "thread_local" version = "1.1.9" @@ -172,6 +609,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "tracing" version = "0.1.43" @@ -213,14 +660,145 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + [[package]] name = "valuable" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 9eaa6e4..597c537 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,20 @@ name = "aoc_2025" version = "0.1.0" edition = "2024" -[[bin]] -name = "day01" -path = "src/bin/day01/main.rs" - [profile.dev] codegen-backend = "cranelift" opt-level = 0 +[profile.release] +codegen-backend = "llvm" +codegen-units = 1 +lto = true +panic = "abort" +strip = "symbols" + [dependencies] color-eyre = "0.6.5" + +[dev-dependencies] +criterion = "0.8.0" +criterion-macro = "0.4.0" diff --git a/inputs/day1.txt b/inputs/day01.txt similarity index 100% rename from inputs/day1.txt rename to inputs/day01.txt diff --git a/inputs/day1example.txt b/inputs/day01example.txt similarity index 100% rename from inputs/day1example.txt rename to inputs/day01example.txt diff --git a/inputs/day2.txt b/inputs/day02.txt similarity index 100% rename from inputs/day2.txt rename to inputs/day02.txt diff --git a/inputs/day02dolo.txt b/inputs/day02dolo.txt new file mode 100644 index 0000000..3dee06f --- /dev/null +++ b/inputs/day02dolo.txt @@ -0,0 +1 @@ +9226466333-9226692707,55432-96230,4151-6365,686836-836582,519296-634281,355894-471980,971626-1037744,25107-44804,15139904-15163735,155452-255998,2093-4136,829776608-829880425,4444385616-4444502989,2208288-2231858,261-399,66-119,91876508-91956018,2828255673-2828317078,312330-341840,6464-10967,5489467-5621638,1-18,426-834,3434321102-3434378477,4865070-4972019,54475091-54592515,147-257,48664376-48836792,45-61,1183-1877,24-43 diff --git a/inputs/day2example.txt b/inputs/day02example.txt similarity index 100% rename from inputs/day2example.txt rename to inputs/day02example.txt diff --git a/src/bin/day01.rs b/src/bin/day01.rs new file mode 100644 index 0000000..e36f0d0 --- /dev/null +++ b/src/bin/day01.rs @@ -0,0 +1,12 @@ +use aoc_2025::day01; +use color_eyre::Report; + +fn main() -> Result<(), Report> { + color_eyre::install()?; + let data = day01::data("inputs/day01.txt")?; + let code1 = day01::part1(&data)?; + let code2 = day01::part2(&data)?; + println!("code1: {code1}"); + println!("code2: {code2}"); + Ok(()) +} diff --git a/src/bin/day02.rs b/src/bin/day02.rs new file mode 100644 index 0000000..bdad978 --- /dev/null +++ b/src/bin/day02.rs @@ -0,0 +1,12 @@ +use aoc_2025::day02; +use color_eyre::Report; + +fn main() -> Result<(), Report> { + color_eyre::install()?; + let data = day02::data("inputs/day02.txt")?; + let code1 = day02::part1(&data)?; + let code2 = day02::part2(&data)?; + println!("code1: {code1}"); + println!("code2: {code2}"); + Ok(()) +} diff --git a/src/bin/day02/main.rs b/src/bin/day02/main.rs deleted file mode 100644 index ad10574..0000000 --- a/src/bin/day02/main.rs +++ /dev/null @@ -1,82 +0,0 @@ -use color_eyre::{Report, eyre::ContextCompat}; -use std::{fs::File, io::Read}; - -#[derive(Debug)] -struct IdRange { - start: u64, - end: u64, -} - -impl TryFrom<&str> for IdRange { - type Error = Report; - - fn try_from(value: &str) -> Result { - let mut split = value.split("-"); - let start: u64 = split.next().context("Invalid start ID")?.parse()?; - let end: u64 = split.next().context("Invalid end ID")?.parse()?; - Ok(Self { start, end }) - } -} - -impl IdRange { - fn get_invalid(&self) -> Result, Report> { - Ok((self.start..self.end + 1) - .filter(|v| { - let str = v.to_string(); - let len = str.len(); - if (len % 2) != 0 { - return false; - } - str[0..len / 2] == str[len / 2..len] - }) - .collect()) - } - fn get_invalid2(&self) -> Result, Report> { - Ok((self.start..self.end + 1) - .filter(|v| { - let str = v.to_string(); - let len = str.len(); - (1..len + 1) - .filter(|v| (len % v) == 0) - .filter(|v| (len / v) != 1) - .filter(|v| { - let strchunk = str.chars().collect::>(); - let strchunk = strchunk.chunks(*v).collect::>(); - !strchunk.iter().any(|v| strchunk.iter().any(|x| v != x)) - }) - .sum::() - > 0 - }) - .collect()) - } -} - -fn main() -> Result<(), Report> { - color_eyre::install()?; - // let filepath = "testinput2.txt"; - let filepath = "inputs/day2.txt"; - let mut file = File::open(filepath)?; - let mut string = String::new(); - let _ = file.read_to_string(&mut string); - let ranges = string - .trim_end() - .split(",") - .map(IdRange::try_from) - .collect::, Report>>()?; - - let code1 = ranges - .iter() - .map(|v| v.get_invalid().map(|v| v.into_iter().sum::())) - .collect::, Report>>()? - .into_iter() - .sum::(); - println!("code1: {code1}"); - let code2 = ranges - .iter() - .map(|v| v.get_invalid2().map(|v| v.into_iter().sum::())) - .collect::, Report>>()? - .into_iter() - .sum::(); - println!("code1: {code2}"); - Ok(()) -} diff --git a/src/bin/day01/main.rs b/src/day01.rs similarity index 51% rename from src/bin/day01/main.rs rename to src/day01.rs index a70f091..65ff9a1 100644 --- a/src/bin/day01/main.rs +++ b/src/day01.rs @@ -1,6 +1,6 @@ use std::{ fs::File, - io::{BufRead, BufReader}, + io::{self, BufRead, BufReader, Lines, Read}, }; use color_eyre::{ @@ -34,36 +34,66 @@ impl TryFrom<&str> for DialDir { } } -fn main() -> Result<(), Report> { - color_eyre::install()?; - // let filepath = "testinput.txt"; - let filepath = "inputs/day1.txt"; - let file = File::open(filepath)?; - let bufreader = BufReader::new(file); - let mut lines = bufreader.lines(); - +pub fn part1(lines: &[String]) -> Result { let mut total_value = 50; let mut code = 0; - let mut code2 = 0; - while let Some(Ok(line)) = lines.next() { + for line in lines { + let dialcode = DialDir::try_from(line.as_str())?; + total_value += std::convert::Into::::into(dialcode.clone()); + total_value = total_value.rem_euclid(100); + if total_value == 0 { + code += 1; + } + } + Ok(code) +} + +pub fn part2(lines: &[String]) -> Result { + let mut total_value = 50; + let mut code = 0; + for line in lines { let prev = total_value; let dialcode = DialDir::try_from(line.as_str())?; total_value += std::convert::Into::::into(dialcode.clone()); let big_jump = total_value.div_euclid(100); total_value = total_value.rem_euclid(100); if big_jump < 0 && prev == 0 { - code2 -= 1; + code -= 1; } if big_jump > 0 && total_value == 0 { - code2 -= 1; + code -= 1; } - code2 += big_jump.abs(); + code += big_jump.abs(); if total_value == 0 { code += 1; } - println!("{dialcode:?} {prev}->{total_value} {code} {code2}"); } - - println!("code is {} {}!", code, code + code2); - Ok(()) + Ok(code) +} + +pub fn data(filepath: &str) -> Result, Report> { + let file = File::open(filepath)?; + let bufreader = BufReader::new(file); + let lines = bufreader + .lines() + .collect::, io::Error>>()?; + Ok(lines) +} + +#[cfg(test)] +mod tests { + use super::*; + use criterion::Criterion; + use criterion_macro::criterion; + + #[criterion] + fn bench_part1(b: &mut Criterion) { + let data = data("inputs/day01.txt").unwrap(); + b.bench_function("day01-part1", |b| b.iter(|| part1(&data).unwrap())); + } + #[criterion] + fn bench_part2(b: &mut Criterion) { + let data = data("inputs/day01.txt").unwrap(); + b.bench_function("day01-part2", |b| b.iter(|| part2(&data).unwrap())); + } } diff --git a/src/day02.rs b/src/day02.rs new file mode 100644 index 0000000..0ad1555 --- /dev/null +++ b/src/day02.rs @@ -0,0 +1,108 @@ +use color_eyre::{Report, eyre::ContextCompat}; +use std::{ + fs::File, + io::Read, + ops::{Div, Rem}, +}; + +#[derive(Debug)] +pub struct IdRange { + start: u64, + end: u64, +} + +impl TryFrom<&str> for IdRange { + type Error = Report; + + fn try_from(value: &str) -> Result { + let mut split = value.split("-"); + let start: u64 = split.next().context("Invalid start ID")?.parse()?; + let end: u64 = split.next().context("Invalid end ID")?.parse()?; + Ok(Self { start, end }) + } +} + +impl IdRange { + fn get_invalid(&self) -> Result, Report> { + Ok((self.start..=self.end) + .filter(|v| { + let len = v.checked_ilog10().unwrap_or(0) + 1; + if !len.is_multiple_of(2) { + return false; + } + let d = 10_u64.pow(len / 2); + let first = v.div(d); + let second = v.rem(d); + first == second + }) + .collect()) + } + + fn get_invalid2(&self) -> Result, Report> { + Ok((self.start..=self.end) + .filter(|v| { + let len = (v.checked_ilog10().unwrap_or(0) + 1) as usize; + let mut digits = vec![0; len]; + let mut temp = *v; + for i in 1..=len { + digits[len - i] = temp % 10; + temp /= 10; + } + (1..=len) + .filter(|v| len.is_multiple_of(*v) && (len / v) != 1) + .any(|c| { + let mut chunks = digits.chunks(c); + chunks + .next() + .is_some_and(|first| chunks.all(|chunk| chunk == first)) + }) + }) + .collect()) + } +} + +pub fn part1(data: &[IdRange]) -> Result { + Ok(data + .iter() + .map(|v| v.get_invalid().map(|v| v.into_iter().sum::())) + .collect::, Report>>()? + .into_iter() + .sum::()) +} + +pub fn part2(data: &[IdRange]) -> Result { + Ok(data + .iter() + .map(|v| v.get_invalid2().map(|v| v.into_iter().sum::())) + .collect::, Report>>()? + .into_iter() + .sum::()) +} +pub fn data(filepath: &str) -> Result, Report> { + let mut file = File::open(filepath)?; + let mut string = String::new(); + let _ = file.read_to_string(&mut string); + string + .trim_end() + .split(",") + .map(IdRange::try_from) + .collect::, Report>>() +} + +#[cfg(test)] +mod tests { + use super::*; + use criterion::Criterion; + use criterion_macro::criterion; + + #[criterion] + fn bench_part1(b: &mut Criterion) { + let data = data("inputs/day02.txt").unwrap(); + b.bench_function("day02-part1", |b| b.iter(|| part1(&data).unwrap())); + } + #[criterion] + fn bench_part2(b: &mut Criterion) { + let data = data("inputs/day01.txt").unwrap(); + b.bench_function("day02-part2", |b| b.iter(|| part2(&data).unwrap())); + } +} diff --git a/src/lib.rs b/src/lib.rs index 8b13789..551c92c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,6 @@ - +#![feature(custom_test_frameworks)] +#![test_runner(criterion::runner)] +#![feature(test)] +extern crate test; +pub mod day01; +pub mod day02;