70 lines
1.5 KiB
Python
70 lines
1.5 KiB
Python
import matrix
|
|
import shared
|
|
import itertools
|
|
import functools
|
|
|
|
|
|
def is_increasing(sequence):
|
|
return all(sequence[i] < sequence[i + 1] for i in range(len(sequence) - 1))
|
|
|
|
|
|
def is_decreasing(sequence):
|
|
return all(sequence[i] > sequence[i + 1] for i in range(len(sequence) - 1))
|
|
|
|
|
|
def parse_line(row):
|
|
for previous, current in zip(row, row[1:]):
|
|
diff = abs(current - previous)
|
|
if diff >= 1 and diff <= 3:
|
|
continue
|
|
return 0
|
|
if not (is_increasing(row) or is_decreasing(row)):
|
|
return 0
|
|
return 1
|
|
|
|
|
|
# @shared.profile
|
|
def part1(rows):
|
|
rows = [list(map(int, row.split())) for row in rows]
|
|
safe = 0
|
|
for row in rows:
|
|
safe += parse_line(row)
|
|
print(safe)
|
|
|
|
|
|
def brute_force(row):
|
|
check = parse_line(row)
|
|
if check == 1:
|
|
return 1
|
|
for x in range(len(row)):
|
|
new_row = row[:x] + row[x + 1 :]
|
|
check = parse_line(new_row)
|
|
if check == 1:
|
|
return 1
|
|
return 0
|
|
|
|
|
|
# @shared.profile
|
|
def part2(rows):
|
|
rows = [list(map(int, row.split())) for row in rows]
|
|
safe = 0
|
|
for row in rows:
|
|
safe += brute_force(row)
|
|
print(safe)
|
|
|
|
|
|
def main():
|
|
rows = [row for row in shared.load_rows(2)]
|
|
with shared.elapsed_timer() as elapsed:
|
|
part1(rows)
|
|
print("🕒", elapsed())
|
|
|
|
rows = [row for row in shared.load_rows(2, True)]
|
|
with shared.elapsed_timer() as elapsed:
|
|
part2(rows)
|
|
print("🕒", elapsed())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|