day 03
This commit is contained in:
parent
904b6f34d0
commit
3a5b241113
1000
src/aoc2021/day03/input.txt
Normal file
1000
src/aoc2021/day03/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
110
src/aoc2021/day03/mod.rs
Normal file
110
src/aoc2021/day03/mod.rs
Normal file
@ -0,0 +1,110 @@
|
||||
const BITS_PER_LINE: usize = 12;
|
||||
|
||||
pub fn task_one(input: &str) -> String {
|
||||
let mut bit_amount: [(usize, usize); BITS_PER_LINE] = [(0, 0); BITS_PER_LINE];
|
||||
|
||||
for line in input.lines() {
|
||||
for (i, c) in line.chars().enumerate() {
|
||||
match c {
|
||||
'0' => bit_amount[i] = (bit_amount[i].0 + 1, bit_amount[i].1),
|
||||
'1' => bit_amount[i] = (bit_amount[i].0, bit_amount[i].1 + 1),
|
||||
_ => panic!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut gamma: usize = 0;
|
||||
let mut epsilon: usize = 0;
|
||||
|
||||
for i in 0..BITS_PER_LINE {
|
||||
if bit_amount[i].1 > bit_amount[i].0 {
|
||||
gamma |= 0b1 << (BITS_PER_LINE - 1 - i);
|
||||
} else {
|
||||
epsilon |= 0b1 << (BITS_PER_LINE - 1 - i);
|
||||
}
|
||||
}
|
||||
|
||||
(gamma * epsilon).to_string()
|
||||
}
|
||||
|
||||
pub fn task_two(input: &str) -> String {
|
||||
// fyi, indices for binary representation start for me at 0 -> 0110 0011
|
||||
// [0] = 1, [1] = 1, [2] = 0, ...
|
||||
fn count_bits_at(vec: &Vec<usize>, pos: usize) -> (usize, usize) {
|
||||
let mut bit_amount: (usize, usize) = (0, 0);
|
||||
|
||||
for number in vec.iter() {
|
||||
if number & 1 << pos == 0 {
|
||||
bit_amount = (bit_amount.0 + 1, bit_amount.1);
|
||||
} else {
|
||||
bit_amount = (bit_amount.0, bit_amount.1 + 1);
|
||||
}
|
||||
}
|
||||
|
||||
bit_amount
|
||||
}
|
||||
|
||||
fn remove_numbers_with_bit_at(vec: &mut Vec<usize>, bit: usize, pos: usize) {
|
||||
let mut i = 0;
|
||||
if bit == 0 {
|
||||
while i < vec.len() {
|
||||
if vec[i] & 1 << pos == 0 {
|
||||
vec.remove(i);
|
||||
} else {
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
} else if bit == 1 {
|
||||
while i < vec.len() {
|
||||
if vec[i] & 1 << pos != 0 {
|
||||
vec.remove(i);
|
||||
} else {
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut oxgen_rating: usize = 0;
|
||||
let mut coscrub_rating: usize = 0;
|
||||
|
||||
let mut numbers: Vec<usize> = Vec::new();
|
||||
input.lines().for_each(|line| numbers.push(usize::from_str_radix(line, 2).expect("Error parsing string into usize")));
|
||||
|
||||
let mut oxgen_numbers = numbers.clone();
|
||||
let mut coscrub_numbers = numbers.clone();
|
||||
|
||||
for i in 0..BITS_PER_LINE {
|
||||
let pos = BITS_PER_LINE - 1 - i;
|
||||
let oxgen_count = count_bits_at(&oxgen_numbers, pos);
|
||||
|
||||
if oxgen_count.1 >= oxgen_count.0 {
|
||||
remove_numbers_with_bit_at(&mut oxgen_numbers, 0, pos);
|
||||
} else {
|
||||
remove_numbers_with_bit_at(&mut oxgen_numbers, 1, pos);
|
||||
}
|
||||
|
||||
if oxgen_numbers.len() == 1 {
|
||||
oxgen_rating = *oxgen_numbers.first().unwrap();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for i in 0..BITS_PER_LINE {
|
||||
let pos = BITS_PER_LINE - 1 - i;
|
||||
let coscrub_count = count_bits_at(&coscrub_numbers, pos);
|
||||
|
||||
if coscrub_count.0 <= coscrub_count.1 {
|
||||
remove_numbers_with_bit_at(&mut coscrub_numbers, 1, pos);
|
||||
} else {
|
||||
remove_numbers_with_bit_at(&mut coscrub_numbers, 0, pos);
|
||||
}
|
||||
|
||||
if coscrub_numbers.len() == 1 {
|
||||
coscrub_rating = *coscrub_numbers.first().unwrap();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
(oxgen_rating * coscrub_rating).to_string()
|
||||
}
|
@ -1,2 +1,3 @@
|
||||
pub mod day01;
|
||||
pub mod day02;
|
||||
pub mod day03;
|
||||
|
@ -13,4 +13,9 @@ fn main() {
|
||||
let result_day02_task1 = aoc2021::day02::task_one(&input_day02);
|
||||
let result_day02_task2 = aoc2021::day02::task_two(&input_day02);
|
||||
println!("AOC2021 Day 02 \t Task 1: {},\tTask 2: {}", result_day02_task1, result_day02_task2);
|
||||
|
||||
let input_day03 = fs::read_to_string("src/aoc2021/day03/input.txt").expect("Error on reading file.");
|
||||
let result_day03_task1 = aoc2021::day03::task_one(&input_day03);
|
||||
let result_day03_task2 = aoc2021::day03::task_two(&input_day03);
|
||||
println!("AOC2021 Day 03 \t Task 1: {},\tTask 2: {}", result_day03_task1, result_day03_task2);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user