summaryrefslogtreecommitdiffstats
path: root/src/2020/5/mod.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-11 21:59:21 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-11 22:16:30 -0500
commite2d219b331a878bbb3c9dcef9ea4e218b2e3ee06 (patch)
tree93e418011c45cab8d4070d3d33b377a9364f4a27 /src/2020/5/mod.rs
parent179467096141b7e8f67d63b89fd21e779a564fe6 (diff)
downloadadvent-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.rs96
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
- );
-}