Игра Конвея в жизнь сосчитать соседей - PullRequest
0 голосов
/ 14 ноября 2018
def neighbors(matrix, r, c):

    live_neighbors = 0

    if matrix[r][c-1] != 0:
        live_neighbors += 1
    if matrix[r-1][c] != 0:
        live_neighbors += 1
    if matrix[r-1][c+1] != 0:
        live_neighbors += 1
    if matrix[r][c-1] != 0:
        live_neighbors += 1
    if matrix[r][c+1] != 0:
        live_neighbors += 1
    if matrix[r+1][c-1] != 0:
        live_neighbors += 1
    if matrix[r+1][c] != 0:
        live_neighbors += 1
    if matrix[r+1][c+1] != 0:
        live_neighbors += 1

    return live_neighbors

Это код, который я написал до сих пор.Как мне сосчитать соседей по пограничным ячейкам?Если я использую этот код, я получу индекс вне диапазона ошибок.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Возможное решение без всех этих if операторов:

def neighbors(matrix, r, c):
    def get(r, c):
        if 0 <= r < len(matrix) and 0 <= c < len(matrix[r]):
            return matrix[r][c]
        else:
            return 0

    neighbors_list = [get(r-1, c-1), get(r-1, c), get(r-1, c+1),
                      get(r  , c-1),              get(r  , c+1),
                      get(r+1, c-1), get(r+1, c), get(r+1, c+1)]

    return sum(map(bool, neighbors_list))

matrix = [ [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 1],
           [0, 0, 0, 1, 1],
           [0, 0, 0, 1, 1],
           [0, 0, 1, 1, 1] ]

print(neighbors(matrix, 0, 0))  # 0
print(neighbors(matrix, 1, 2))  # 1
print(neighbors(matrix, 3, 2))  # 4
print(neighbors(matrix, 4, 4))  # 3

В случае, если ячейки будут иметь значения только 0 или 1, функция neighbors просто возвратит sum(neighbors_list).

0 голосов
/ 15 ноября 2018

Ближе всего к тому, что у вас будет:

def neighbors(matrix, r, c):

live_neighbors = 0

if c and matrix[r][c-1] != 0:
    live_neighbors += 1
if r and matrix[r-1][c] != 0:
    live_neighbors += 1
if r and matrix[r-1][c+1] != 0:
    live_neighbors += 1
if c and matrix[r][c-1] != 0:
    live_neighbors += 1
if c < len(matrix[r])-1 and matrix[r][c+1] != 0:
    live_neighbors += 1
if r < len(matrix)-1 and matrix[r+1][c-1] != 0:
    live_neighbors += 1
if r < len(matrix)-1 and matrix[r+1][c] != 0:
    live_neighbors += 1
if r < len(matrix)-1 and matrix[r+1][c+1] != 0:
    live_neighbors += 1

return live_neighbors

и т. Д.

0 голосов
/ 14 ноября 2018

Вы можете использовать вспомогательную функцию для проверки границ:

def neighbors(matrix, r, c):
    def get(r, c):
        return 0 <= r < len(matrix) and 0 <= c < len(matrix[r]) and matrix[r][c]

    live_neighbors = 0

    if get(r, c-1) != 0:
        live_neighbors += 1
    if get(r-1, c) != 0:
        live_neighbors += 1
    if get(r-1, c+1) != 0:
        live_neighbors += 1
    if get(r, c-1) != 0:
        live_neighbors += 1
    if get(r, c+1) != 0:
        live_neighbors += 1
    if get(r+1, c-1) != 0:
        live_neighbors += 1
    if get(r+1, c) != 0:
        live_neighbors += 1
    if get(r+1, c+1) != 0:
        live_neighbors += 1

    return live_neighbors

Вы также можете использовать itertools.product в выражении генератора для sum вместо if операторов для подсчета всех живых соседей:

from itertools import product
def neighbors(matrix, r, c):
    def get(r, c):
        return 0 <= r < len(matrix) and 0 <= c < len(matrix[r]) and matrix[r][c]
    return sum(get(r + i, c + j) for i, j in product(range(-1, 2), 2) if i or j)
...