This commit is contained in:
Max Hohlfeld 2021-12-19 00:16:59 +01:00
parent 904b6f34d0
commit 3a5b241113
4 changed files with 1116 additions and 0 deletions

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
View 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()
}

View File

@ -1,2 +1,3 @@
pub mod day01;
pub mod day02;
pub mod day03;

View File

@ -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);
}