this repo has no description
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}