Подсчитать строковые элементы на карте в зависимости от расположения строк и заполнить сетку счетчиками - PullRequest
0 голосов
/ 03 января 2019

У меня есть список с именем my_map, который содержит два различных типа строковых значений '.' а также '&'. Теперь для каждого значения [x] [y] это «.» Я хочу посчитать, сколько раз '&' было найдено в любом из восьми направлений рядом с '.'

Я создал сетку для хранения счетчиков, но я просто не могу правильно сформулировать свои условия. Я не могу использовать NumPy массивов. Помощь или даже просто подсказка будет принята с благодарностью.

Примечание: 'S' и 'E' рассматриваются как '.'

 my_map = ['................' '....&...........' '..........E.....'
 '&&..&...........' '....&&&.........' '......&&&&..&&..'
 '................' '.......&........' '.....&.&........'
 '....S...........' '.......&.&&.....']

def create_grid(my_map):
    grid = [[0]*(len(my_map[0])) for x in range(len(my_map))]
    return grid

grid = create_grid(my_map)

for x, y in [(x,y) for x in range(len(my_map)) for y in range(len(my_map[0]))]:
    #any '&' north ?
    if my_map[x][y+1]== '&' and my_map[x][y]=='.': 
        grid[x][y]+= 1
        #any '&' west ?
        if my_map[x-1][y]== '&' and my_map[x][y]=='.': 
            grid[x][y]+=1
            #any '&' south ?
            if my_map[x][y-1]== '&'and my_map[x][y]=='.': 
                grid[x][y]+=1
                #any '&' east ?
                if my_map[x+1][y]== '&'and my_map[x][y]=='.': 
                    grid[x][y]+=1
                    #any '&' north-east ?
                    if my_map[x+1][y+1] == '&'and my_map[x][y]=='.': 
                        grid[x][y]+=1
                        #any '&' south-west ?
                        if my_map[x-1][y-1] == '&'and my_map[x][y]=='.': 
                            grid[x][y]+=1
                            #any '&' south-east ?
                            if my_map[x+1][y-1]== '&'and my_map[x][y]=='.': 
                                grid[x][y]+=1
                                #any '&' north-west?
                                if my_map[x-1][y+1]== '&'and my_map[x][y]=='.': 
                                    grid[x][y]+=1

 #desired output for first 3 rows
grid = [[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0],[2,2,1,1,2,1,0,0,0,0,0,0,0,0,0,0]]

В данный момент я получаю 'IndexError: строковый индекс вне диапазона'. Я не знаю, как ограничить диапазон, чтобы он все еще был правильным. Единственное, что мне удалось до сих пор, - это сетка, отображающая 1 с для всех '.' и 0 для всех '&'.

1 Ответ

0 голосов
/ 03 января 2019

Я не думаю, что вложенные условия уместны здесь; каждое внешнее условие должно быть истинным для внутренних, которые должны быть оценены. Они должны быть независимыми друг от друга и последовательными.

Это также много работы и подвержено ошибкам, чтобы перечислить каждое условие вручную. Для каждой ячейки существует до 8 направлений, в которых может жить сосед, и мы делаем одинаковую проверку для каждого направления. Цикл - подходящая конструкция для этого; каждая итерация цикла проверяет одну соседнюю ячейку, определяя, находится ли она в границах и соответствующего символа.

Кроме того, поскольку в вашей сетке мало &, имеет смысл выполнять проверки соседей только для & символов. Для каждого из них приращение считается для соседних . с. Сделайте обратное, если сетка состоит преимущественно из & символов.

my_map = [
    '................', 
    '....&...........',
    '..........E.....',
    '&&..&...........', 
    '....&&&.........', 
    '......&&&&..&&..',
    '................', 
    '.......&........', 
    '.....&.&........',
    '....S...........', 
    '.......&.&&.....'
]

grid = [[0] * len(x) for x in my_map]
directions = [
    [-1, 0], [1, 0], [0, 1], [0, -1], 
    [-1, -1], [1, 1], [1, -1], [-1, 1]
]

for row in range(len(my_map)):
    for col in range(len(my_map[row])):
        if my_map[row][col] == "&":
            for x, y in directions:
                y += row
                x += col

                if y < len(my_map) and y >= 0 and \
                   x < len(my_map[y]) and x >= 0 and \
                   my_map[y][x] != "&":
                    grid[y][x] += 1

for row in grid:
    print(row)

Выход:

[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[2, 2, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 2, 0, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[2, 2, 1, 2, 0, 0, 0, 4, 3, 2, 1, 1, 2, 2, 1, 0]
[0, 0, 0, 1, 2, 4, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1, 3, 4, 4, 2, 1, 1, 2, 2, 1, 0]
[0, 0, 0, 0, 1, 1, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 3, 2, 3, 2, 2, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0]

И версия, которая накладывается на оригинальную карту в стиле «Сапер»:

0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 & 1 0 0 0 0 0 0 0 0 0 0
2 2 1 2 2 2 0 0 0 0 0 0 0 0 0 0
& & 1 2 & 4 2 1 0 0 0 0 0 0 0 0
2 2 1 2 & & & 4 3 2 1 1 2 2 1 0
0 0 0 1 2 4 & & & & 1 1 & & 1 0
0 0 0 0 0 1 3 4 4 2 1 1 2 2 1 0
0 0 0 0 1 1 3 & 2 0 0 0 0 0 0 0
0 0 0 0 1 & 3 & 2 0 0 0 0 0 0 0
0 0 0 0 1 1 3 2 3 2 2 1 0 0 0 0
0 0 0 0 0 0 1 & 2 & & 1 0 0 0 0

Попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...