Binary Boarding


Fork me on GitHub
2020-12-05

Day 05: Binary Boarding

Description:
--- Day 5: Binary Boarding ---

You board your plane only to discover a new problem: you dropped your boarding pass! You aren't sure which seat is yours, and all of the flight attendants are busy with the flood of people that suddenly made it through passport control.

You write a quick program to use your phone's camera to scan all of the nearby boarding passes (your puzzle input); perhaps you can find your seat through process of elimination.

Instead of zones or groups, this airline uses binary space partitioning to seat people. A seat might be specified like FBFBBFFRLR, where F means "front", B means "back", L means "left", and R means "right".

The first 7 characters will either be F or B; these specify exactly one of the 128 rows on the plane (numbered 0 through 127). Each letter tells you which half of a region the given seat is in. Start with the whole list of rows; the first letter indicates whether the seat is in the front (0 through 63) or the back (64 through 127). The next letter indicates which half of that region the seat is in, and so on until you're left with exactly one row.

For example, consider just the first seven characters of FBFBBFFRLR:

Start by considering the whole range, rows 0 through 127.
F means to take the lower half, keeping rows 0 through 63.
B means to take the upper half, keeping rows 32 through 63.
F means to take the lower half, keeping rows 32 through 47.
B means to take the upper half, keeping rows 40 through 47.
B keeps rows 44 through 47.
F keeps rows 44 through 45.
The final F keeps the lower of the two, row 44.

The last three characters will be either L or R; these specify exactly one of the 8 columns of seats on the plane (numbered 0 through 7). The same process as above proceeds again, this time with only three steps. L means to keep the lower half, while R means to keep the upper half.

For example, consider just the last 3 characters of FBFBBFFRLR:

Start by considering the whole range, columns 0 through 7.
R means to take the upper half, keeping columns 4 through 7.
L means to take the lower half, keeping columns 4 through 5.
The final R keeps the upper of the two, column 5.

So, decoding FBFBBFFRLR reveals that it is the seat at row 44, column 5.

Every seat also has a unique seat ID: multiply the row by 8, then add the column. In this example, the seat has ID 44 * 8 + 5 = 357.

Here are some other boarding passes:

BFFFBBFRRR: row 70, column 7, seat ID 567.
FFFBBBFRRR: row 14, column 7, seat ID 119.
BBFFBBFRLL: row 102, column 4, seat ID 820.

As a sanity check, look through your list of boarding passes. What is the highest seat ID on a boarding pass?

--- Part Two ---

Ding! The "fasten seat belt" signs have turned on. Time to find your seat.

It's a completely full flight, so your seat should be the only missing boarding pass in your list. However, there's a catch: some of the seats at the very front and back of the plane don't exist on this aircraft, so they'll be missing from your list as well.

Your seat wasn't at the very front or back, though; the seats with IDs +1 and -1 from yours will be in your list.

What is the ID of your seat?

