data = [] with open("input.txt") as file: for line in file: _line = line.rstrip() data.append(int(_line)) def solve_p1(input_data) -> int: _sorted_data = sorted(data) sorted_data = [0] + _sorted_data + [_sorted_data[-1] + 3] diff = { 1: 0, 2: 0, 3: 0 } for i in range(1, len(sorted_data)): diff[sorted_data[i] - sorted_data[i-1]] += 1 return diff[1] * diff[3] # Warning # this is correct algorithmically, but naive, so extremely slow for long lists # Saving this because it's nevertheless interesting approach IMO def naive_solve_p2(input_data) -> int: _sorted_data = sorted(input_data) sorted_data = [0] + _sorted_data + [_sorted_data[-1] + 3] def rec_seek_remove(start_index, partial_data): result = 1 # we start with 1 because we have the option to do nothing for i in range(start_index, len(partial_data)-1): diff = partial_data[i+1] - partial_data[i-1] if diff <= 3: # can be deleted new_list = partial_data[:i] + partial_data[i+1:] result += rec_seek_remove(i, new_list) return result return rec_seek_remove(1, sorted_data) print(solve_p1(data))