This commit is contained in:
Rakarake 2025-11-30 20:23:18 +01:00
parent 49f2a7d820
commit 21adfae838
4 changed files with 61 additions and 1 deletions

4
Cargo.lock generated
View file

@ -19,3 +19,7 @@ dependencies = [
[[package]] [[package]]
name = "gendays" name = "gendays"
version = "0.1.0" version = "0.1.0"
[[package]]
name = "utils"
version = "0.1.0"

View file

@ -1,5 +1,5 @@
[workspace] [workspace]
members = [ "gendays", "aoc2024", "aoc2025" ] members = [ "gendays", "aoc2024", "aoc2025" , "utils"]
resolver = "3" resolver = "3"
[workspace.dependencies] [workspace.dependencies]

7
utils/Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
name = "utils"
version = "0.1.0"
edition = "2024"
[lib]
path = "lib.rs"

49
utils/lib.rs Normal file
View file

@ -0,0 +1,49 @@
pub trait Matrix {
fn transpose(self) -> Self;
fn reverse_rows(self) -> Self;
fn rotate_counter_clockwise(self) -> Self;
}
impl<T: Clone> Matrix for Vec<Vec<T>> {
// Yes, very inefficient
// Easy peasy when
fn transpose(self) -> Self {
let mut o: Vec<Vec<Option<T>>> = vec![vec![None; self.len()]; self.first().unwrap().len()];
self.into_iter().enumerate().for_each(|(y, l)| {
l.into_iter().enumerate().for_each(|(x, e)| {
o[x][y] = Some(e);
})
});
o.into_iter()
.map(|r| r.into_iter().map(|e| e.unwrap()).collect())
.collect()
}
fn reverse_rows(self) -> Self {
let mut o = self.clone();
o.reverse();
o
}
fn rotate_counter_clockwise(self) -> Self {
self.transpose().reverse_rows()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transpose() {
let x = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
let result = vec![vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]];
assert_eq!(x.transpose(), result);
}
#[test]
fn test_rotate_counter_clockwise() {
let x = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
let result = vec![vec![3, 6, 9], vec![2, 5, 8], vec![1, 4, 7]];
assert_eq!(x.rotate_counter_clockwise(), result);
}
}