this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 72 lines 2.3 kB view raw
1fn main() { 2 let input = std::fs::read_to_string("input.txt").unwrap(); 3 4 let (gamma, epsilon) = gamma_and_epsilon(input.trim().split("\n").collect()); 5 println!("Part 1: {}", gamma * epsilon); 6 7 let ogr = filter_for_value(0, input.clone()); 8 let csr = filter_for_value(1, input.clone()); 9 10 println!("Part 2: {}", ogr * csr); 11} 12 13fn filter_for_value(g_or_e: u8, input: String) -> u64 { 14 let num_bits = input.clone().split("n").next().unwrap().len(); 15 16 let mut lines: Vec<&str> = input.split("\n").collect(); 17 for b in 0..num_bits { 18 if lines.len() == 1 { 19 break; 20 } 21 22 let (gamma, epsilon) = gamma_and_epsilon(lines.clone()); 23 let filter_bits = match g_or_e { 24 0 => format!("{:012b}", gamma), 25 1 => format!("{:012b}", epsilon), 26 _ => unreachable!(), 27 }; 28 29 lines = lines 30 .into_iter() 31 .filter(|l| l.chars().nth(b).unwrap() == filter_bits.chars().nth(b).unwrap()) 32 .collect(); 33 } 34 35 if lines.len() > 1 { 36 panic!("Filter didn't work!"); 37 } 38 39 let str = lines.get(0).unwrap(); 40 u64::from_str_radix(str, 2).unwrap() 41} 42 43fn gamma_and_epsilon(lines: Vec<&str>) -> (u32, u32) { 44 let mut arr: Vec<(u32, u32)> = vec![]; 45 let num_bits = lines.clone().into_iter().next().unwrap().trim().len(); 46 47 for _ in 0..num_bits { 48 arr.push((0, 0)); 49 } 50 for line in lines.clone() { 51 let bits: Vec<String> = line.split("").map(|s| s.to_owned()).collect(); 52 for i in 0..num_bits { 53 match bits.get(i + 1).unwrap().as_str() { 54 "0" => arr[i].0 += 1, 55 "1" => arr[i].1 += 1, 56 _ => println!("UNEXPECTED BIT! in pos {}", i), 57 } 58 } 59 } 60 (0..num_bits).into_iter().fold((0, 0), |(gamma, epsilon), i| { 61 let one_is_most_common = arr[i].0 <= arr[i].1; 62 let g_modifier = if one_is_most_common { 1 } else { 0 }; 63 let e_modifier = if one_is_most_common { 0 } else { 1 }; 64 ((gamma << 1) + g_modifier, (epsilon << 1) + e_modifier) 65 }) 66} 67 68#[test] 69fn test() { 70 let sample = std::fs::read_to_string("sample.txt").unwrap(); 71 assert_eq!(gamma_and_epsilon(sample.split("\n").collect()), (22, 9)); 72}