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