add day 18
This commit is contained in:
Generated
+25
@@ -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",
|
||||||
|
]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "day18"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
itertools = "*"
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user