day 3: another method
This commit is contained in:
parent
120660d6a7
commit
9c619282f4
@ -32,5 +32,5 @@ def part2(inp):
|
|||||||
print(f"Cumulative product of tress : {tree_product}")
|
print(f"Cumulative product of tress : {tree_product}")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
#part1('./input.txt')
|
part1('input.txt')
|
||||||
part2('input.txt')
|
part2('input.txt')
|
||||||
|
51
day5/day5.py
51
day5/day5.py
@ -1,5 +1,6 @@
|
|||||||
#! /usr/bin/env python3
|
#! /usr/bin/env python3
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
from bisect import bisect
|
||||||
|
|
||||||
|
|
||||||
def main(filename):
|
def main(filename):
|
||||||
@ -23,34 +24,42 @@ def part1(results):
|
|||||||
def part2(results):
|
def part2(results):
|
||||||
seat_ids = sorted(x[2] for x in results.values())
|
seat_ids = sorted(x[2] for x in results.values())
|
||||||
missing_seat_ids = set(range(max(seat_ids))) - set(seat_ids)
|
missing_seat_ids = set(range(max(seat_ids))) - set(seat_ids)
|
||||||
print(missing_seat_ids)
|
print("Your seat id : ", max(missing_seat_ids))
|
||||||
|
|
||||||
|
|
||||||
def parse_boarding_pass(boarding_pass):
|
def parse_boarding_pass(boarding_pass, strategy="binary"):
|
||||||
row = _parse(boarding_pass[:7], "F", "B", 128)
|
"Poor man's dispatcher"
|
||||||
col = _parse(boarding_pass[7:], "L", "R", 7)
|
try:
|
||||||
|
to_call = globals()[f"parse_boarding_pass_{strategy}"]
|
||||||
|
return to_call(boarding_pass)
|
||||||
|
except KeyError:
|
||||||
|
raise KeyError(f"Bad strategy name {strategy}")
|
||||||
|
|
||||||
|
|
||||||
|
def parse_boarding_pass_binary(boarding_pass):
|
||||||
|
"Parse boarding pass using a binary conversion"
|
||||||
|
boarding_pass = boarding_pass.translate(str.maketrans("FLBR", "0011"))
|
||||||
|
row = boarding_pass[:7]
|
||||||
|
col = boarding_pass[7:]
|
||||||
|
return int(row, base=2), int(col, base=2)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_boarding_pass_bisect(boarding_pass):
|
||||||
|
"Pass boarding pass using bisection algorithm"
|
||||||
|
row = bisect(boarding_pass[:7], lower_option="F", upper_option="B", max=127)
|
||||||
|
col = bisect(boarding_pass[7:], lower_option="L", upper_option="R", max=7)
|
||||||
return row, col
|
return row, col
|
||||||
|
|
||||||
|
|
||||||
def _parse(inp, lower_option, upper_option, number):
|
def bisect(inp, lower_option, upper_option, max):
|
||||||
rows = slice(0, number - 1)
|
min_v, max_v = 0, max
|
||||||
for l in inp:
|
for l in inp:
|
||||||
|
length = max_v - min_v
|
||||||
if l == lower_option:
|
if l == lower_option:
|
||||||
rows = lower_half(rows)
|
max_v = min_v + length // 2
|
||||||
else:
|
elif l == upper_option:
|
||||||
rows = upper_half(rows)
|
min_v = 1 + min_v + length // 2
|
||||||
return rows.start
|
return min_v
|
||||||
|
|
||||||
|
|
||||||
def lower_half(sl: slice):
|
|
||||||
length = sl.stop - sl.start
|
|
||||||
return slice(sl.start, sl.start + length // 2)
|
|
||||||
|
|
||||||
|
|
||||||
def upper_half(sl: slice):
|
|
||||||
length = sl.stop - sl.start
|
|
||||||
return slice(1 + sl.start + length // 2, sl.stop)
|
|
||||||
|
|
||||||
|
|
||||||
def get_seat_id(row, col):
|
def get_seat_id(row, col):
|
||||||
return 8 * row + col
|
return 8 * row + col
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#! /usr/bin/env python3
|
#! /usr/bin/env python3
|
||||||
from day6 import parse_boarding_pass, get_seat_id
|
from day5 import *
|
||||||
|
|
||||||
def tests():
|
def tests():
|
||||||
inputs = {
|
inputs = {
|
||||||
@ -9,8 +9,13 @@ def tests():
|
|||||||
"BBFFBBFRLL": (102, 4, 820)
|
"BBFFBBFRLL": (102, 4, 820)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("bisect", inputs)
|
||||||
|
test("binary", inputs)
|
||||||
|
|
||||||
|
|
||||||
|
def test(strategy, inputs):
|
||||||
for boarding_pass, expected in inputs.items():
|
for boarding_pass, expected in inputs.items():
|
||||||
row, col = parse_boarding_pass(boarding_pass)
|
row, col = parse_boarding_pass(boarding_pass, strategy=strategy)
|
||||||
seat_id = get_seat_id(row, col)
|
seat_id = get_seat_id(row, col)
|
||||||
assert row == expected[0]
|
assert row == expected[0]
|
||||||
assert col == expected[1]
|
assert col == expected[1]
|
||||||
|
Loading…
Reference in New Issue
Block a user