diff --git a/day18/Cargo.lock b/day18/Cargo.lock new file mode 100644 index 0000000..ba972cc --- /dev/null +++ b/day18/Cargo.lock @@ -0,0 +1,25 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "day18" +version = "0.1.0" +dependencies = [ + "itertools", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] diff --git a/day18/Cargo.toml b/day18/Cargo.toml new file mode 100644 index 0000000..3326d06 --- /dev/null +++ b/day18/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day18" +version = "0.1.0" +edition = "2024" + +[dependencies] +itertools = "*" diff --git a/day18/src/main.rs b/day18/src/main.rs new file mode 100644 index 0000000..dc9b38c --- /dev/null +++ b/day18/src/main.rs @@ -0,0 +1,42 @@ +use itertools::Itertools; + +#[cfg(debug_assertions)] +const START: &str = ".^^.^.^^^^"; + +#[cfg(not(debug_assertions))] +const START: &str = "^.^^^.^..^....^^....^^^^.^^.^...^^.^.^^.^^.^^..^.^...^.^..^.^^.^..^.....^^^.^.^^^..^^...^^^...^...^."; + +fn main() { + let mut row = START.to_string(); + + let mut counter = 0; + + for _ in 0..400_000 { + counter += row.chars().filter(|c| *c == '.').count(); + let next_row = generate_next_row(row); + row = next_row; + } + println!("{counter}"); +} + +fn generate_next_row(row: String) -> String { + ['.'] + .into_iter() + .chain(row.chars()) + .chain(['.']) + .map(|c| c == '^') + .tuple_windows() + .map(|(a, b, c)| is_trap(&[a, b, c])) + .map(|b| if b { '^' } else { '.' }) + .collect() +} + +#[allow(clippy::nonminimal_bool)] +fn is_trap(are_traps: &[bool; 3]) -> bool { + let &[left, center, right] = are_traps; + + (left && center && !right) + || (!left && center && right) + || (left && !center && !right) + || (!left && !center && right) +}