diff --git a/src/euler31/Cargo.toml b/src/euler31/Cargo.toml new file mode 100644 index 0000000..b83af93 --- /dev/null +++ b/src/euler31/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "euler31" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/src/euler31/src/main.rs b/src/euler31/src/main.rs new file mode 100644 index 0000000..c8d17ce --- /dev/null +++ b/src/euler31/src/main.rs @@ -0,0 +1,94 @@ +#![allow(dead_code)] +use std::ops::Index; + +const VALUE: u8 = 200; + +type Values = Vec; + +fn main() { + // let head = Tree::new(200); +} + +#[derive(Debug, PartialEq)] +struct Node { + values: Values, + nodes: Vec, +} + +impl Node { + fn new(value: u8) -> Self { + Self { + values: vec![value], + nodes: vec![], + } + } + + fn new_vec(values: Values) -> Self { + Self { + values, + nodes: vec![], + } + } + + fn iter(&mut self) { + if !self.nodes.is_empty() { + self.nodes.iter_mut().for_each(|n| n.iter()) + } else { + let mut previous: Option = None; + for (i, value) in self.values.iter().enumerate() { + let j = i * 2; + let half = value / 2; + let mut new_vec; + if let Some(inner) = previous { + new_vec = inner.clone(); + } else { + new_vec = self.values.clone(); + }; + + new_vec[j] = half; + new_vec.insert(j, half); + previous = Some(new_vec.clone()); + debug_assert_eq!(new_vec.iter().sum::(), VALUE); + self.nodes.push(Node::new_vec(new_vec)); + } + } + } +} + +impl Index for Node { + type Output = Node; + + fn index(&self, index: usize) -> &Self::Output { + &self.nodes[index] + } +} + +#[cfg(test)] +mod test { + // use crate::Node; + use crate::Node; + + #[test] + fn test_new() { + let tree = Node::new(200); + assert_eq!(tree.values, [200]); + assert_eq!(tree.nodes.len(), 0); + } + + #[test] + fn test_iter() { + let mut tree = Node::new(200); + tree.iter(); + assert_eq!(tree.nodes.len(), 1); + assert_eq!(tree.nodes[0].values, vec![100, 100]); + } + + #[test] + fn test_iter_2() { + let mut tree = Node::new(200); + tree.iter(); + tree.iter(); + assert_eq!(tree.nodes[0][0].values, vec![50, 50, 100]); + assert_eq!(tree.nodes[0][1].values, vec![50; 4]); + } +}