From 951a45723bdded0f07ee14dd1016dc4b631ee677 Mon Sep 17 00:00:00 2001 From: Tim-tech-gif Date: Thu, 24 Oct 2024 18:45:22 +0300 Subject: [PATCH] Create let mut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Код Грея — це двійкова послідовність, у якій два послідовних значення відрізняються лише одним бітом. Для nбітів код Грея може бути згенерований рекурсивно або ітеративно. Наприклад: Сірий код для n = 0:[""] Сірий код для n = 1:["0", "1"] Сірий код для n = 2:["00", "01", "11", "10"] Ось код Rust, який реалізує цю gray(n: u8)функцію: Якщо n == 0, код Грея дорівнює [""]. Якщо n == 1, код Грея дорівнює ["0", "1"]. Для більших значень nкод Грея будується ітераційно: Відображати існуючу послідовність коду Грея. Додайте a 0до вихідної половини та 1до відображеної половини. --- let mut | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 let mut 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) + ); + } +}