diff --git a/src/main.rs b/src/main.rs index 32751e7..fbb6022 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,32 +2,25 @@ mod arr; struct Solution {} impl Solution { - pub fn get_sneaky_numbers(nums: Vec) -> Vec { - let n = nums.len() - 2; - let xor_all: i32 = nums.iter().enumerate().fold((n ^ (n+1)) as i32, |acc, (i ,&x)| acc ^ x ^ i as i32); - let mut idx = 0; - let mut calc_idx = xor_all; - while true { - if calc_idx % 2 == 1 { - break; + pub fn number_of_beams(bank: Vec) -> i32 { + let mut ans = 0; + let mut last_ones = 0; + for i in 0..bank.len() { + let new_ones = bank[i].chars().fold(0,|last, c| last + if c == '1'{1}else {0}); + if new_ones == 0 { + continue; } - calc_idx >>= 1; - idx += 1; - } - let mut ans = vec![0;2]; - for (i,&x) in nums.iter().enumerate() { - if i < n{ - ans[i >> idx &1 as usize] ^= i as i32; - } - ans[(x >> idx &1) as usize] ^= x; + ans += last_ones * new_ones; + last_ones = new_ones; } ans } } fn main() { - println!( - "{:?}", - Solution::get_sneaky_numbers(vec![2,0,2,1,0]) - ); + let src = vec!["011001", "000000", "010100", "001000"] + .iter() + .map(|s| s.to_string()) + .collect(); + println!("{:?}", Solution::number_of_beams(src)); }