From 7c66aada6529a051e2a465fca34d265e8f7045e5 Mon Sep 17 00:00:00 2001
From: chylex <contact@chylex.com>
Date: Thu, 24 Feb 2022 04:55:03 +0100
Subject: [PATCH] Add 2020 - Day 5 - Part 2

---
 2020/05/main.rs | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/2020/05/main.rs b/2020/05/main.rs
index c4ca354..b671b9c 100644
--- a/2020/05/main.rs
+++ b/2020/05/main.rs
@@ -1,16 +1,32 @@
+use std::collections::HashSet;
 use std::error::Error;
 
 use crate::pass::BoardingPass;
+use crate::utils::GenericError;
 
 #[path = "../utils/mod.rs"]
 mod utils;
 
 fn main() -> Result<(), Box<dyn Error>> {
 	let passes = utils::parse_input_lines::<BoardingPass>()?;
+	let seat_ids = passes.iter().map(BoardingPass::get_seat_id).collect::<HashSet<u32>>();
 	
-	let max_seat_id = passes.iter().map(BoardingPass::get_seat_id).max().unwrap_or(0);
+	let max_seat_id = *seat_ids.iter().max().unwrap_or(&0);
 	println!("Max seat ID: {}", max_seat_id);
 	
+	let missing_seat_ids = (0..=max_seat_id).filter(|id| !seat_ids.contains(id)).collect::<HashSet<u32>>();
+	let your_seat_id_candidates = missing_seat_ids.iter()
+		.map(|id| *id)
+		.filter(|id| *id > 0 && *id < max_seat_id && !missing_seat_ids.contains(&(*id - 1)) && !missing_seat_ids.contains(&(*id + 1)))
+		.collect::<Vec<u32>>();
+	
+	if your_seat_id_candidates.len() != 1 {
+		Err(GenericError::new(format!("Cannot find your seat ID, too many candidates: {:?}", your_seat_id_candidates)))?;
+	}
+	else {
+		println!("Your seat ID: {}", your_seat_id_candidates.first().unwrap());
+	}
+	
 	Ok(())
 }