46 lines
1.2 KiB
Rust
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);
|
|
}
|
|
}
|