2020-12-05 - Binary Boarding
(original .ipynb)
Day 5 puzzle input is a list of 10-character strings (mine is here) representing a Boarding Pass, which can be processed to calculate a "seat id" through a calculation neatly described in the link but which I can't be bothered repeating here. Part 1 involves calculating the seat ids for all boarding passes and finding the largest one. Part 2 involves finding a gap in the sequence of seat ids which turns out to be "my" seat.
puzzle_input_str = open("puzzle_input/day5.txt").read()
def parse_boarding_pass_section(elements, upper_str, lower_str):
lower = 0
upper = (2 ** len(elements)) - 1
step = (2 ** len(elements)) // 2
for e in elements:
if e == lower_str:
upper = upper - step
elif e == upper_str:
lower = lower + step
else:
raise Exception(f"invalid element detected: {e}")
step = step // 2
assert upper == lower
return upper
def seat_id(boarding_pass):
rows = boarding_pass[:7]
cols = boarding_pass[7:]
row = parse_boarding_pass_section(rows, "B", "F")
col = parse_boarding_pass_section(cols, "R", "L")
return (row * 8) + col
# 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.
assert 357 == seat_id("FBFBBFFRLR")
# BFFFBBFRRR: row 70, column 7, seat ID 567.
# FFFBBBFRRR: row 14, column 7, seat ID 119.
# BBFFBBFRLL: row 102, column 4, seat ID 820.
assert 567 == seat_id("BFFFBBFRRR")
assert 119 == seat_id("FFFBBBFRRR")
assert 820 == seat_id("BBFFBBFRLL")
seat_ids = [ seat_id(b.strip()) for b in puzzle_input_str.strip().split("\n") ]
print("part 1 - highest seat id =", max(seat_ids))
def find_my_seat(seat_ids):
all_seats = set(seat_ids)
# assume the first unoccupied seat is mine
for row in range(0, 128):
for col in range(0, 8):
sid = (row * 8) + col
prev_sid = sid - 1
next_sid = sid - 1
if (not (sid in all_seats)) and (prev_sid in all_seats) and (next_sid in all_seats):
return sid
return -1
print("part 2 - my seat id =", find_my_seat(seat_ids))
part 1 - highest seat id = 933 part 2 - my seat id = 711