Input:
FBFBBBFRLL
BFFFBFFRRR
BBFBFFFLLR
FBFFFBFLRR
FBFFBFBLLR
BFBBFBBRLL
BFFFFFFRLR
FBBBBFFLLR
FFBBFFFLRL
FFBFBBFLLR
FBFFFBBRRR
FBFFBFBLRR
FBBFBFFRLR
FBBBFBFRLL
FFBFFBBRLR
FBFBBBFRRL
BFFBBBFRRR
FBFBBBBLLR
FFBFFBBLLL
BFFBFBBLLR
BFFBFBBRLR
BFFBBBBLLL
FBBBBFBLLR
FFBFBBBLRR
FFBFBBFLRR
FFFBFBBRRL
FFFFFBBRLL
BFFFBFFLRR
FFFBFBBRLR
FBFFBBFLLR
BFBFFBBRRR
FBBFBBFLRL
BFBBFBFRRR
BFFFBBBLRL
BBFFFBFLLR
BFFFFBFLRR
BFFBFFBLLL
FFBBFBFRRR
BFBFFFBLLL
FBFBFFFRRR
BFBFBBBLLL
BFFFBBFLLL
BFBFFFBLLR
BFFBBBFRRL
FFFBBFFLLR
BFFBBBFLRR
FBFFBBBRLR
FBBFBBFLRR
FBBFFBFRRR
FBBFBBBRRL
FFFBFFBRRL
FBFBFFBRLL
FBFFBBFRLL
BFBFBFFRLL
FBFBFFFRLR
BFBFFBBRRL
FFBBFFBRRR
BFFBFBBLRL
FFBFBFBLLL
BBFFFBFRLL
FBFBBBFRRR
BFFBBFFLRR
BFBBFFBLRL
BFFFFFBLLL
BBFFFFFRLR
FBBFFBFRLL
FFBFBFFRRR
BFBBBBFLRR
BFFBBFFRLL
BFBBFFBLLL
BFFFFFBRRR
FBBFFFBLRL
FFFBBBFRLR
FFBBBFBRRL
BFFFBBBRRL
FFBFBFBRRR
FBBBBBFRRR
BBFBFFFRLL
FBFFFBBLRR
FBFBFFBRRR
BFBFBFBRLR
FBBBFFFRRL
BFBFFFBRLL
FBBBFFBLLL
BFBFBFFRLR
BBFFBFBLRL
BBFFBFBRLR
BBFBFFFRRR
BFBBFFFRLL
BFFBBBBRRL
FFBFFBFRLL
FBBBFBBLRR
FBFFFFFRLR
FBFFFBFLLR
BBFFBFFRRR
BFBFBFBRLL
BFFBBBBLLR
FBBBFBFLLL
FFBBFBBRLR
FFFFBBFRRR
FFFBFFFRRL
FFFFBBBLLL
FBBBBFBLLL
BFBBFBFRLL
FFBFBFFRLR
FBFBBBFLLL
BFBBBFFLLL
BBFFBFFRLL
FBFFFFFLLR
FBBBBFBLRR
BFBFFFFRRR
BFFBBBBLRL
BFFBBFFLLL
FBFFBBFLRR
BBFFFFBLRR
FBBBBFFRLL
FBFBFFBRLR
FFFFBBFRLR
FBBFFBBLLR
BFFFBBFLRL
BFFFFFFLRR
BFBFBFBRRL
FFBBFBFLLR
BFBBFBFLLR
FFBBBFBLRR
BBFFBFBRRL
BFFBBBFLRL
BFFBFFFRRR
FFFFBBFLLL
BBFFFBBRLR
FFBBBBBRLR
FFBFBBBRLR
FFFFBFBLLR
FBBBBBBLLR
FBBBFFBLRL
BFFFFFFLLL
FBBFBBFLLL
BFBBBBBLRR
FBFBBFBLLL
FBFFFBBLLL
FBFFFBBRLR
FFFBBBFRRL
FBFFFFBLLL
BBFFFFFRLL
BFBFBBFLRL
FBBBFFFLLL
BFBBFBBRLR
FFBFBBFRLL
FFBFBFBLRL
BFFBBBBRRR
FFFFBBFLRL
BBFFFFBLLR
FFFBBBFLLR
FFFBFFFLLR
FFBBBFFLRL
FBFBBBFLRL
FBBFBBFLLR
FBFBBFFLLR
BBFFBBBRRL
FBFBBFBLRR
FBBBFFFLLR
FBFBFFFRLL
FFBBFFBLLL
FBBBFBFRRR
BFBFFFBRRR
FBBBFFFRRR
BBFFBBBLLL
BFFBFFBRLR
BFFFBFBLLR
FBBBBBFLRR
FBBFBBBLRL
FFFBFFFLRR
FFFFBBBRRR
BBFFFBFLRL
FBFBBFFRRL
BBFBFFFRLR
FBFBFBBRRL
FFBFFBFLRL
FBFFBFBRLR
BFBFFFFLRL
FBFFFBFRRR
FFFFBFBRRR
BBFFFFBRLR
FBBBFFBRRL
FBBFFBBRLR
FFBBFBFLRL
BFFFBBBLLR
BFFFFFFRLL
BFFBBBBLRR
BFBFBBBRRL
FBFBBBBLLL
BBFFFBBLRR
FFFFBBFLRR
FFBBFBBLRR
FFFBBBBLLL
FFBBBBFLLL
FBBFFFFLLR
FFBFBBBRLL
FFBBFBBRRR
BFBFBBBLLR
FBBBBBFLLL
FFBBFFBRLL
BFBFFBFRLR
FBBFBFBRRL
FFBBFFFLRR
BFBFBFFLRL
FBFFBFFRRR
BBFFBFFRLR
FFBBBBBRRL
FBBBFBBLLR
FFFBBBBLLR
FFBBFBBLLR
BBFBFFBLRL
BFFFFFBLLR
FFFBFFBRLL
FFFFBFBRLR
FFBFFBBRRR
FBBBBFFLRR
BFBFFFFRLR
FFBBFFBLRL
BFBBFBBLLR
BBFBFFFLRR
FBFFFBBLLR
BFFBBBFLLR
BFFBBFFLLR
BFBBBBFRLR
FBFFBBBLLR
FFBFFFFLLR
FBBBBFFRRL
FBFBBFBRRL
FFFFBFBLRR
BBFFFFBRRR
BFBBFBFRRL
BFFBBFFRLR
FBFBFBFLLR
BBFFBFFLRL
BBFFBBBLLR
BFBBBFBLLL
BFBBBBBLLR
FBBBFFBRLL
FBFFBFBRLL
BFBFFBFLLR
BFBFFFFLLL
FBFFFFFRLL
FFBBFFFLLR
FFFBFFFRRR
FBFFFBFRLR
FFFBFBBLLL
BBFFFBBLLL
FFFBBFBLRL
FBBBFBFRRL
FFFBBFBRLR
BFBBBFFLRR
FFBBBFFLRR
FFBFBBBLLR
FBBFBFBLLR
FFBFFBBRRL
FFFBFBFLRR
FBBFBFBRLL
BBFFBBFLRL
FBBFFBFRRL
BFBFBFFRRR
BFBBBFBRRR
BFFFFBFLLR
FBBFBFBRRR
BFFFFBBLLL
FFFBFFFRLR
FBBFBFBRLR
BFFFFBFRLL
FFBFBBFRRR
BBFFBFBRRR
FFBBBFFRLR
BFBFBFFRRL
BFFFBFBLRR
BFBBFBBRRR
FFBFFBFRLR
BFFFBFFRRL
BFBFBBBLRR
FFBBBBBRLL
BFBBFFBRLR
FBFFFFFLRL
FFBBBBBRRR
FFBFFFBLLL
FFBBBBBLLR
BBFFBFBRLL
BFBFBBBLRL
FBBFFFFLRR
BBFFBFBLLR
FFBBBFBLLR
BFBFFFBRLR
FBFBBBFLRR
FBFBBBBRLL
BFFFFBFLRL
BFFFBFBRLR
FBBFFFFLRL
FFFBBBBRLL
FFFBFFFRLL
FFFFBBBLRL
BFFFBFBRLL
FBFBBBBLRR
BFBBBFFLLR
FFFBFFBRLR
FBFFBFFLRR
FFFFBFFLLL
BFFBBBFLLL
BFFFBBBRLL
FBFFFFBLRL
BBFFBBFRLL
BFBBBFBLRL
FBBFFBBRLL
BFBBBBBLLL
BFBFBFBLRL
BFFBBFBLRL
BFFBFFBRRR
FFBBBBFLRR
FBBBBFBRRR
FBBBFBFLLR
FFBFBBFLLL
BBFFBBFLRR
FFFBBFFRLR
FBBBFFFRLL
FBBBBFFRRR
FFFBFBFLLL
BBFBFFFLLL
FBFFBFBRRR
BFFFBFFLRL
FFBBBFBLLL
FBBBBFBRLR
BFBFFBFLLL
BFBFBBFLLL
FBFBFFBLLL
FBBBBFFRLR
FBFFBFFRLR
BFBFBBFLRR
FBFBBBBLRL
FFFFBBFRLL
FFBFBBBRRR
BFFBBFFRRL
BBFFBBFRLR
FBBFFBFLLR
FBFFBFFLLL
BBFFFBFRRL
FBFFFFBRLL
FBFBFBFRRL
FFBFFFBLLR
BFBFFBBLLL
BFBFBFFLRR
FBFFBFFRLL
BFFBFBFLLR
FBFBFFBLRL
FFBFBFFRRL
FBFBBBBRLR
FFFFBBBRLL
BFBBFBFLLL
FBFFFFFLLL
FFBBFBFLRR
FFBFBFBRRL
FBFFBFBRRL
FBFBFBFRLR
FFFBBBFLRL
BFBBBBBRLR
BBFFBBFLLL
FBBFBBBLRR
FFBBBFBRLL
FBFFBBFRRR
FFFFBFFLRL
FFBFBBFRLR
FBBFBFFLRR
FFBBFBFLLL
FFBFBBBLLL
BFFFBBBLLL
BFFBBBBRLR
BFBBFBBLLL
FFBBBFBLRL
BFFBBFFRRR
FFFBBFBRLL
BFBFBFFLLL
BFFBBBFRLR
BFBFFBBLRR
FBBFFFBRRR
FBBFFFFRRR
BFBFBFBLLR
BBFFBBFRRL
FFFFBBBRRL
FFFBFBFLRL
BFFFBFFLLR
FFBBFFFRRL
FFFBFBBRRR
BFFFFBBRRL
BFBBFFFLRR
BFBFFFFRLL
FFFFBBBRLR
FFFBBFBLLR
FBFBFBFRLL
BFBBFBFLRL
BFBBBBBRRR
FBFFFFBRRL
BFBFFFBLRL
FBFBBBFRLR
BFBFFBFLRR
FFBFBFFLRR
FFFBBBFRRR
FFBBFFBRLR
FFBFFFFLRR
FBBBFFFLRL
BFBBFFBLLR
BFFBFBBLRR
FBBFBFBLRL
BFFFBFBLLL
FFFBBFFLRR
FBFFFFFRRR
BFBFFBFLRL
FFBFFFBRRR
FBFBFBBLLR
FFFFBBBLLR
BFBFFFFRRL
FFBBFFFRRR
FBBBFBFLRL
BFBBBFFRLL
BFBFFBBLRL
BBFFFFFLLR
FFBBBFFLLL
FFBFFFBRLL
FFBBFFBLLR
BBFFBFFLLL
FBFBBFBRRR
FBBBBBFLLR
FFBFFFFLRL
FBBBBFFLLL
BFFBFBFRRR
FBFFFFFLRR
FFFFBBFLLR
FFFBFBFRRL
FBFBFBFLRR
FBFBBFFRLR
BFFFBBFRLR
FFBFFBBLRR
FFBBFFBRRL
BFBFFBFRRL
FFFBFFBLRR
BFBBFFFRRR
BFFBFBFLRL
FFBFBBFRRL
BFFFBFFLLL
FBFFBFBLLL
BFBBFFFLLR
BFFFFBBLRR
FFFBFFFLLL
BBFFBBBRLL
BFFBFBFLRR
FBBFBFFRLL
BFFBBBBRLL
BFBFBBFLLR
FBBBBBBRLR
BFBBBBFRRR
FFBFFBFLLL
BFFFFFBRRL
BFFFBFFRLL
BFFFBFBLRL
FFBBBBFRLR
FBBBFFFLRR
BFFBFBBRRL
BBFFFFFRRR
FBBBFBBLLL
FFBFFFBLRR
FFBBFBBRLL
FBFBBFFLLL
BFFFBFFRLR
BFBBBBBLRL
FFFBFFBRRR
FFFBBFFLRL
FBFBFBBRLL
FFFBFBBRLL
FFBFBFBRLL
FBFFFBFRLL
BFFBFBFRRL
FBBFFFBRLR
BFBBBFFRRR
FBBBBBFLRL
FFFFFBBRRL
FBFFBBFLLL
BFBBFBBLRL
BFFBBFBLLL
FFBFBFFLLL
FFFBBBFLLL
BFFBFBFLLL
FBFFFFBRLR
FBFBBFBLRL
BBFFFBFRLR
FFFBBFBLRR
BFFBFFBRLL
BFFBBFBRLL
FBBFFFFRLR
FBBFFFBLLL
FFBFFFFRRL
FFFFBFFLLR
FFFBBFFRLL
BFBBBFBRLR
BFBFFFBLRR
BFFFBBFLRR
BFBFFBFRLL
BFBBFFBRRL
FFFFBBBLRR
FBFFFBBLRL
FFBBBFFRLL
FBBBFBBRLR
FFBFFBFRRR
FBFBFFFRRL
BFBBBFFRLR
FFFBBBFLRR
FFFFBBFRRL
FFBFBFBLRR
FFFBFFBLLL
FBFFFBBRRL
FFFFBFFRLR
FFBBBBBLRR
FFFFBFFRLL
FBFFBBBRRL
BFFFFBBLRL
FBFFBBBRLL
BBFFFFFLRL
FBFBBFFLRR
FBBBBFBRLL
BFFBFFFLLL
FBBBFFFRLR
BFBBFFBLRR
FFBBFBBLLL
FBBFFBBRRL
BFBFBFBLRR
FFFBBFBRRL
BBFFFBFLRR
FBBBBBBLLL
BFFFBFBRRR
FBFBFFFLLL
FFBBBBBLLL
BFBFBFFLLR
FBBFFBBLLL
FBBBBBBLRL
BBFFBBBRLR
FBFFFBBRLL
BFBFBBBRLL
BBFBFFBLLR
FFFBBFFRRR
FBFBFBBRRR
FBBFBFFRRR
BFBBBFBRLL
FBFBFFBLLR
BBFFBFBLLL
BFFFBBFRLL
FBFBFFFLLR
FBFFFFBRRR
FFBFBBFLRL
BBFFFBFLLL
FBBFBBBLLL
FBBBFBBRRL
FBFBFBFLLL
FFFFBFBLRL
FFFFFBBRRR
FFBFFBBLLR
BBFFFFFRRL
FBFBBBFLLR
BFBBBFFRRL
FBFBBFBRLR
BFBBBFBLRR
FFBFBFFLLR
FBFBFFBRRL
FFBFBFBRLR
BFBFFBBRLL
FFBFFFFRRR
BFFBBFBRRR
FFBBBBFRRL
FFFBBBBLRL
FFBBBFFRRL
BFBBBBFRLL
BFBFBFBLLL
BFBBFFFRRL
BFFBFFBLLR
FFBBBFBRLR
FFBBFBFRRL
FBFFBBBLRR
FBBFBBBLLR
BFBFFBBLLR
BFFFFBFLLL
FFFBFBFLLR
FBFFFFBLRR
FBBFBFBLLL
BFFFFBFRLR
FBBBFBFRLR
FFBBFBFRLR
BFFFFFFLLR
BFFFFBFRRL
BBFFBBFRRR
FBFFBFFLRL
FBBBBBFRLR
FBBBBFBLRL
BFFFBBBRRR
FFFFBFFRRL
FFBFFFFLLL
FFFBFBFRLL
FFBFFBFLRR
FBBFFBFLRL
FBBFFBBLRR
FFBFFBFRRL
BFFFFFFRRR
BFBFBBBRLR
BFFBFBBRLL
BBFFBFFRRL
FBBFBBFRLL
BFFFFFBRLR
BFBBBBFLLL
BFBBFFBRRR
FFFFBFBLLL
FFBBFFFRLR
BFBBBFBRRL
BFFFBBFRRR
FBFFFFFRRL
BFFBFFFRLL
BFFFFBBRLR
FFBBFFBLRR
BBFFBBBLRR
FBBFFFFRRL
BFFFFBBRLL
BFFFFFBRLL
BFBFFFFLLR
FBBBBBFRRL
FBFBBBBRRR
FBBFBBFRRL
FBBBFBBRLL
FBFFBFFLLR
FFBFFFFRLR
BFFFFFFRRL
BFBBFFFRLR
FFBBBBFLRL
FFBFFBBRLL
FFBBFBBLRL
FBFBFFBLRR
BFFBFBFRLR
FBFFBBBRRR
FBBBBFFLRL
FBBFBFFRRL
FFBFBFFLRL
BFFBBFBRLR
BBFFFFFLRR
FBBFFFBRLL
BFFFBFBRRL
FFBFBFFRLL
BBFFBBBRRR
BBFFFFBLRL
BBFFFBBRRR
BBFFFFBRLL
FBBFFBFLLL
BFFFBBBLRR
FFBFFBFLLR
FBBFBFFLLR
FBFBBFFLRL
FBBBBFBRRL
BFBBFBFLRR
BBFFBFBLRR
FFFBBBBLRR
FBBBFFBRLR
FBFBFBBLRR
FBBBFBBRRR
BFBBFFFLLL
BFFFFBBLLR
FBBBBBBRLL
FBBBFBBLRL
FBBBBBBRRR
FFFBBBFRLL
BBFFFFFLLL
FBBFFBFRLR
BFBBBBFLRL
BFFFFBFRRR
FBFFBBBLRL
BFBBFBBRRL
FBFFBFBLRL
FFFBBFBRRR
BFBFBBBRRR
BFBBFFFLRL
BBFFFBBRRL
FFFBBBBRRL
FBBBFFBLLR
FBFBFFFLRR
FBFBFBBRLR
BFFFBBFRRL
FBFBFBFRRR
FBBFFFFLLL
FBBFFBBLRL
FBBBFBFLRR
FFFBBFFLLL
BFFBFFBRRL
BFFFFBBRRR
FFFFFBBRLR
BBFFBBBLRL
FBBFBBFRRR
BFBBFBBLRR
FFBFFFFRLL
BFBFFFBRRL
FBBFBBBRLL
FBFBBFBRLL
FBFFFBFRRL
BFFBFFBLRR
FBBFBFBLRR
BFBBBBFLLR
BFBBBFBLLR
FFFFBFBRRL
FFFBBBBRLR
FFBFFFBRLR
BFFBFFBLRL
FBBFBFFLLL
BFFBFBBLLL
FBFBBFBLLR
FBBFFBFLRR
FFBBBBFLLR
FBBFBFFLRL
FFFBFBBLRL
FBBFFFFRLL
BFBFBBFRRR
FBFFBBBLLL
FFBFBBBLRL
BBFFBBFLLR
FBFFFBFLLL
BFBFBFBRRR
BFBBBBBRRL
BBFBFFBLLL
BFFFFFFLRL
FBBFFFBRRL
FFBBFBFRLL
BBFFBFFLLR
BBFBFFFRRL
FFFBBFBLLL
BFFBFFFRRL
BFBBBBBRLL
FFFBFBFRLR
FBFFBBFRRL
BFFBFFFLLR
FFBBFFFLLL
BFFBBBFRLL
FFBBBBFRLL
FFFFBFFLRR
FFBBBBBLRL
FBBBBBBLRR
FBBFFFBLLR
BBFFFBBRLL
BFFBBFFLRL
FFFBFBFRRR
FBFBFBBLLL
FBBBBBFRLL
FBBBBBBRRL
FBFBBBBRRL
FBFFBFFRRL
BFFFBBFLLR
BFFBFFFLRR
BFFBBFBLRR
FFFFBFBRLL
BFFBFFFLRL
FFBFFFBLRL
FBBFFFBLRR
BFBBBFFLRL
FBFFBBFLRL
BFFFBBBRLR
BFFBFBBRRR
BFFFFFBLRL
BBFBFFFLRL
BFBFBBFRRL
BBFFBFFLRR
FBFBFBBLRL
BFBFBBFRLR
FFFBBBBRRR
FBFFFFBLLR
FBFBBFFRLL
BFBFFBFRRR
FFFBFFBLLR
FBFBFBFLRL
FBBFBBBRLR
FFFBFBBLLR
FFBBFFFRLL
BFBFFBBRLR
BBFFFFBLLL
FFBBBFFRRR
BFFBFFFRLR
FFBFFBBLRL
FBBBFFBRRR
BFBFBBFRLL
BFBBBBFRRL
BFBBFFBRLL
BBFFFBBLRL
FFBBBBFRRR
BBFFFBFRRR
BFBFFFFLRR
FFFBFBBLRR
BFFBBFBRRL
FBBFBBBRRR
FBFBFFFLRL
BFBBFBFRLR
FFFBFFFLRL
FFBBBFBRRR
FBBFFBBRRR
BBFFFBBLLR
FFFBFFBLRL
FFBFBBBRRL
FFBBBFFLLR
FBFFBBFRLR
FBFFFBFLRL
FFBBFBBRRL
FFFBBFFRRL
FBBFBBFRLR
FBFBBFFRRR
FFFFBFFRRR
BFFFFFBLRR
BBFFFFBRRL
FBBBFFBLRR
BFFBFBFRLL
FFBFFFBRRL
FFBFBFBLLR

