diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-12-11 21:59:21 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-12-11 22:16:30 -0500 |
commit | e2d219b331a878bbb3c9dcef9ea4e218b2e3ee06 (patch) | |
tree | 93e418011c45cab8d4070d3d33b377a9364f4a27 /src/2020/5/mod.rs | |
parent | 179467096141b7e8f67d63b89fd21e779a564fe6 (diff) | |
download | advent-of-code-e2d219b331a878bbb3c9dcef9ea4e218b2e3ee06.tar.gz advent-of-code-e2d219b331a878bbb3c9dcef9ea4e218b2e3ee06.zip |
refactor
Diffstat (limited to 'src/2020/5/mod.rs')
-rw-r--r-- | src/2020/5/mod.rs | 96 |
1 files changed, 0 insertions, 96 deletions
diff --git a/src/2020/5/mod.rs b/src/2020/5/mod.rs deleted file mode 100644 index 1f57f4f..0000000 --- a/src/2020/5/mod.rs +++ /dev/null @@ -1,96 +0,0 @@ -use crate::prelude::*; - -pub fn parse(fh: File) -> Result<impl Iterator<Item = i64>> { - Ok(parse::lines(fh).map(|line| seat_id(&line).unwrap())) -} - -pub fn part1(ids: impl Iterator<Item = i64>) -> Result<i64> { - let mut max = 0; - for id in ids { - if id > max { - max = id; - } - } - Ok(max) -} - -pub fn part2(ids: impl Iterator<Item = i64>) -> Result<i64> { - let mut seats = vec![false; 1024]; - for id in ids { - seats[id as usize] = true; - } - let first = seats - .iter() - .position(|b| *b) - .context("failed to find taken seat")?; - let seat = seats - .iter() - .skip(first) - .position(|b| !*b) - .context("failed to find free seat")? - + first; - if !seats[seat - 1] || seats[seat] || !seats[seat + 1] { - return Err(anyhow!("invalid seat found")); - } - Ok(seat.try_into()?) -} - -fn seat_id(desc: &str) -> Result<i64> { - if desc.len() != 10 { - return Err(anyhow!("invalid desc {}", desc)); - } - let row_desc = &desc[0..7]; - let col_desc = &desc[7..10]; - - let mut min_row = 0; - let mut max_row = 127; - for c in row_desc.chars() { - let mid = (max_row + min_row) / 2; - match c { - 'F' => { - max_row = mid; - } - 'B' => { - min_row = mid + 1; - } - _ => return Err(anyhow!("invalid desc {}", desc)), - } - } - if min_row != max_row { - return Err(anyhow!("bug")); - } - let row = min_row; - - let mut min_col = 0; - let mut max_col = 7; - for c in col_desc.chars() { - let mid = (max_col + min_col) / 2; - match c { - 'L' => { - max_col = mid; - } - 'R' => { - min_col = mid + 1; - } - _ => return Err(anyhow!("invalid desc {}", desc)), - } - } - if min_col != max_col { - return Err(anyhow!("bug")); - } - let col = min_col; - - Ok(row * 8 + col) -} - -#[test] -fn test() { - assert_eq!( - part1(parse(parse::data(2020, 5).unwrap()).unwrap()).unwrap(), - 978 - ); - assert_eq!( - part2(parse(parse::data(2020, 5).unwrap()).unwrap()).unwrap(), - 727 - ); -} |