diff --git a/let mut b/let mut new file mode 100644 index 0000000..e9e2ba2 --- /dev/null +++ b/let mut @@ -0,0 +1,50 @@ +fn gray(n: u8) -> Vec { + if n == 0 { + return vec![String::from("")]; + } + + // Start with 1-bit gray code + let mut result = vec![String::from("0"), String::from("1")]; + + // Build for n bits + for i in 2..=n { + let size = result.len(); + // Reflect the current list + for j in (0..size).rev() { + result.push(result[j].clone()); + } + // Append '0' to the first half + for j in 0..size { + result[j] = format!("0{}", result[j]); + } + // Append '1' to the second half + for j in size..2*size { + result[j] = format!("1{}", result[j]); + } + } + + result +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let test_data = [ + (0, vec![""]), + (1, vec!["0", "1"]), + (2, vec!["00", "01", "11", "10"]), + (3, vec!["000", "001", "011", "010", "110", "111", "101", "100"]), + (4, vec!["0000", "0001", "0011", "0010", "0110", "0111", "0101", "0100", + "1100", "1101", "1111", "1110", "1010", "1011", "1001", "1000"]), + ]; + + test_data + .iter() + .for_each(|(n, out)| + assert_eq!(gray(*n), *out) + ); + } +}