Day 3
This commit is contained in:
parent
d36f150d2c
commit
40121a400a
@ -10,3 +10,7 @@ path = "src/day1.rs"
|
||||
[[bin]]
|
||||
name = "day2"
|
||||
path = "src/day2.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "day3"
|
||||
path = "src/day3.rs"
|
||||
|
1000
inputs/day3.txt
Normal file
1000
inputs/day3.txt
Normal file
File diff suppressed because it is too large
Load Diff
111
src/day3.rs
Normal file
111
src/day3.rs
Normal file
@ -0,0 +1,111 @@
|
||||
use std::io::{self, BufRead};
|
||||
|
||||
fn most_common_bits(report: &Vec<String>) -> String {
|
||||
(0..12)
|
||||
.map(|i| {
|
||||
let counts = report
|
||||
.iter()
|
||||
.fold((0, 0), |acc, x| match x.chars().nth(i).unwrap() {
|
||||
'0' => (acc.0 + 1, acc.1),
|
||||
'1' => (acc.0, acc.1 + 1),
|
||||
_ => acc,
|
||||
});
|
||||
if counts.0 > counts.1 {
|
||||
'0'
|
||||
} else {
|
||||
'1'
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn most_common_value(report: Vec<String>, n: usize) -> Option<String> {
|
||||
(0..n)
|
||||
.fold(report, |r, i| {
|
||||
if r.len() > 1 {
|
||||
let counts = r
|
||||
.iter()
|
||||
.fold((0, 0), |acc, x| match x.chars().nth(i).unwrap() {
|
||||
'0' => (acc.0 + 1, acc.1),
|
||||
'1' => (acc.0, acc.1 + 1),
|
||||
_ => acc,
|
||||
});
|
||||
r.iter()
|
||||
.filter(|x| match x.chars().nth(i).unwrap() {
|
||||
'0' if counts.0 > counts.1 => true,
|
||||
'1' if counts.0 <= counts.1 => true,
|
||||
_ => false,
|
||||
})
|
||||
.cloned()
|
||||
.collect()
|
||||
} else {
|
||||
r
|
||||
}
|
||||
})
|
||||
.first()
|
||||
.cloned()
|
||||
}
|
||||
|
||||
fn least_common_value(report: Vec<String>) -> Option<String> {
|
||||
(0..12)
|
||||
.fold(report, |r, i| {
|
||||
if r.len() > 1 {
|
||||
let counts = r
|
||||
.iter()
|
||||
.fold((0, 0), |acc, x| match x.chars().nth(i).unwrap() {
|
||||
'0' => (acc.0 + 1, acc.1),
|
||||
'1' => (acc.0, acc.1 + 1),
|
||||
_ => acc,
|
||||
});
|
||||
r.iter()
|
||||
.filter(|x| match x.chars().nth(i).unwrap() {
|
||||
'0' if counts.0 <= counts.1 => true,
|
||||
'1' if counts.0 > counts.1 => true,
|
||||
_ => false,
|
||||
})
|
||||
.cloned()
|
||||
.collect()
|
||||
} else {
|
||||
r
|
||||
}
|
||||
})
|
||||
.first()
|
||||
.cloned()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
const INPUT: &'static str = include_str!("../inputs/day3.txt");
|
||||
let report: Vec<String> = io::Cursor::new(INPUT).lines().map(|l| l.unwrap()).collect();
|
||||
let gamma_rate = u32::from_str_radix(&most_common_bits(&report), 2).unwrap();
|
||||
let epsilon_rate = 0xfff ^ gamma_rate;
|
||||
println!("gamma rate {} epsilon rate {}", gamma_rate, epsilon_rate);
|
||||
println!("solution {}", gamma_rate * epsilon_rate);
|
||||
|
||||
let oxygen_generator_rating =
|
||||
u32::from_str_radix(&most_common_value(report.clone(), 12).unwrap(), 2).unwrap();
|
||||
println!("oxygen generator rating {}", oxygen_generator_rating);
|
||||
|
||||
let co2_scrubber_rating = u32::from_str_radix(&least_common_value(report).unwrap(), 2).unwrap();
|
||||
println!("CO2 scrubber rating {}", co2_scrubber_rating);
|
||||
|
||||
println!("solution {}", oxygen_generator_rating * co2_scrubber_rating);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn oxygen_generator_rating() {
|
||||
let report = vec![
|
||||
"00100".to_string(),
|
||||
"11110".to_string(),
|
||||
"10110".to_string(),
|
||||
"10111".to_string(),
|
||||
"10101".to_string(),
|
||||
"01111".to_string(),
|
||||
"00111".to_string(),
|
||||
"11100".to_string(),
|
||||
"10000".to_string(),
|
||||
"11001".to_string(),
|
||||
"00010".to_string(),
|
||||
"01010".to_string(),
|
||||
];
|
||||
assert_eq!(most_common_value(report, 5).unwrap(), "10111");
|
||||
}
|
Loading…
Reference in New Issue
Block a user