use crate::common::AdventOfCodeDay;

use std::u32;

#[derive(Debug)]
struct BoardingPass {
    row: u32,
    column: u32,
}

#[derive(Debug)]
pub struct Day05 {
    input: Vec<BoardingPass>,
}

impl BoardingPass {
    fn seat_id(&self) -> u32 { self.row * 8 + self.column }
}

fn parse_line(val: &str) -> BoardingPass {
    
    let sval = val.to_owned()
             .replace("F", "0")
             .replace("B", "1")
             .replace("R", "1")
             .replace("L", "0");

    BoardingPass {
        row:    u32::from_str_radix(&sval[0..7],  2).unwrap(),
        column: u32::from_str_radix(&sval[7..10], 2).unwrap(),
    }
} 

impl Day05 {
    pub fn new() -> Self {
        let input_bytes = include_bytes!("../res/05_input.txt");
        let input_str = String::from_utf8_lossy(input_bytes);
        
        let data = input_str
                        .lines()
                        .map(parse_line)
                        .collect::<Vec<BoardingPass>>();

        Self {
            input: data
        }
    }
}

impl AdventOfCodeDay for Day05 {

    fn task_1(&self) -> String {
        verboseln!("{:?}", self.input);
        return self.input.iter().map(|p| p.seat_id()).max().unwrap().to_string()
    }

    fn task_2(&self) -> String  {
        let min = self.input.iter().map(|p| p.seat_id() as u64).min().unwrap();
        let sum = self.input.iter().map(|p| p.seat_id() as u64 - min).sum::<u64>(); // sum of all pass numbers 

        let allsum = (self.input.len() * (self.input.len() + 1) / 2) as u64; // sum if all pass numbers are there

        let missing = (allsum - sum) + min; // diff = the _one_ missing number

        return missing.to_string()
    }
}
Result Part 1: 842
Result Part 2: 617


made with vanilla PHP and MySQL, no frameworks, no bootstrap, no unnecessary* javascript