···11import fileinput
223344-def is_safe(row, i):
44+def is_trap(row, i):
55 """Helper function to read out-of-bounds tiles as safe."""
66 if 0 <= i < len(row):
77 return row[i]
8899- return True
99+ return False
101011111212def predict_next_row(row):
1313 """Given a row, returns the predicted following row."""
1414- return [not (is_safe(row, i-1) ^ is_safe(row, i+1)) for i in range(len(row))]
1414+ return [is_trap(row, i-1) ^ is_trap(row, i+1) for i in range(len(row))]
151516161717if __name__ == '__main__':
1818- # Represent safe tiles as True and traps as False
1919- raw_first_row = fileinput.input()[0].strip()
2020- row = tuple(True if c == '.' else False for c in raw_first_row)
2121- safe_tiles = sum(row)
1818+ # Represent traps as True and safe tiles as False.
1919+ # The number of safe tiles per row is len(row) - sum(row).
2020+ row = [True if c == '^' else False for c in fileinput.input()[0].strip()]
2121+ row_len = len(row)
2222+ safe_tiles = row_len - sum(row)
22232324 for _ in range(40 - 1):
2425 row = predict_next_row(row)
2525- safe_tiles += sum(row)
2626+ safe_tiles += row_len - sum(row)
26272728 print "Number of safe tiles in first 40 rows:", safe_tiles
28292930 for _ in range(400000 - 40):
3031 row = predict_next_row(row)
3131- safe_tiles += sum(row)
3232+ safe_tiles += row_len - sum(row)
32333334 print "Number of safe tiles in all 400000 rows:", safe_tiles