diff options
-rw-r--r-- | 2020/day-05/README.org | 174 | ||||
-rwxr-xr-x | 2020/day-05/day-05.raku | 54 | ||||
-rw-r--r-- | 2020/day-05/input | 837 |
3 files changed, 1065 insertions, 0 deletions
diff --git a/2020/day-05/README.org b/2020/day-05/README.org new file mode 100644 index 0000000..685327a --- /dev/null +++ b/2020/day-05/README.org @@ -0,0 +1,174 @@ +#+SETUPFILE: ~/.emacs.d/org-templates/level-3.org +#+HTML_LINK_UP: ../../index.html#2020 +#+OPTIONS: toc:1 +#+EXPORT_FILE_NAME: index +#+TITLE: Day 05 - Binary Boarding + +* Puzzle +- This puzzle is taken from: https://adventofcode.com/2020/day/5 + +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 2 +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? +* Solution +=pass-seat= is a subroutine that returns the seat row, column from it's +boarding pass. =seat-id= is a subroutine that returns the seat id from +it's row & column number. + +=pass-seat= works by matching first seven characters which relate to the +rows & then it combs over those characters to pin down on the row of +this specific boarding pass. Same process is repeated to find the column +number. +#+BEGIN_SRC raku +# seat-id returns the seat id from row & column number. +sub seat-id ( + Int $row, Int $column --> Int # seat id will be an integer. +) { + return ($row.Int * 8) + $column[0].Int; +} + +# pass-seat returns the seat row, column from boarding pass. +sub pass-seat ( + Str $pass --> List # row, column will be List of Int. +) { + if $pass ~~ /^(<[F B]> ** 7) (<[L R]> ** 3)$/ -> $match { + my @rows = [0..127]; + my @columns = [0..7]; + + for $match[0].comb -> $char { + @rows = @rows[0 .. * / 2 - 1] if $char eq 'F'; + @rows = @rows[* / 2 .. *] if $char eq 'B'; + } + + for $match[1].comb -> $char { + @columns = @columns[0 .. * / 2 - 1] if $char eq 'L'; + @columns = @columns[* / 2 .. *] if $char eq 'R'; + } + + return @rows[0].Int, @columns[0].Int; + } +} +#+END_SRC + +All boarding pass IDs are stored in =@ids= & it's sorted. For part 1 we +just print the last index of =@ids= which should give us the highest ID. +#+BEGIN_SRC raku +# Get all boarding passes. +my @passes = "input".IO.lines; +my @ids; + +for @passes -> $pass { + my ($row, $column) = pass-seat($pass); + push @ids, seat-id($row, $column); +} +@ids = @ids.sort; + +if $part == 1 { + say "Part $part: " ~ @ids[*-1]; +} elsif $part == 2 { + ... +} +#+END_SRC +** Part 2 +For part 2 we iterate over =@ids= except the last index which is skipped. +According to the puzzle, the seat IDs next to ours will be filled. So we +check if the next index of =@ids= is current =$id + 2=. If it is then there +is an empty seat between these two IDs & that must be our seat. +#+BEGIN_SRC raku +for @ids.kv -> $key, $id { + next if $key == @ids.elems - 1; + next unless @ids[$key + 1] == $id + 2; + say "Part $part: " ~ $id + 1; +} +#+END_SRC +* Other solution +While solving for Part 2, I encountered an error. It was giving me wrong +solution. I ran someone else's code against my input & found that the +solution was off by 1. Turns out I forgot to add 1 to =$id=, I was +printing =$id= initially. + +The solution was beautiful & clever, it was [[https://github.com/ggoebel][ggoebel]]'s solution in +[[https://github.com/codesections/advent-of-raku-2020/blob/main/ggoebel/05.raku][advent-of-raku-2020]] repository. I'll share the relevant parts here, it's +licensed under the *Artistic License 2.0*. +#+BEGIN_SRC raku +given $part { + when 1 { + say $input.lines.map({ seat_id($_) }).max; + } + when 2 { + my @vacant = ( (0..1023) (-) $input.lines.map({ seat_id($_) }) ).keys; + say @vacant.grep({ !( $_+1 ~~ any @vacant ) and !( $_-1 ~~ any @vacant) })[0]; + } +} + +sub seat_id (Str $code --> Int) { + return +('0b' ~ $code.trans(<F B R L> => <0 1 1 0>)); +} +#+END_SRC diff --git a/2020/day-05/day-05.raku b/2020/day-05/day-05.raku new file mode 100755 index 0000000..303edd7 --- /dev/null +++ b/2020/day-05/day-05.raku @@ -0,0 +1,54 @@ +#!/usr/bin/env raku + +sub MAIN ( + Int $part where * == 1|2 = 1 #= part to run (1 or 2) +) { + # Get all boarding passes. + my @passes = "input".IO.lines; + my @ids; + + for @passes -> $pass { + my ($row, $column) = pass-seat($pass); + push @ids, seat-id($row, $column); + } + @ids = @ids.sort; + + if $part == 1 { + say "Part $part: " ~ @ids[*-1]; + } elsif $part == 2 { + for @ids.kv -> $key, $id { + next if $key == @ids.elems - 1; + next unless @ids[$key + 1] == $id + 2; + say "Part $part: " ~ $id + 1; + } + } +} + +# seat-id returns the seat id from row & column number. +sub seat-id ( + Int $row, Int $column --> Int # seat id will be an integer. +) { + return ($row.Int * 8) + $column[0].Int; +} + +# pass-seat returns the seat row, column from boarding pass. +sub pass-seat ( + Str $pass --> List # row, column will be List of Int. +) { + if $pass ~~ /^(<[F B]> ** 7) (<[L R]> ** 3)$/ -> $match { + my @rows = [0..127]; + my @columns = [0..7]; + + for $match[0].comb -> $char { + @rows = @rows[0 .. * / 2 - 1] if $char eq 'F'; + @rows = @rows[* / 2 .. *] if $char eq 'B'; + } + + for $match[1].comb -> $char { + @columns = @columns[0 .. * / 2 - 1] if $char eq 'L'; + @columns = @columns[* / 2 .. *] if $char eq 'R'; + } + + return @rows[0].Int, @columns[0].Int; + } +} diff --git a/2020/day-05/input b/2020/day-05/input new file mode 100644 index 0000000..30f47a7 --- /dev/null +++ b/2020/day-05/input @@ -0,0 +1,837 @@ +BFBFFFBLRL +FFBFFBFRLR +BBBFFBBRLL +FBFFBBFLRL +BFBBFFFLRR +BFBBFBFRRL +BFFBBBFRRL +BFBBFFBRRL +FFFBFBBLRR +FBBBBBBLRL +FFBBFFBRLR +FFBBFBBRLL +FBFFBFFLRL +FBFBFFBRRR +FBFBBFBRLR +FFBBFBFLRR +BFBBBBFLRL +BFFFFFFLRR +BBFFFBBRLR +BFBFBFBLRR +FFBBFFBRRR +BBFBBFBRLR +FBBFFBFRLR +FBFFFBFLRL +BFFFBFBLRR +BFFFFBFRLR +FBBFFFFRRL +BFFBBBBRRR +FBFBFFFLLR +BBBFFBFRRR +FBFBFBBLRL +FBFBBBFRLL +FBBFBFFLRL +BBBFFBFRLR +FFBBBBFLLR +BFFFBBFRLR +FFBBBFFRRR +BFFFBFFLRL +BFFBBFFRRL +FBFBFFFRLR +BBFBFBBRRL +FFBBBBFRRR +FBBBBFFRRL +FBFFFBFRRR +FBFFFBFLLR +FFBBFBBLLR +BFBFBFFLRR +FBBFBFBRRR +BBFBFFFRRL +BFFBFFBLLR +FBFBFBFRLR +BFFBBBFRRR +FBBFFFBLRL +BBFBFFBRLR +BFBBFBBRRR +FBFBFBBLRR +BBFFFBFRLR +FFBFBBFRLL +BBFFBFBRLR +FBFBFFBRRL +BFFBFBFLLR +BBBFFFBLRR +BFBBBFBRLR +BBFFFFFRRR +BFFBFFFRLL +FBBFBFBLRL +BBFFBBFLRR +BFBBFFBLRL +FFFBBFBLLR +FFBFBFBLLR +FFFBBFFRLR +BFFFFBFLLL +FFBBBBBLLR +BFFFBBFRLL +FBFBBFBRLL +BFFBBFBLRL +FBBBBFFRLL +BFBBBFFLRR +BBFBBFFRLL +FFFBBFFRRR +BBFBBFBRRR +BBFFFBFRLL +BFFBFBFLRL +FBBFBFFLRR +BBFFBBBRLR +FFFBBFBRLL +BFFBFFFLLR +FFBBBBFRLL +FFBBFFBLLR +BFFFFBBLLR +BBFBBBBRRL +BBFFBFBLRL +FFBBFBBLLL +BBFFBFFRLR +BFFFBFBRLR +BFFBBBBLLL +BFFBFFFRRR +BBFFFBBRLL +FBBBFFBLRR +FFBFFBBRLL +BFFFFFBLRL +FBFBFBFRRR +BBFFBBBLLL +BFBFBFBRRR +FBBBFFBLRL +BBBFFBFLRR +BBFFBBBRRR +FBFFFFBRLL +FBFBFBFRRL +BFBBBFFRLR +FBFFFFBRRL +BBBFBFFLLL +FFBFBFBRLL +BFBBFFFLLL +BBBFFFFLLL +BBFFFBFRRR +FFBBBBFLRL +FBFFBBFLRR +BBFBFBBRLL +BFBFBBBLRL +FFBFBBFLLR +BFFFFFBRRL +BFFBFBBRLR +BFBFFFFRLL +BFBBFFFRRL +FBBFFFFRLL +BBFBFBBLLR +FFBBBFBLRL +FBBFFFBRRL +FFBBFBBLRL +BFBFFBBLLR +BBFBFFFLLR +BBBFFFFRLR +BFBBFBFRLR +BFBBFFBRRR +BBFFBBFRRL +BBFBFFBRRL +BFFBFBFRLR +BBFBFBBRLR +FFBFBFFRRL +BFBBFBFLLL +BBFBFFFLRL +BFBBBBFLLR +BFFFFBBRRL +BBFFFFBRRL +BFFBBFBRRR +BFFBBFBLLR +BBFBBBBRLL +FBBFBFFRRR +FBFFFFBLLR +BFBFFBFRLL +FFBFFBBRRR +BFFFBFBRRR +BBBFFFBLLL +BBFFFBBRRR +FBBFFBBLLL +FBFFBBBRLL +BBFBFFFRLR +FBFFFBBRLR +FFBBBFBLLL +BFFFFBFLRR +FFFBBFBRLR +BBFFFFBLRR +FBFFBFBRRR +FBBFBBFLRL +BFBBFFBLLR +BBBFFBFLLR +BFBFFBBRRL +BFFBFBFRRL +BFFFFBFRRR +BBBFFBBRRL +FBBFFFBRRR +BFBFBFFLLL +FFBBFBFLLR +FFBFFBFLRL +BFBFFBFRRR +FBFBBBFLRL +FFFBFBBRLL +BBFBFFBRRR +FBBFBFFRRL +BBFFBFFLRR +BFBFFBBLRL +BBFFBFFLLL +BFFFBBBRRR +BBFBBBBLLL +FBBFBBBRRL +BBFBBBFLLL +BFFBFFFRRL +BFBFFFBRLR +FFBBBBFLLL +BFBFFFFRRR +FFBFBFBLRR +FBFFBFBLRL +BBFFFFBLLL +BFBBFFFLLR +FBBBBFFLLL +BFFBFBFRLL +BBBFFFBLRL +BBFBBFFLLL +FBFBFBBRRR +BBFBFFFRRR +BFBBBFBRRR +FBFFBFFRRL +FBFBBFFRRR +BFFFBBFLLR +FBFFBFBLLL +BFFFFBBLRL +FBFFFFFRRR +BFFFBFFRLR +BBFFBFFLRL +FBFFBBBLRR +FBFBFFFLRR +FFBFBFBRLR +FBFBFFFRRR +FFBFFFFLLR +BFBFFBFLRR +BFBBFBBLLL +BFFBBBFLRL +BFFBFBBLRL +BBFFBBBRLL +BFBFFFBLLL +FFFBBBBLRL +FFBFFBBLLR +BFBBBBBLRL +BFFBBFFRRR +BBFFBBFRLL +FBBBBBFLLL +BFFFBFFLRR +BFBBFFBLRR +FBFBBFFRLR +FFFBFBBRLR +BBFBFFBLRL +FFFBBBBLLR +FBBFFFBRLR +BBFBBFFLLR +FBFBFBFLLL +BFBBFFBRLL +BFBFFBFLRL +BBBFFFFRRL +BFBFFBFRRL +BBFBBBFLRL +BBFBBBBLLR +FFBFFBFRLL +FBBBFBFLLL +BBBFFFBRLR +BBFFBFFRRL +BBFBBBBRLR +BBBFFBBRRR +FBBFBFFLLR +BFBBFBFLRL +FBFBBBFRRL +BFFFBBBLRL +BBFBFBBLLL +FFFBBBBRRR +FBBBFFBRLR +FBBBFBBRLL +FBBBFFFLRL +BFFFBBBLLR +FFFBBFFLRR +BFBFBFBLLL +FFBFFBBLLL +FBBFFBFRLL +FFFBBFFRRL +BFFFBBFLRR +FBFBBBBLRL +FFBBBFFRLR +BBFBFFFLRR +BFBFBBFLLL +BFFFFFBLRR +BFBBFBFRLL +BBFFFFFLRR +BBFBBBFLRR +BFBBBBBRLL +FBBFBFFRLR +FBFBBBBLRR +FFBFBBFRLR +BFFFBBBRRL +BBFBBBBRRR +BFBBBBBRRR +BFFBFFBLRL +FFBFBFBRRL +FBBBBBBRLR +FFBFBFFRLL +FFBFFFBLRR +FFBBFFFRRR +FFBBBFBRRL +BFFFBFFRRL +BFBBFBBRLL +FFBFFBFLLL +FBBBBFBLLR +FBBBFBBLLR +FFFBFBBRRR +FBBBBFBLLL +FFBFBBFRRR +BFBBBFFRRR +FBBFBFBRLR +BFFFFBBRLR +FFBBBFBRLL +BFBFFFFLRL +BFBBFBBLLR +BFFFFFFRLL +FFFBBBBLLL +FBFFBFFLRR +FFBBFFFRRL +FFFBBBFRLL +BFBFFBFLLL +BBFBBFFLRL +BFFBBBBRLR +BBFBBFFLRR +BFFFBBBRLR +FFBBFFBLRR +BBFBBFBLLL +BFFBBFBRLL +FBFBBFFLLL +FBFBBFBLRR +BBFFBFFLLR +BFBBBBFRLL +FFBBFFBLRL +BBFBFBBLRR +BFBFFBBLRR +BFBFBBFRRL +BFFBBBBRRL +BFFBFFBRLR +BFFBFFFRLR +FBFBFFBRLL +FFBFFFBLRL +BFFFBBFLRL +FBBBFFBLLR +BFFBFFFLRR +BBBFFBBLLR +BBFBBFBLRR +FBBFFBFLLL +FFBBBBFRLR +BFFFBFBRLL +BFFBBBBLRL +FBBBBBBLLR +FFBBFBFLLL +FBBFBFBRLL +BFFFFBBLLL +FBFBFFFLLL +FBBBBFFLRR +FBFBBFBRRL +BFFBFFFLLL +BBFFFFBLLR +BFFBFBBRRR +BFBBBBBLLL +FBBBBBFRLR +FFFBBFFLLL +BBBFFFFLRR +FBBFFBBRRL +FFFBBFBRRR +FBFBBFFRRL +FBBFFBFRRR +FBBBBBBRRR +FBFBBBBRLL +FBBFBFBLLR +FBBBFFFLLR +FFBFFFFRLL +FBBBBFBRRL +BFFFFBFLRL +BBFFBBBLRR +BFBFFFBRRR +BFBFFBBRRR +FFBFFBBRRL +FBBBFBBRLR +FBBBBBBLLL +BFBBBBFRLR +BFBBFFFRLR +FBBBFBFRRL +BFFFBFBLRL +BFFFBFBLLR +FBFBFFBLLL +FBBFBFBRRL +BFBFFFFLLR +BBFBBBFRRL +BBFBFBFRRL +BFBFBBFRLL +FBBFBBBLRL +FBBBFBBRRL +FBBBFFBRLL +BFBFBBBRRR +BFBFBFFRLL +FBFBBBFLLR +FBFFBBBRRL +BFFBBBBRLL +BBFFBFFRLL +FFBFBFBRRR +BFBFBFFLLR +FBFFBBBRRR +FBBFBBFRRL +BFBFFFBLRR +BFFBFBBLRR +BBFBBBBLRR +FBFFFBFLRR +BFBBBFFRLL +BFFFFFFLLL +BBFFBFBLLR +FBBFBBFLLL +FBFBFBFLLR +FBFFFBFLLL +BBFFBFBLLL +BFFBFFBLRR +BFFFFBBRLL +BBFFBBFRLR +BBBFFBBLLL +BBFBBBFLLR +BBFBBBBLRL +BFFBBFFLLL +BFFFFBBLRR +BFBFBBFLLR +FFBFBFBLRL +FFBBFFFLRL +FFBBFBBRRL +FBBFFFFRRR +BFBFFFFLLL +BBFFFFFRLL +BBFFBBFLLL +FBFBBBFLLL +FFFBBBFRRR +BFBFBBFRRR +FFBBBBBRRL +FFBFBBFLLL +BFBFBFBRLL +BBFBFFBRLL +BFFFFFFRRL +FBFFBBFRRR +FFBFFFFLRR +FBFFFFBLRR +FBBFBBBLRR +BFBBFBFLRR +BBFBBFFRLR +FBFFFFBRRR +FFBBBFFRLL +BFBFBBFLRR +BFFBBFFRLR +BBFFFFBRLL +FBFBBBFRLR +FBFBFFBRLR +FFBBBFFLLR +BFBBFFBRLR +BFBFBFFRRR +FFBBFFBRLL +FFBFFBFLLR +BBFFBBFLRL +FBBBFBBLRR +FBBFBBFRLL +FFBBBFBRRR +BBBFFFFLLR +FBFFBBBLRL +FBFBFBFLRR +BBFFFFFLLR +FBFFFFFRLR +FBBFFFFLRL +FBBFFFFLRR +BBFFBFBRLL +BBBFFBFLRL +BBFFBFBLRR +FBBBFBFLRL +BFBBBBFRRR +FBBBFFFRRR +FBFFFBBLLL +BFBFBBBLLR +BFFFFFBRLL +FFBBBFBLLR +BFFFBFFRLL +FBFFFBBRLL +BFBFBFFRLR +FFBBFBBLRR +BFBFBFFLRL +BFFFFFBRLR +BFBFBBFLRL +BFFFFBFRLL +FBBBFBFLLR +BFFBBFFLLR +FBBFFBFRRL +FBBBFFFRLR +FFBFFBBLRR +FFBBBBFLRR +FFBBBBFRRL +BBBFFFBRLL +BFFFBBFRRR +BBFBBFFRRR +BFFBBBBLLR +FFFBBFFLRL +BFBBFFBLLL +FBBBBFBRLL +FBBFBBFRRR +BBFFFFFLLL +FFBFFFBRLR +BFFBFBBLLR +BFBBFFFRRR +BFBBBBBLLR +FFBBBBBRRR +BFBBBBFLLL +BFFBBBFLRR +BFFBFBFLLL +FBBFFBBRRR +FFBBFBFRLL +BBFFFFBRRR +FFBFFFFRLR +FFFBBBFLLR +FFBBFFFRLR +BFFBBFFLRR +FFBBFFFLLR +BFBBBFFLLL +FBBBBFBRLR +FBFBBFFLLR +FFBFBFFLLR +BFBFFFBLLR +BFBFFFFLRR +BFFFFFBRRR +FFBFBFFLRL +BFFBFFFLRL +BFFBFBBRRL +BFBBFFFRLL +BFBBBFBLLL +FBBFBFFRLL +FFBBFFFRLL +BFFBFFBRRL +BFBBFBBRLR +FBFFFFBLLL +BBFBFBFLLL +FBBBFBBLRL +BFBBBFBLLR +FFBFBFFRLR +BFBBFBBLRL +BFBFBFBLLR +FBBBFFFLRR +FBFFBBFRLR +FBFFBBFRRL +FFFBBFFLLR +FFBBBFBRLR +FBFBFFBLLR +BFBFBBBRRL +BFFBBBFLLL +FBBFFBFLRL +FBFBFFBLRR +FFBFFBBRLR +BFFFBFFRRR +BBFFFBBLLR +FBBFFBFLRR +FFFBBBFLRL +FBFFBBBRLR +FFFBBBBRLL +FBFFFFBLRL +BFFFFFFRLR +FFBBBBBRLR +FFBBFBFRRR +FBFFBFFRLR +FBFFBFBRRL +FFBFBBBRRR +FFBBBFFLLL +FBFFFBBRRR +FFFBBBFLLL +BFFFFFBLLL +BFBBBBBLRR +BFFFBBBRLL +BFBFFBBLLL +FBFBFBFLRL +BBFFFFFLRL +FFBBFFFLRR +FBFBBBFLRR +FBBFFBBRLL +FBBBFFFRRL +BFFFBBBLLL +FFBFFFBRLL +FBBBBBBRLL +BFBBBBFLRR +FFFBBBBLRR +FFBFFFBLLL +BFFBFBBRLL +BBFFFFBRLR +FBBFBBFRLR +BFFBBBBLRR +FBFFBBFRLL +FBFFFFFRRL +FBBBBFFRLR +BFBFBFFRRL +FBFFFFFRLL +FFBFFFFRRR +FBBBBBFRLL +FFBFFFBRRR +FFBFFBFRRR +BFFFBFBRRL +FBBBBFBRRR +BFFFFBFRRL +FBBFBFBLRR +BFFBBFBRLR +FBBBBBFLRR +BBFBBFBLRL +BFBBBBFRRL +BBFFBBFRRR +FBFBFFBLRL +BBBFFBBLRL +BFBBFBBLRR +FFBFBBBLRR +BBBFFBBLRR +FFBFBFFLLL +FBFBFBBLLR +BFFFBBFLLL +BBFBFBFLRL +BBFFFFFRRL +FFBFFFBLLR +BFFFFFFLRL +BBBFFFBRRR +FBFFBFFLLL +FFBBBBBLLL +BBFBBBFRLR +FFFBBFBLRL +BFFBFBBLLL +BFBFBBBLLL +FBFBBFBLLL +FFBFBBFLRL +FBBFFFBLLR +BFFBBBFRLL +FBFBBFBLLR +FFBFFFFLLL +FBBBBFBLRL +FFBFBBBRRL +FBFFFBFRRL +FBFFBBFLLL +BFBBFBBRRL +FFFBBBFRRL +BBFFFBFLRL +BFFBFFBLLL +BFBBFBFLLR +FBBFBBFLRR +BFBBBFFLRL +FBBFFFFLLL +BFBFBBFRLR +FBFBBBBLLR +FBBBFFFRLL +FFBFBFBLLL +FBBBBBFLLR +FFBBBFBLRR +FFBBFFBRRL +FBBBBBBLRR +FFBBBBBLRL +FFFBFBBRRL +FFBBBFFRRL +FBFBFBBRLR +FFBBFFFLLL +BBFBFBFRRR +BBFBFFBLRR +FBFBFBFRLL +FBFFBFBLRR +BBFBFFBLLL +FBBBFBBRRR +FBFBBFBLRL +FFBBFBFRLR +FBBBFBFRLL +BFFBFBFRRR +FBBBFFBRRR +BBFBBFBRLL +BBBFFBFRLL +FFBFFBBLRL +BFFFBBBLRR +BBFBBBFRLL +FBFFFBBLRR +FBFFFBBLRL +FBBBBBFLRL +BBFBFBBLRL +BBFFBBBLRL +BFFFFBBRRR +BFFBBBFRLR +FBBBFBBLLL +FBFBFBBRLL +BFBFBBBLRR +FFBFBFFLRR +FFBFFBFRRL +BFFBBFBLLL +BFFFBFFLLR +BFBBFFFLRL +FBBFFBBLRR +FBBBBBFRRR +FBBFBBBRLR +BFBFBBBRLL +FBFFFBBRRL +FBBBFFBRRL +BFBFFBFLLR +BBBFFFFRLL +FBFFFFFLRR +FBFFFFBRLR +BBFFBBFLLR +FBFBFFFRLL +BFBBFBFRRR +FBBBFFBLLL +BFBFFBFRLR +BFFBBFFRLL +FBFFBFFLLR +FBBFFBBLLR +BFBBBFFLLR +FBBBBBBRRL +BBFFBBBRRL +BBFBFFFRLL +FBBBFBFLRR +BFBBBBBRLR +BFFBFFBRLL +BFFFFBFLLR +FFBFFFFRRL +BFBFFFFRRL +FBBFBBBRRR +BFFBBFBRRL +FBFBBBBRRL +FBBBFBFRLR +FFFBBFBLRR +BFFFBFBLLL +BBFBBBFRRR +BFFBBFBLRR +FBFFBBFLLR +BBFFFBBLRR +BFBFFFFRLR +FBFFFBFRLL +FBFBFFFRRL +FFBBBBBLRR +FBBBBFBLRR +FFBBFBFRRL +BBBFFFBLLR +FFBFBBBRLR +FFFBBBFRLR +BFFFFFBLLR +FBBFBFBLLL +BBFFFBBLRL +FBFFBFBRLL +BFBFBFBRLR +BBFFFBFRRL +FFBFBBFLRR +FBBFFFBRLL +FBBBFBFRRR +FFBBBFFLRL +FBBFBBBLLR +FBBFBBBRLL +BBBFFBBRLR +FBBFFFFLLR +FBFBBBFRRR +FBFFFFFLLR +FBFBFFFLRL +BBBFFFBRRL +BFBBBFBRLL +FFBFBBFRRL +FFBBBBBRLL +BBFFBBBLLR +BBFBFBFLRR +FBBFFBBRLR +FFBFBBBLLR +FBFBBFFLRL +BFFFFFFRRR +FBFBBFFRLL +FFBFBBBLRL +BBFFFFBLRL +FBFFBFFRRR +FFFBBFBLLL +BBBFFBFRRL +FBFFBFFRLL +FBBBBBFRRL +BBFFFBFLLL +FFBFFBFLRR +BBFFFBBLLL +FBBFFBBLRL +FBBFFFBLLL +BBFBBFBLLR +FFBBFBBRLR +FBBFFBFLLR +BBFBFBFRLR +BFFFFFFLLR +FBFFFBFRLR +BFBFFFBRRL +FFBFBBBLLL +FBFBBBBRLR +BFFBFBFLRR +BBFBBFBRRL +FFBBFFBLLL +BFBFBFBLRL +FFFBBFFRLL +FBFBFBBRRL +FFBBBFFLRR +BFBBBFBRRL +FBFBBBBRRR +BFBBBFFRRL +FBFFFFFLRL +BBFBFBFRLL +FFBFFFFLRL +FFFBBBBRLR +FFBFBBBRLL +FBFBFBBLLL +BFBBBFBLRR +FBFFBBBLLR +FFFBBBBRRL +FBBBBFFLLR +FBBBFFFLLL +BBFFFBBRRL +BFBBBFBLRL +FBBFFFBLRR +FBFFFFFLLL +BFBBBBBRRL +BBBFFBFLLL +FBBBBFFRRR +FBBFFFFRLR +FBFFFBBLLR +FBBFBBFLLR +FBFBBFFLRR +FBBFBFFLLL +BBFBBFFRRL +BBFBFBBRRR +BFFBBBFLLR +BFBFFFBRLL +BBBFFFFRRR +FFBFFFBRRL +FFBBFBBRRR +BBFFFFFRLR +BFFFBBFRRL +BBFFBFBRRL +BBBFFFFLRL +BBFFFBFLRR +FBFFBFBRLR +BBFFBFFRRR +BFBFBFBRRL +BFFBFFBRRR +FBBFBBBLLL +FBFFBFBLLR +BBFBFFFLLL +FFBFBFFRRR +BFBFFBBRLL +BBFFFBFLLR +FFBBFBFLRL +BFBFBBBRLR +FBFBBFBRRR +FBFBBBBLLL +BBFBFBFLLR +BFBFFBBRLR +BFFFBFFLLL +FBFFBBBLLL +FBBBBFFLRL +FFFBBBFLRR +BBFFBFBRRR +BBFBFFBLLR +FFFBBFBRRL |