add 31 (WIP)

This commit is contained in:
Dr. Matthias Ratajczak
2022-08-17 17:24:41 +02:00
parent 68c2bcb2a2
commit 74d2beef7d
2 changed files with 102 additions and 0 deletions
+8
View File
@@ -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]
+94
View File
@@ -0,0 +1,94 @@
#![allow(dead_code)]
use std::ops::Index;
const VALUE: u8 = 200;
type Values = Vec<u8>;
fn main() {
// let head = Tree::new(200);
}
#[derive(Debug, PartialEq)]
struct Node {
values: Values,
nodes: Vec<Node>,
}
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<Values> = 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::<u8>(), VALUE);
self.nodes.push(Node::new_vec(new_vec));
}
}
}
}
impl Index<usize> 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]);
}
}