Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # common/seat.py
- from copy import deepcopy
- import itertools
- def count(m):
- return ''.join(itertools.chain(*m)).count('#')
- def flip(l, i, j, o, n):
- # print(m[i][j], i, j, o)
- if l[i][j] == 'L' and o == 0:
- l[i][j] = '#'
- elif o >= n:
- l[i][j] = 'L'
- def make_round(m, n, fn):
- l = deepcopy(m)
- for i in range(len(m)):
- for j in range(len(m[i])):
- if m[i][j] == '.':
- continue
- o = fn(m, i, j)
- flip(l, i, j, o, n)
- return l
- def solve_with(n, fn):
- f = open('p.in')
- m = list(map(list, f.read().splitlines()))
- l = make_round(m, n, fn)
- while l != m:
- m = deepcopy(l)
- l = make_round(m, n, fn)
- print(count(m))
- ## part1
- from copy import deepcopy
- from common import seat
- def neighbours(m, i, j):
- o = 0
- for ni in [-1, 0, 1]:
- for nj in [-1, 0, 1]:
- nii = i + ni
- njj = j + nj
- if nii == i and njj == j:
- continue
- if 0 <= nii < len(m) and 0 <= njj < len(m[i]) and m[nii][njj] == '#':
- o += 1
- return o
- seat.solve_with(4, neighbours)
- ## part2
- from common import seat
- def check_direction(m, i, j, di, dj):
- ii,jj = i + di, j + dj
- while 0 <= ii < len(m) and 0 <= jj < len(m[ii]):
- if m[ii][jj] == '.':
- ii += di
- jj += dj
- continue
- elif m[ii][jj] == '#':
- return True
- else:
- return False
- return False
- def sights(m, i, j):
- o = 0
- r = [-1, 0, 1]
- for di in r:
- for dj in r:
- if di == 0 and dj == 0:
- continue
- if check_direction(m, i, j, di, dj):
- o += 1
- return o
- seat.solve_with(5, sights)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement