use std::env::args; use std::fs::File; use std::io::BufRead; use std::io::BufReader; fn foo bool + Copy>(numbers: &Vec, k: usize, f: F) -> i32 { let mut clone = numbers.clone(); let mut i = k; while clone.len() > 1 { i -= 1; let ones = clone.iter().filter(|x| (*x >> i) & 1 == 1).count(); let pick = if f(ones, clone.len()) {1} else {0}; clone = clone.into_iter().filter(|x| (x >> i) & 1 == pick).collect(); } return clone[0]; } fn main() { let path = args().nth(1).unwrap(); let file = File::open(path).unwrap(); let mut numbers = Vec::new(); let mut k = 0; for line in BufReader::new(file).lines() { let l = line.unwrap(); let i = i32::from_str_radix(&l, 2).unwrap(); numbers.push(i); k = l.len(); } let a = foo(&numbers, k, |ones, n| ones * 2 >= n); let b = foo(&numbers, k, |ones, n| ones * 2 < n); print!("{}\n", a * b); }