summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormhsn <mail@mhsn.net>2025-08-20 14:51:44 +0100
committermhsn <mail@mhsn.net>2025-08-20 14:51:44 +0100
commit239398fe0b908da785a4100db9f1a44f99aed740 (patch)
tree97d0c19527ac46972424c72364775b091e21af08
parent0351a8b8adfeb6c08d9428d1d7536ba5639ffbd1 (diff)
downloadaoc-239398fe0b908da785a4100db9f1a44f99aed740.tar.gz
aoc-239398fe0b908da785a4100db9f1a44f99aed740.zip
2024-09 rust p1
-rw-r--r--2024/09/rust/Cargo.lock7
-rw-r--r--2024/09/rust/Cargo.toml6
-rw-r--r--2024/09/rust/src/main.rs51
3 files changed, 64 insertions, 0 deletions
diff --git a/2024/09/rust/Cargo.lock b/2024/09/rust/Cargo.lock
new file mode 100644
index 0000000..1a4e400
--- /dev/null
+++ b/2024/09/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-09"
+version = "0.1.0"
diff --git a/2024/09/rust/Cargo.toml b/2024/09/rust/Cargo.toml
new file mode 100644
index 0000000..b440a8b
--- /dev/null
+++ b/2024/09/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "aoc_2024-09"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
diff --git a/2024/09/rust/src/main.rs b/2024/09/rust/src/main.rs
new file mode 100644
index 0000000..1fb892f
--- /dev/null
+++ b/2024/09/rust/src/main.rs
@@ -0,0 +1,51 @@
+#![feature(iter_array_chunks)]
+
+use std::io;
+
+fn main() -> io::Result<()> {
+ let disk_map = io::stdin()
+ .lines()
+ .flatten()
+ .next()
+ .unwrap()
+ .chars()
+ .map(|c| c as u8 - b'0')
+ .collect();
+
+ let silver: usize = silver(&disk_map);
+ let gold: u64 = 0;
+ println!("silver: {silver}");
+ println!("gold: {gold}");
+
+ return Ok(());
+}
+
+fn silver(input: &Vec<u8>) -> usize {
+ let mut blocks = input
+ .iter()
+ .chain([0, 0].iter()) // lol
+ .array_chunks()
+ .enumerate()
+ .map(|(n, [&f, &s])| [[Some(n)].repeat(f as usize), [None].repeat(s as usize)])
+ .flatten()
+ .flatten()
+ .collect::<Vec<_>>();
+
+ let mut l = 0;
+ let mut r = blocks.len() - 1;
+ loop {
+ while blocks[r].is_none() {
+ r -= 1;
+ }
+ while blocks[l].is_some() {
+ l += 1;
+ }
+ if l >= r {
+ break;
+ }
+ let [left, right] = blocks.get_disjoint_mut([l, r]).unwrap();
+ left.replace(right.take().unwrap());
+ }
+
+ blocks.iter().enumerate().map(|(n, id)| n * id.unwrap_or_default()).sum()
+}