[TASK] Solved Day 5

This commit is contained in:
2020-12-05 11:10:55 +01:00
parent a37c2cbda5
commit ce1695c36b
4 changed files with 906 additions and 0 deletions

76
src/day5.rs Normal file
View File

@@ -0,0 +1,76 @@
use super::util;
pub fn solve() {
let lines = util::read_file("input/day5.txt");
let seats = lines.iter()
.map(|s| Seat::parse(s))
.collect::<Vec<Seat>>();
let part1 = seats.iter()
.map(|s| s.seat_id())
.max().unwrap_or(0);
println!("Day 5 Part 1: {}", part1);
println!("Day 5 Part 2: {}", solve_part2(&seats));
}
fn solve_part2(seats: &Vec<Seat>) -> u16 {
let mut seat_ids = seats.iter()
.map(|s| s.seat_id())
.collect::<Vec<u16>>();
seat_ids.sort();
for i in 0..seat_ids.len() {
let seat_id = seat_ids[i];
// Skip first and last row:
if seat_id < 8 || seat_id > (127 << 3) {
continue;
}
if seat_id + 1 != seat_ids[i + 1] {
return seat_id + 1;
}
}
return 0;
}
#[derive(Debug)]
struct Seat {
row: u8,
col: u8
}
impl Seat {
pub fn parse(input: &str) -> Seat {
return Seat {
row: Seat::parse_binary(&input[0..7], 'F', 'B'),
col: Seat::parse_binary(&input[7..10], 'L', 'R')
}
}
fn parse_binary(src: &str, zero: char, one: char) -> u8 {
let mut chars = src.chars();
let mut res = 0;
for i in 0..src.len() {
let c = chars.next().unwrap();
if c == one {
res |= 1 << (src.len() - i - 1)
} else if c != zero {
eprintln!("Found unknown character: {}", c);
}
}
return res;
}
pub fn seat_id(&self) -> u16 {
return ((self.row as u16) << 3) | (self.col as u16);
}
}

View File

@@ -6,6 +6,7 @@ mod day1;
mod day2;
mod day3;
mod day4;
mod day5;
fn main() {
@@ -20,6 +21,7 @@ fn main() {
2 => day2::solve(),
3 => day3::solve(),
4 => day4::solve(),
5 => day5::solve(),
_ => println!("This day is not yet implemented")
}
} else {
@@ -28,6 +30,7 @@ fn main() {
day2::solve();
day3::solve();
day4::solve();
day5::solve();
}
println!("Execution took {} μs", now.elapsed().as_micros());