From 29dee21cde28f9b4778d3d01f80121e133aca216 Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Fri, 4 Dec 2020 22:34:06 -0800 Subject: [PATCH] day 5 solution --- data/input-05.txt | 743 +++++++++++++++++++++++++++++++++++++++++++++ data/output-05.txt | 2 + src/day05.rs | 44 +++ src/main.rs | 2 + 4 files changed, 791 insertions(+) create mode 100644 data/input-05.txt create mode 100644 data/output-05.txt create mode 100644 src/day05.rs diff --git a/data/input-05.txt b/data/input-05.txt new file mode 100644 index 0000000..946fd8a --- /dev/null +++ b/data/input-05.txt @@ -0,0 +1,743 @@ +FBBFBFFRRL +BBFFBFBRRR +BFBBFFFLRR +FFBFFFBLLR +BFBBBBBRLR +FBFFFBFLRL +BFBBBBFLRR +FFBBBFBRRL +FBFBBFBLRL +BBFFFFBRRR +FBBBBBBRRR +FFBBFFBLLL +BBFFFFFRRR +BFFBFBFRLL +BFBFFFBRLR +FBBBFFFLRL +BFBFBBFLRL +BFFFBBBRRR +FBFFBBFRRL +BBFBFFFLLR +FBBFBBBRLL +BBFFBFBRLR +BFFFFFBRLL +BBFFFBBRRR +FBFFBBFRLL +FBBBBBFRRL +BBFBFFFLRL +BFBFBBBRLR +FBBFBBBRRR +BFBBBFFLLL +BFFFFFFLLL +BFBFFFBLRL +FBBFBBBLLR +BFFFBFBRLL +FFBFFBFLRL +FBFBFFBRLR +BBFFFBBLLR +BFFBFFFRRR +FBFFBBBLLL +BFBFFFFRLL +FBFBBFFRRL +BFBFBBBLLL +BFBFBFFRLR +FBBFBFFLRL +BFFFFBBLLR +FBBBFBBRRR +FBBBFFFLRR +FFBBBBFLRR +BFFFFFFRRL +BBFFFFFLRL +BFFBFBFRLR +FFBBBBBLLR +FBFFBFBRLL +BFBBFFBLRR +BFFFFBFLLR +FBBBBFFRLL +FBBBFFBLLR +BFFBBBFLLL +FFBFBBBLLL +BBFBFFFLRR +FBFBFFFLRL +BFFBBFFRRL +FBFBFBBLRR +FFBBFBBRLL +FFBBFBFRLL +BFFFBFBRRL +BFBBBBFRLL +BFFFBFBLLL +BFFFBBBLLL +FBBBBFBRRL +BFBBFFBRLL +BFBBFFFRLR +FFBBBBFLLL +FFBBFFBRLL +FFBFBFFLRR +FBBBFBBRRL +FFBFBBBLRR +BFBFFFFRRR +BFFBBFBRRR +BFFFFBBRLL +BFFFBBFRRR +BFFFBFBRLR +FFBBBFFRRR +BFFBFBFRRL +FFBBBBBRLR +FBBFBFBRRL +FFBBBBBLRL +FFBBFBBRRR +BFFBBBFLLR +FFBFBFFRRR +BFBBFFBRRL +BFBBFBBLLR +FBBBFFBRLR +BFFBBFFLLR +FBBFFBFRRR +FFBFFFBLRR +FFFBBBBRRL +FBBFBFBLLR +FBBBBFFRRR +FFFBBBBLRL +FBBBFFBRRL +BFBBFBFLRL +FBBFBBFRRL +FBBFBBFRLR +BBFFBBFRLL +BBFFFFBLLR +FFBFFBFLLL +FFBBFFBRRL +FBBFFFBLLL +FFFBBBBLLR +FBBBFFBLLL +FFBFBBFLLR +FBBFBBFLRL +BBFFBBFRLR +FBFBBBBRLR +BFBFBFFRRL +BFBBFBBLLL +FBFBBBBRRL +FFBFBFBRLL +BFFBBBFRRL +BFFBFFBRLR +FBFBBFBLRR +FFBBFFFLRL +BBFFFBBRLR +FFBBBFFLLR +FBFFFBBRRR +BFFBBFBRRL +BFBBFFFRLL +FBFBBFBRLR +FBBBBFFLLL +FFBBFBFLLR +BFFBBBFRLR +BFFFBBBRLL +BFBFBFBLRL +BFFFFFFRRR +FBFBFBBRRL +BFBFFBFRRL +FBFFFFFLRR +FFBBBBFRRL +FFBBBBBRRR +BFBFFBBRRL +BBFFFBFLRL +FBBBBFBRLR +BFBFFBFRRR +FFBBBFBRLL +FFBFFBBLLL +BFBBBFBLRL +BFFBBBBLLR +FFBFBBFRLL +BFFFBBBLRR +BBFBFFFRRL +BBFFBFFRLL +BFBBFBFRRR +FFBFBFBLRL +BFBBFFBLLR +FBBFBFBRLR +FFBBBFBRLR +FBFBBBFLRL +FBFBBFFLRR +FBBBFBBRLR +FBFBBBFRRL +BFFBBFBLRR +FFFBBFBLLL +BFBFFBFLRL +FBBBBFFLLR +FBFFFFFRRR +FBFBFBFLLL +BFBBFFFRRR +BFBBBFBLRR +BFBBFBFRLR +FFBFFBFRLL +BFBFBBFRRR +BFBFFBFRLL +BBFFBBBLLR +FBFFBFBRLR +FBBBFBFLRL +BBFFBBFLLR +BFBBBFFLRR +FBBBFFFLLL +FFBBFBFRRL +FBFFBBFLLR +FFBFFBBLRL +FFBFBFBLLR +FFFBBFFLLL +BFBBFBBRRL +BFBFBFBRLL +BFFBFFFRLR +BFFFBBFLLR +FBFFFFFLLR +FBFFFFBLLR +FFFBBBFLRL +FFBBFBBLRL +FFBFBBBRRL +FBBFBFBRRR +BFFFFFBLLL +BFBFBBBLRL +BFFFFFBRRR +FFBFBFFRLL +BFFBFFBLLR +BFFBFFFLLL +BFBBBFFRLR +BFBBBBBLLR +FBFBFBBRLR +BFFFBBBRLR +FFFBBBFRLL +BFBBBBBLLL +FBBFFBBLLR +BFBFFBBLLL +FBFBBBBRRR +FFBBFFFLLR +BFFBFFBLRR +BFFFFBFLRR +FFBFFFBLLL +FFBFBBFRRL +FBBFFFFLRR +FBFBFBBRLL +BFFBFBFLRR +BFFBBFBRLR +BFFBFBBLRR +BFFFBBBLLR +FBFBFFBRRL +BFBBBFFRRR +BFBFFBBRLR +FBFFBBFLRR +FFFBBFFRRR +BBFFBFFLRL +FBFBBFBRRR +FBFFFFBRLR +FFBFFFFRLL +FBBBFFBLRL +FBBBBBBLLR +BFFFBFBRRR +FBBBBBFLLR +BFFBFBBLLL +FBBBFBFRRR +FBBBFBFLLR +FFBFBFFLRL +BFFFBFBLRR +FFFBFBBRRR +BFBFBBFRLL +FFBFBBBRLR +BFBFBFFLRL +FFBBFFBRRR +BFBBFBBRLL +FBFBBBFLLL +BFBFFBFRLR +FBBFBFFRLR +BFFFFFFRLL +BFFFFFBLRL +FBBFBBFRRR +FBBFBBFRLL +FBFBFFFRLR +FFBFFBFLLR +FBBBFFFLLR +BFBBBBBLRR +FBFBBFFLLL +FFFBBBBLRR +FBBBBBBLRL +FFBFFBBLRR +FBBFFFFRRR +BFBFBBFRLR +FFBFBBFLRL +BFBBFFFLLL +BFBBBBFRRL +FBBBFBFRRL +FBFFBBBRLL +FFBBFFFRLL +FBFBBBBLRR +FFBBBBFRLR +FBFBBFFLRL +FFBBFFBRLR +FBBBFBFLRR +FBFFFBFRLR +FFBBBFFLLL +FBFFBBFLRL +FFBFFBFLRR +FBFFBFFLLR +FFFBBFFLRR +FBBFFBBRRL +BFBBBFBRRR +BBFFBBBRRR +BFFFBBFLRL +FBFBFFBLRL +FBBFFBFLLL +BFFBBBFRRR +BFFFBFFRRL +FBFFFBFRRR +FFBBFFBLRL +BBFFFFBRLR +FBFBBFBLLR +FFBFFBFRLR +BFBBFBFRLL +FFBBFBFRRR +BBFFBFBLLL +FBBFBBBLLL +FBBFFBFLRL +FBFFFBFRRL +FBBBFBBLRR +FBBFFFFRRL +FBBBBBFLRR +FFBBFFFLLL +BFBBBFBRLL +FBFFFFBRLL +BFBFBBFLLR +FFBBBFFLRL +FBBFBBBRLR +BFBFBFFLLR +BFFBBFBRLL +FFFBBFFRRL +FFBFFFFLRR +BFFFFBFRLR +FBFFFBBLLL +FFBFBFFRRL +FBFFFBBLRR +FBFFBFFRLR +FBBFBBBRRL +FBFFBFBRRL +FBFFFBFLLL +BFFBFFBRLL +BFFBBFBLLL +BFFFFBBRRR +FBFFFFBLLL +FBBFBFFLRR +FFFBBBFRRR +BBFFFFFLLL +BFFBFBBLRL +BBFFFBBLRR +FBFFBFBLLL +BFBFFFBLLL +BBFFBBFRRR +FFBBFBBRRL +FBBBBBBRRL +FBFFFBFLLR +BBFBFFFLLL +BFFBBBBRRR +FBBFFBBRRR +FBBBBFFRLR +FBBFBBFLRR +FBBFFFFRLR +BFBBBBFRLR +FBFBFFBRLL +BFFBFFFLLR +FBFFBFBLLR +FFFBBBFRLR +FBBBFFBRRR +BFFBBBBLRL +BFFFFBBLLL +BFFBBFFLRR +BFFBFFFLRL +FBBFBBBLRR +FFFBBFBLRR +FFBBBFBLRR +FBFFFBBLRL +FBFFBFFRRL +FFBFBFFLLL +FFBBBBBLRR +FFBBFBFLLL +FBFBFBFRLL +BFFBBBFLRR +FFBFBFBRRR +FBBFFFBLRL +FBBBFFBLRR +BFBBBBFLRL +BFBBFBFRRL +FFBBBFFRLL +BBFFFFFRLL +BBFFFBBRRL +FBBBFBBLLR +FBBBBBBLRR +FFBBFBFRLR +FFBFFBFRRL +FBBBBBFLRL +BFBFBFBRRR +BBFFBBFLLL +BFFFBBFRLL +FBFBBBBLRL +BFFFBFFLRL +FBBBFFFRRR +BFFFFBFLLL +BFFBBBFRLL +FBFFFBBRLL +FBFBFFBLLL +FBBBBFBLRL +FBBFBFFRRR +FFFBBBBLLL +FFBFBFBRLR +BFBFBFBRRL +BFBFBBBLRR +FBFFFFFRLL +BFBBBBBRRL +FBBFFFFLLR +FBBBBFBLLR +FBBFFFFLRL +FBBFBFBLLL +BFFFFBBLRR +FBBBBFFLRR +BBFFFBFRRR +FBFBBBFRLL +BFFFFFBRRL +BFFFFFFLRR +FFBFFFBRLL +FBFFBFFLLL +BFBBFFBRRR +BFBBFBFLRR +BFBBFFBLLL +FBBFFBFRLL +BFBFBBFLRR +FFBFFFFRLR +FBFBBFBRLL +FBFFBBBLRR +FBBFBFBLRL +FBFFBFBLRL +FFBFFFFRRR +BFFBBBBLLL +BFFBFFFRRL +BFBFBBBRRL +BBFFFBFLLL +FBBBFFBRLL +BFFFFFFRLR +FFFBBFBLRL +BFBFBFBLLR +FBFBFFFRRR +FBFBFFBRRR +BBFFFFBLRR +BFBBBBFLLR +FBFBFBFLRR +FBBBBBFRLR +BFFFBBFLRR +BBFFBFBLRL +BBFFFFFLRR +FBFBFBFLLR +FFFBBBBRRR +BFFBBFFLLL +FBBFBBBLRL +BFFFBFFLRR +BFBBBFBRLR +FFBBFBBLLL +BBFFBBBLLL +BFFFBFBLLR +FFBBBFBRRR +BBFFFFFRLR +FFBBBFFRRL +FFBBFFBLLR +FBBFBFFLLL +FBBFFBBLLL +BFFBFBBRLR +FFBBFFFLRR +BFFBFBBLLR +FFBFFBBRRL +FFBFBBBLLR +BFFFBBFLLL +FBBFFBFRLR +BFFFBFFRRR +FFFBBFFLLR +FBFBBBFRRR +BFFFFFBLRR +FFBBFFFRRL +FFBFBBBLRL +FBBFFBFLRR +BFFFFBBRLR +FFBBBFBLLR +FFFBBFBRLR +BBFBFFFRLL +FBFFBFFRLL +FBBBBFBRLL +BBFFFBBLRL +BFFBFFFRLL +FBFFFFFRRL +BBFFBBBRLR +BBFFFFFRRL +BBFFBBBRLL +BFFBFFBRRR +BFBBFFFLLR +BFFFBBFRLR +FBBBFBFLLL +BFBBFBBRLR +FBBBFBBLLL +BFBFBBBRLL +BBFFFBFLLR +BFBBFFFLRL +FFBFBBFRRR +FFBBBBBRRL +BBFFBBFLRR +FBFBBBFLRR +FFBFFBBRRR +FBBFFFBRLR +BFBBBFFRRL +FBFBFBFRLR +FBBBBFBRRR +FBBFFBBLRL +BBFFFFBLRL +FFFBBBBRLR +FBFBBFFRLR +BFBFFBBLLR +BFFFFBBRRL +BFBFFFBRLL +FBFFBFBRRR +FFBBFBBLLR +BFFBBFFRRR +FBFFFBBLLR +FBFBBFBRRL +FFBFFFFLLL +BFFBBBBRLR +BFFBBFBLRL +BFFBFBBRRL +FFBFFBBLLR +FBBFFFBRRL +BFBFFBBRLL +FBFFFFBRRR +BFFFFFFLLR +FBFFBBFLLL +FFFBBFBRLL +BFBFFBFLLL +BFBBFBBLRL +BFFFBFFLLR +FBFFFBBRRL +BBFFFFBRLL +FFBBBBBRLL +FBFBFBFRRR +BBFFBBFLRL +FBBBBFBLLL +BFBFBFFRRR +FFBFBFFRLR +BBFFBFBLRR +BFBFFFFLRL +BFFFBBFRRL +FFBFBBBRRR +FBFFFBFRLL +BFFFFBFRRR +BFBFBFFRLL +FBBBFBFRLR +BFFFFFBLLR +BFBBBFBRRL +BFFBBFFRLR +FBBBFBBLRL +BFFFBFFRLR +BBFFFBFRLR +BFFFBFFRLL +FBBBBFFRRL +BBFFBBFRRL +BBFFBFFRRR +BBFFBFFRRL +FBBBBFBLRR +BBFFFBBRLL +FBBFBFBLRR +BFFBBFFLRL +BFBBBFBLLL +BBFFBFBRLL +FFBFFFBRLR +BBFFBBBLRL +FFBBFBBLRR +FFBBBFBLLL +BFFBFFFLRR +FFBFBFFLLR +FFBFFBBRLL +BFBBBBBLRL +BBFFFBFLRR +BFBFBFFLRR +BFFBFBFLLL +FFBFFFFRRL +FFBBBBFRLL +FBFBFBBLRL +BBFFFBFRRL +FFBFFBFRRR +FBBFFBBRLR +FBBFBFBRLL +BFBFBFBRLR +BFFBFFBLRL +BFBBFFBRLR +FBFBFFFLLR +BFFFFFFLRL +FBBFBBFLLL +FFBBBFBLRL +BFBFBBFLLL +BBFFFBFRLL +FBFBFFBLRR +FBBBFFFRLR +BFBBBFFLRL +FFBBFFBLRR +BBFFBFFLLR +FBFFBFFRRR +FBFFBBBRLR +BFBFBFBLRR +BFFBBBBRLL +FBFFFFBLRL +FBBFBFFLLR +FBFBFFFLRR +FBBBBBBRLL +FBFFBBBRRR +FBBFFBBLRR +BFFFBFBLRL +FBBFFFFRLL +BFBFFBBRRR +BBFFBBBLRR +BFBFFFBLLR +FBFBFBBRRR +FFFBBBFLLR +BFBFFFFLLL +FBFFBBBLRL +FBFBFBBLLL +FFBFFFFLRL +FBFBBBBLLR +FBFBFBFLRL +FBBBFBFRLL +FBFBFFFRRL +BBFFBBBRRL +BBFFFFBLLL +FBFFBBBRRL +BFBFFFBRRL +BBFFFFBRRL +BFBFFBBLRR +BFFBFFBRRL +FFBFBFBRRL +FFFBBFBRRR +BBFFFBBLLL +FBFBBFFRLL +BFFFBFFLLL +BFFBFBFLRL +FBBBBBFRLL +FBFBBBFLLR +FFBBFFFRRR +FBBBBBBLLL +BFBFBBFRRL +FBFBFBFRRL +BFBFFFFRLR +FFFBBFFRLR +FFBBBFFRLR +FFFBBFBRRL +FBFFFFFRLR +FBFFBBFRLR +FFBFFFBLRL +BFBFFFFLRR +FFBFFFFLLR +FFBBFFFRLR +BFBFFFBLRR +FBBBBBFRRR +BFFBBBBRRL +FFFBBFFLRL +FBFFBFBLRR +FBBFFBFRRL +FBBFBFFRLL +FFBFBBBRLL +BFFFBBBLRL +BFFBFBBRRR +FBBBBBBRLR +BFBFBBBRRR +BBFFBFFRLR +FBBBFFFRRL +FFBBBBFRRR +BFBBBFBLLR +FFFBBBFRRL +FFFBBBBRLL +FBBBFBBRLL +BFFFFFBRLR +BFBFBBBLLR +BFBFFBBLRL +FBBFFFBRRR +BFBBFBBLRR +FBBFFBFLLR +FBFBBBBRLL +BFFBBFFRLL +FFBBFBBRLR +BFBFFBFLLR +BFBBBFFLLR +FBBFBBFLLR +BFBBFBFLLR +BFFBFBFRRR +BFBFBFBLLL +FBFFFFFLLL +FFBFFFBRRL +FBFFBBFRRR +BBFFBFBRRL +FBFFBFFLRR +FBFBBFFRRR +BFFFBBBRRL +BFBFBFFLLL +BFBFFFFLLR +FBBBBBFLLL +FFBFFBBRLR +FFBBBBBLLL +BFFBBBFLRL +FFBBFBFLRL +FFFBBBFLLL +BFFFFBFLRL +FBBFFFBLLR +FBFBBBFRLR +BBFFBFBLLR +BFBBBBFRRR +FBFBFFFRLL +FBFBBFBLLL +FBFBFFFLLL +FFBFBBFLLL +BFBFFFFRRL +FFFBBFBLLR +BFFBBFBLLR +FFBFBFBLLL +FBFBBFFLLR +FFBFBFBLRR +BFFBFBFLLR +BFBBBBBRRR +FBBFFFBLRR +FBBFFFFLLL +FFBBFBFLRR +BBFFFFFLLR +BFBBFBFLLL +BFFFFBBLRL +FBFFFFBLRR +FFBBBFFLRR +FFFBBFFRLL +BFFBBBBLRR +FBFFBBBLLR +FFBFFFBRRR +FBFFFFFLRL +BFFFFBFRRL +BFFFFBFRLL +BFBFFBFLRR +BFBBBFFRLL +BFBBFBBRRR +BBFBFFFRLR +BBFFBFFLRR +FFBFBBFRLR +BFBBBBFLLL +FBFFFBBRLR +BFBBBBBRLL +BBFFBFFLLL +FBFFBFFLRL +FBFBFBBLLR +BFFBFFBLLL +FFBBBBFLRL +FBFBFFBLLR +FFFBBBFLRR +FBBBFFFRLL +BFFBFBBRLL +FFBFBBFLRR +BFBBFFFRRL +FFBBBBFLLR +FBBFFFBRLL +FBFBBBBLLL +FBFFFBFLRR +FBBBBFFLRL +BFBFFFBRRR +FBBFFBBRLL +FBFFFFBRRL diff --git a/data/output-05.txt b/data/output-05.txt new file mode 100644 index 0000000..ec26dc8 --- /dev/null +++ b/data/output-05.txt @@ -0,0 +1,2 @@ +838 +714 diff --git a/src/day05.rs b/src/day05.rs new file mode 100644 index 0000000..8998d76 --- /dev/null +++ b/src/day05.rs @@ -0,0 +1,44 @@ +// ==== day 5 + +use crate::utils; +use anyhow::Result; + +fn seat_code_to_usize(code: &str) -> usize { + assert_eq!(code.len(), 10); + let bincode = str::replace(code, "B", "1"); + let bincode = str::replace(&bincode, "F", "0"); + let bincode = str::replace(&bincode, "R", "1"); + let bincode = str::replace(&bincode, "L", "0"); + usize::from_str_radix(&bincode, 2).unwrap() +} + +fn usize_to_seat_id(x: usize) -> usize { + ((x >> 3) * 8) + (x & 0b111) +} + +pub fn run() -> Result<(usize, usize)> { + let data = utils::read_file("data/input-05.txt")?; + let answers = utils::read_i64s("data/output-05.txt")?; + + // compute all seats (as integers) + let mut seat_ints: Vec = data.lines().map(|code| seat_code_to_usize(code)).collect(); + seat_ints.sort_unstable(); + + // find the seat with the highest seat code + let p1 = usize_to_seat_id(*seat_ints.last().unwrap()); + + // find the empty seat + let mut empty = 0; + for i in 0..seat_ints.len() - 1 { + if seat_ints[i] + 2 == seat_ints[i + 1] { + empty = seat_ints[i] + 1; + break; + } + } + let p2 = usize_to_seat_id(empty); + + assert_eq!(p1, answers[0] as usize); + assert_eq!(p2, answers[1] as usize); + + Ok((p1, p2)) +} diff --git a/src/main.rs b/src/main.rs index 49e62a5..c39635e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ mod day01; mod day02; mod day03; mod day04; +mod day05; mod utils; // TODO @@ -18,5 +19,6 @@ fn main() -> Result<()> { println!("Day 02: {:?}", day02::run()?); println!("Day 03: {:?}", day03::run()?); println!("Day 04: {:?}", day04::run()?); + println!("Day 05: {:?}", day05::run()?); Ok(()) }