const MAX: u32 = 1_000_000; fn main() { fizzbuzz(); } struct Definition<'a> { divisor: u16, text: &'a str, } fn fizzbuzz() { let definitions: Vec = vec![ Definition{divisor: 3, text: "fizz"}, Definition{divisor: 5, text: "buzz"}, ]; for i in 1..MAX { let mask = calculate_bitmap_mask_for_integer(i, &definitions); let to_print: String = match mask { 0 => i.to_string(), _ => calculate_words(mask, &definitions), }; println!("{}", to_print); } } fn calculate_bitmap_mask_for_integer(number: u32, definitions: &Vec) -> u16 { let mut mask: u16 = 0; let mut i: u16 = 0; for definition in definitions { i += 1; if number % (definition.divisor as u32) == 0 { mask |= 1 << i; } } mask } fn calculate_words(mask: u16, definitions: &Vec) -> String{ let mut words: Vec<&str> = vec![]; let mut i: u16 = 0; for definition in definitions { i += 1; if mask & (1 << i) != 0 { words.push(definition.text); } } words.join(", ") }