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 day01;
|
||||||
pub mod day02;
|
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_task1 = aoc2021::day02::task_one(&input_day02);
|
||||||
let result_day02_task2 = aoc2021::day02::task_two(&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);
|
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