From 764b9dc314852bb1c0eb9d14920839d5a5829d61 Mon Sep 17 00:00:00 2001 From: rzuckerm Date: Sat, 7 Mar 2026 07:41:34 -0600 Subject: [PATCH] Add Zeckendorf in Rust --- archive/r/rust/zeckendorf.rs | 69 ++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 archive/r/rust/zeckendorf.rs diff --git a/archive/r/rust/zeckendorf.rs b/archive/r/rust/zeckendorf.rs new file mode 100644 index 000000000..1c2f061c3 --- /dev/null +++ b/archive/r/rust/zeckendorf.rs @@ -0,0 +1,69 @@ +use std::cmp::PartialOrd; +use std::env::args; +use std::ops::{Add, SubAssign}; +use std::process::exit; +use std::str::FromStr; + +fn usage() -> ! { + println!("Usage: please input a non-negative integer"); + exit(0); +} + +fn parse_int(s: &str) -> Result::Err> { + s.trim().parse::() +} + +fn get_fibonacci_values(value: T) -> Vec +where + T: Add + PartialOrd + From + Copy +{ + let mut fibs = vec![]; + let mut a: T = T::from(1); + let mut b: T = T::from(2); + while a <= value { + fibs.push(a); + (a, b) = (b, a + b); + } + + fibs +} + +fn get_zeckendorf_values(value: T) -> Vec +where + T: Add + SubAssign + PartialOrd + From + Copy +{ + let fibs = get_fibonacci_values(value); + let mut zecks = vec![]; + let mut n = (fibs.len() as i32) - 1; + let mut remaining = value; + while n >= 0 && remaining > T::from(0) { + let f = fibs[n as usize]; + if remaining >= f { + zecks.push(f); + remaining -= f; + n -= 2; + } else { + n -= 1; + } + } + + zecks +} + +fn main() { + let mut args = args().skip(1); + + // Exit if 1st command-line argument not an integer + let input_num: i32 = args + .next() + .and_then(|s| parse_int(&s).ok()) + .unwrap_or_else(|| usage()); + + // Exit if value is negative + if input_num < 0 { + usage(); + } + + let zecks = get_zeckendorf_values::(input_num); + println!("{:?}", zecks); +}