Advertisement
Guest User

adventofcode_day11

a guest
Dec 11th, 2020
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.82 KB | None | 0 0
  1. # common/seat.py
  2.  
  3. from copy import deepcopy
  4. import itertools
  5.  
  6. def count(m):
  7.     return ''.join(itertools.chain(*m)).count('#')
  8.  
  9. def flip(l, i, j, o, n):
  10.     # print(m[i][j], i, j, o)
  11.     if l[i][j] == 'L' and o == 0:
  12.         l[i][j] = '#'
  13.     elif o >= n:
  14.         l[i][j] = 'L'
  15.  
  16. def make_round(m, n, fn):
  17.     l = deepcopy(m)
  18.     for i in range(len(m)):
  19.         for j in range(len(m[i])):
  20.             if m[i][j] == '.':
  21.                 continue
  22.             o = fn(m, i, j)
  23.             flip(l, i, j, o, n)
  24.     return l
  25.  
  26. def solve_with(n, fn):
  27.     f = open('p.in')
  28.     m = list(map(list, f.read().splitlines()))
  29.     l = make_round(m, n, fn)
  30.     while l != m:
  31.         m = deepcopy(l)
  32.         l = make_round(m, n, fn)
  33.     print(count(m))
  34.    
  35. ## part1
  36.  
  37. from copy import deepcopy
  38. from common import seat
  39.  
  40. def neighbours(m, i, j):
  41.     o = 0
  42.     for ni in [-1, 0, 1]:
  43.         for nj in [-1, 0, 1]:
  44.             nii = i + ni
  45.             njj = j + nj
  46.             if nii == i and njj == j:
  47.                 continue
  48.             if 0 <= nii < len(m) and 0 <= njj < len(m[i]) and m[nii][njj] == '#':
  49.                 o += 1
  50.     return o
  51.  
  52. seat.solve_with(4, neighbours)
  53.  
  54. ## part2
  55.  
  56. from common import seat
  57.  
  58. def check_direction(m, i, j, di, dj):
  59.     ii,jj = i + di, j + dj
  60.     while 0 <= ii < len(m) and 0 <= jj < len(m[ii]):
  61.         if m[ii][jj] == '.':
  62.             ii += di
  63.             jj += dj
  64.             continue
  65.         elif m[ii][jj] == '#':
  66.             return True
  67.         else:
  68.             return False
  69.     return False
  70.  
  71. def sights(m, i, j):
  72.     o = 0
  73.     r = [-1, 0, 1]
  74.     for di in r:
  75.         for dj in r:
  76.             if di == 0 and dj == 0:
  77.                 continue
  78.             if check_direction(m, i, j, di, dj):
  79.                 o += 1
  80.     return o
  81.  
  82. seat.solve_with(5, sights)
  83.  
  84.  
  85.  
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement