···11+import fileinput
22+33+def is_safe(levels):
44+ increasing = all((a < b) for a, b in zip(levels, levels[1:]))
55+ decreasing = all((a > b) for a, b in zip(levels, levels[1:]))
66+ good_deltas = all((abs(a - b) <= 3) for a, b in zip(levels, levels[1:]))
77+88+ return (increasing or decreasing) and good_deltas
99+1010+def gen_part_2(levels):
1111+ yield levels
1212+ for i in range(len(levels)):
1313+ yield levels[:i] + levels[i+1:]
1414+1515+1616+reports = []
1717+1818+for line in fileinput.input():
1919+ reports.append([int(n) for n in line.split()])
2020+2121+print("Part 1:", sum(is_safe(r) for r in reports))
2222+print("Part 2:", sum(any(is_safe(r) for r in gen_part_2(report)) for report in reports))