48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
def get_input(sample = False):
|
|
filename = "sample" if sample else "input"
|
|
with open(filename + ".prod", "r") as f:
|
|
return [line.strip() for line in f.readlines()]
|
|
|
|
def char_to_bin(char: str):
|
|
if char not in ["F", "B", "L", "R"]:
|
|
raise ValueError(f"Character `{char=}` cannot be transformed into binary")
|
|
return 0 if char == "F" or char == "L" else 1
|
|
|
|
def seat_to_bin(seat: str):
|
|
if len(seat) == 1:
|
|
return char_to_bin(seat)
|
|
return char_to_bin(seat[0])*2**(len(seat)-1) + seat_to_bin(seat[1:])
|
|
|
|
def seats_to_binary_list(seats: list):
|
|
return [seat_to_bin(seat) for seat in seats]
|
|
|
|
|
|
def get_result(seats: list, part = 1):
|
|
if part == 1:
|
|
return max(seats)
|
|
else:
|
|
candidates = []
|
|
seats.sort()
|
|
|
|
prev = seats[0]
|
|
for i in range(1, len(seats)):
|
|
next = seats[i]
|
|
if prev + 2 == next:
|
|
candidates.append(prev + 1)
|
|
prev = next
|
|
return candidates
|
|
|
|
|
|
|
|
|
|
def main(sample = False, part = 1):
|
|
inp = seats_to_binary_list(
|
|
get_input(sample = sample)
|
|
)
|
|
return get_result(inp, part=part)
|
|
|
|
print(main(part = 2))
|
|
|
|
|
|
|