summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2025-04-28 20:03:12 +0100
committermhsn <mail@mhsn.net>2025-04-28 20:03:12 +0100
commitd5e3b22792c87706ff98a6e5713746c2a957cef3 (patch)
tree589437c2b0abee304688a3c6dfc23f06bf573ccd
parent277af786610b02c47c2be1346261d92da2eabd82 (diff)
downloadaoc-d5e3b22792c87706ff98a6e5713746c2a957cef3.tar.gz
aoc-d5e3b22792c87706ff98a6e5713746c2a957cef3.zip
2024-02 rust p1
-rw-r--r--2024/02/rust/Cargo.lock7
-rw-r--r--2024/02/rust/Cargo.toml6
-rw-r--r--2024/02/rust/src/main.rs46
3 files changed, 59 insertions, 0 deletions
diff --git a/2024/02/rust/Cargo.lock b/2024/02/rust/Cargo.lock
new file mode 100644
index 0000000..f3a3299
--- /dev/null
+++ b/2024/02/rust/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "aoc_2024-02"
+version = "0.1.0"
diff --git a/2024/02/rust/Cargo.toml b/2024/02/rust/Cargo.toml
new file mode 100644
index 0000000..6030837
--- /dev/null
+++ b/2024/02/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc_2024-02"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/2024/02/rust/src/main.rs b/2024/02/rust/src/main.rs
new file mode 100644
index 0000000..620fe8b
--- /dev/null
+++ b/2024/02/rust/src/main.rs
@@ -0,0 +1,46 @@
+use std::io;
+
+fn main() {
+ let input: Vec<Vec<i64>> = io::stdin()
+ .lines()
+ .map(|line| {
+ line.unwrap()
+ .split_whitespace()
+ .map(str::parse::<i64>)
+ .collect()
+ })
+ .collect::<Result<Vec<_>, _>>()
+ .unwrap();
+
+ let silver: usize = input.iter().map(self::safe).flatten().count();
+ let gold: u64 = 0;
+ println!("silver: {silver}");
+ println!("gold: {gold}");
+}
+
+#[derive(Debug, PartialEq)]
+enum Dir {
+ Asc,
+ Desc,
+}
+
+fn safe(xs: &Vec<i64>) -> Option<Dir> {
+ let mut dirs = xs
+ .iter()
+ .zip(xs.iter().skip(1))
+ .map(|(x, y)| y - x)
+ .map(|d| match d {
+ -3..=-1 => Some(Dir::Desc),
+ 1..=3 => Some(Dir::Asc),
+ _ => None,
+ })
+ .collect::<Option<Vec<Dir>>>()?
+ .into_iter();
+
+ let head = dirs.next().unwrap_or(Dir::Asc);
+ if dirs.all(|d| d == head) {
+ Some(head)
+ } else {
+ None
+ }
+}