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()