AoC2020/src/day5.rs

46 lines
1.2 KiB
Rust

use std::io::BufRead;
use std::collections::HashSet;
fn parse_seat(boarding_pass: &str) -> usize {
let seat_base2: String = boarding_pass.chars().map(|c| match c {
'R' | 'B' => '1',
'L' | 'F' => '0',
_ => unreachable!()
}).collect();
usize::from_str_radix(seat_base2.as_str(), 2).unwrap()
}
pub fn part1<F: BufRead> (input: F) {
let max_seat_id = input.lines()
.map(|line| parse_seat(&line.unwrap()))
.max();
println!("{}", max_seat_id.unwrap())
}
pub fn part2<F: BufRead> (input: F) {
let seats_taken: HashSet<_> = input.lines()
.map(|line| parse_seat(&line.unwrap()))
.collect();
let my_seat = (1..1024).find(|id| {
seats_taken.contains(&(id - 1)) && !seats_taken.contains(&id) && seats_taken.contains(&(id + 1))
});
println!("{}", my_seat.unwrap())
}
#[cfg(test)]
mod test {
use super::*;
#[test]
pub fn test_parse() {
assert_eq!(parse_seat("FBFBBFFRLR"), 44 * 8 + 5);
assert_eq!(parse_seat("BFFFBBFRRR"), 70 * 8 + 7);
assert_eq!(parse_seat("FFFBBBFRRR"), 14 * 8 + 7);
assert_eq!(parse_seat("BBFFBBFRLL"), 102 * 8 + 4);
}
}