/ Python / 2015 / 18.py
18.py
 1  from lib import *
 2  
 3  input = read_input(2015, 18)
 4  
 5  gol = input.splitlines()
 6  
 7  
 8  for _ in range(100):
 9      gol = [
10          [
11              ".#"[
12                  (
13                      cnt := sum(
14                          gol[p][q] == "#"
15                          for r in range(3)
16                          for s in range(3)
17                          if (r, s) != (1, 1) and 0 <= (p := i - 1 + r) < len(gol) and 0 <= (q := j - 1 + s) < len(row)
18                      )
19                  )
20                  in (2, 3)
21                  and x == "#"
22                  or x == "."
23                  and cnt == 3
24              ]
25              for j, x in enumerate(row)
26          ]
27          for i, row in enumerate(gol)
28      ]
29  
30  print(sum(x == "#" for row in gol for x in row))
31  
32  
33  gol = list(map(list, input.splitlines()))
34  gol[0][0] = gol[0][-1] = gol[-1][0] = gol[-1][-1] = "#"
35  for _ in range(100):
36      gol = [
37          [
38              ".#"[
39                  (
40                      cnt := sum(
41                          gol[p][q] == "#"
42                          for r in range(3)
43                          for s in range(3)
44                          if (r, s) != (1, 1) and 0 <= (p := i - 1 + r) < len(gol) and 0 <= (q := j - 1 + s) < len(row)
45                      )
46                  )
47                  in (2, 3)
48                  and x == "#"
49                  or x == "."
50                  and cnt == 3
51              ]
52              for j, x in enumerate(row)
53          ]
54          for i, row in enumerate(gol)
55      ]
56      gol[0][0] = gol[0][-1] = gol[-1][0] = gol[-1][-1] = "#"
57  
58  
59  print(sum(x == "#" for row in gol for x in row))