Rust challenge 33/100 - advent of code 2021 day 3 part 1 & 2
Table of content
What is this
The rules of the game are explained in my original post.
33rd Challenge
Challenge
Today I’m solving today’s AoC day 3 2021. So far only part one is done. Part two coming soon.. .
Solution
fn main() {
let x:Vec<Vec<_>> = DIAGNOSTIC_REPORT.lines()
.map(|l| {
l.as_bytes()
.into_iter()
.map(|x|*x == b'1')
.collect()
})
.collect();
let length = x.len() as u32;
let bit_count = x
.iter()
.fold(vec![0; length as usize], |acc:Vec<u32>, inst|{
acc
.iter().zip(inst.iter())
.map(|x| {match x.1
{
true =>{ *x.0 + 1},
false => *x.0
}})
.collect()
});
println!("{:?}",bit_count);
let gamma= bit_count.iter()
.map(|x|{ (*x > length/2) as u32})
.rev()
.enumerate()
.fold(0,|acc, inst|{
acc | (inst.1 << (inst.0 as u32))
}
);
let epsilon = (!gamma) & 0b111111111111;
println!("{}*{} = {}",gamma,epsilon,gamma*epsilon);
}
const DIAGNOSTIC_REPORT:&str ="00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010";
To see the full source see github and see the live demo in playground.
Saying part two was a hassle is an under statement. The solution outputs to binary vector which need to be multiplied. I did that manually as I lost motivation in part two unlocked!
Using transpose helps, starting to feel like this AOC stuff would be easier in Matlab / octave.
fn main() {
let mut input: Vec<Vec<u32>> = DIAGNOSTIC_REPORT.lines()
.map(|l| {
l.as_bytes()
.into_iter()
.map(|x| (*x == b'1') as u32)
.collect()
})
.collect();
let mut a:usize = 0;
let mut x = input.clone();
while (*x).len()>1 {
let bit_count = find_most_common_bits_per_row(x.clone());
x.retain(|x|{x[a] == bit_count[a]});
a+= 1;
}
println!("{:?}",x);
let mut a:usize = 0;
while (*input).len()>1 {
let bit_count = find_most_common_bits_per_row(input.clone());
input.retain(|x|{x[a] != bit_count[a]});
a+= 1;
}
println!("{:?}",input);
}
fn find_most_common_bits_per_row(x: Vec<Vec<u32>>) -> Vec<u32> {
let length = x.len() as u32;
let x = transpose(x);
let bit_count: Vec<u32> = x.iter()
.map(|x| {
x.iter().fold(0, |acc, inst| { acc + inst })
})
.map(|x| { (x as f32 >= (length as f32 / 2.0)) as u32 })
.collect();
bit_count
}
/// Source : https://stackoverflow.com/questions/64498617/how-to-transpose-a-vector-of-vectors-in-rust
fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
assert!(!v.is_empty());
let len = v[0].len();
let mut iters: Vec<_> = v.into_iter().map(|n| n.into_iter()).collect();
(0..len)
.map(|_| {
iters
.iter_mut()
.map(|n| n.next().unwrap())
.collect::<Vec<T>>()
})
.collect()
}
const DIAGNOSTIC_REPORT:&str ="00100
11110
10110
10111
10101
01111
00111
11100
10000
11001
00010
01010";