Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/advent-of-code-2021
Path: blob/main/src/day03.rs
97 views
1
pub fn run() {
2
part1();
3
part2();
4
}
5
6
fn part1() {
7
let nums = get_input_numbers();
8
let bit_size = get_bit_size();
9
10
let mut gamma = 0;
11
for i in 0..bit_size {
12
gamma |= most_common_bit_at(nums.as_ref(), i) << i;
13
}
14
let epsilon = !gamma & (1 << bit_size) - 1;
15
println!("{}", gamma * epsilon);
16
}
17
18
fn part2() {
19
let mut oxigen_nums = get_input_numbers();
20
let mut index = get_bit_size() - 1;
21
loop {
22
let value = most_common_bit_at(oxigen_nums.as_ref(), index);
23
oxigen_nums.retain(|&n| bit_at(n, index) == value);
24
if oxigen_nums.len() == 1 {
25
break;
26
}
27
index -= 1;
28
}
29
30
let mut co2_nums = get_input_numbers();
31
let mut index = get_bit_size() - 1;
32
loop {
33
let value = most_common_bit_at(co2_nums.as_ref(), index);
34
co2_nums.retain(|&n| bit_at(n, index) != value);
35
if co2_nums.len() == 1 {
36
break;
37
}
38
index -= 1;
39
}
40
41
println!("{}", oxigen_nums[0] * co2_nums[0])
42
}
43
44
static INPUT: &str = include_str!("inputs/day03");
45
46
fn get_input_numbers() -> Vec<i32> {
47
INPUT
48
.lines()
49
.map(|s| i32::from_str_radix(s, 2).unwrap())
50
.collect()
51
}
52
53
fn get_bit_size() -> usize {
54
INPUT.lines().next().unwrap().len()
55
}
56
57
fn bit_at(n: i32, i: usize) -> i32 {
58
(n >> i) & 1
59
}
60
61
fn most_common_bit_at(nums: &[i32], index: usize) -> i32 {
62
let ones_count = nums.iter().filter(|&n| bit_at(*n, index) == 1).count();
63
(ones_count * 2 >= nums.len()) as i32
64
}
65
66