add 31 (WIP)
This commit is contained in:
@@ -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]
|
||||||
@@ -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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user