Получение истинного или ложного результата тестирования, если список содержит 4 последовательных номера в нескольких направлениях

#python #python-3.x

#python #python-3.x

Вопрос:

Я составляю список и хочу проверить положительный результат 4 или более подряд в любых направлениях (я тестирую для B и E), например:

 List = [N, N, B, N, N, E, B, E, N,
        N, E, B, N, E, E, E, B, N,
        N, N, N, N, N, E, B, E, N,
        N, E, B, N, E, E, E, B, N]
  

Это длиннее, но вы поняли суть,
в любом случае я бы хотел, чтобы это возвращало значение True для E , так как есть четыре подряд для E , но нет для B . Я также хочу протестировать диагональ, но я изо всех сил пытаюсь понять, как даже попытаться это сделать, как есть.
У меня нет примера кода, потому что я не знаю, как решить эту проблему.
Дайте мне знать, если мне нужно объяснить по-другому.

Комментарии:

1. Вы представили список в виде четырех строк с девятью столбцами, как вы это выбрали? Почему не двенадцать строк по три столбца? Что, если в списке целых сорок восемь элементов или всего пятнадцать?

2. это не может быть более 10 строк. честно говоря, вероятно, было бы лучше, если бы было 7 столбцов по 6 в каждом столбце, но я думал, что будет какой-то алгоритмический способ решить это, который я мог бы реализовать в нескольких разных ситуациях.

3. В вашем списке нет строк или столбцов (или диагоналей, если на то пошло). Это список из 36 значений. Если вы хотите структуру данных в «матричном стиле», вы должны использовать список списков. Что вы пытались решить самостоятельно?

4. У каждого элемента есть индекс. Вам нужно определить индексы и смещения для трех других элементов, которые вы хотите сравнить — индексы / смещения для элементов, которые отображаются в столбце или по диагонали, будут отличаться в зависимости от того, как вы разделяете список.

Ответ №1:

Будет проще, если мы сможем представить эти данные в виде структуры сетки с координатами x, y для каждой точки. Мы можем использовать класс для настройки данных таким образом. Класс должен знать, какой ширины вы хотите, чтобы сетка была, чтобы сделать это. Чтобы найти последовательность элементов, мы можем перебирать строки и столбцы, и каждый раз, когда мы находим соответствие для элемента, мы проверяем, что соседние квадраты в каждом направлении также содержат один и тот же элемент.

 class Grid(object):
    def __init__(self, data, width):
        self.data = data
        self.width = width
        self.height = len(L) / width

    def get(self, x, y):
        """ Find the item in the grid at the given coordinates """
        if 0 <= x < self.width and 0 <= y < self.height:
            return self.data[y * self.width   x]

    def find_sequence(self, item, times):
        """ Check for a sequence of item occuring at least the specified 
        number of times. Checks right, down, down-right, and down-left. """

        for y in range(self.height):
            for x in range(self.width):
                # if we find the item at x, y...
                if self.get(x, y) == item:
                    # ... then look at adjacent items in each direction
                    for dx, dy in [(1, 0), (0, 1), (1, 1), (-1, 1)]:
                        if all(self.get(x   i*dx, y   i*dy) == item 
                               for i in range(1, times)):
                            return True
        return False

N, B, E = "N", "B", "E"
data = [N, N, B, N, N, E, B, E, N,
        N, E, B, N, E, E, E, B, N,
        N, N, N, N, N, E, B, E, N,
        N, E, B, N, E, E, E, B, N]
grid = Grid(data, width=9)
grid.get(3, 3)   # N
grid.find_sequence(B, 4)  # False
grid.find_sequence(N, 4)  # True
grid.find_sequence(E, 4)  # True
  

Ответ №2:

Это то, что вы ищете?

 List = [N, N, B, N, N, E, B, E, N,
        N, E, B, N, E, E, E, B, N,
        N, N, N, N, N, E, B, E, N,
        N, E, B, N, E, E, E, B, N]

limit = 4

flag = False

oldValue = ''
newValue = ''

counter = 0

for i in range(0, len(List)):
  newValue = List[i]

  if (newValue == oldValue):
    counter  = 1

  oldValue = newValue

  if (counter >= 4):
    flag = True
    break


print 'Result is'   str(flag)
  

Комментарии:

1. SO не является бесплатным сервисом для написания кода. Мы не поощряем ответы на вопросы, которые не демонстрируют никаких усилий.

2. Честно говоря, я просто ответил, потому что мне было скучно. Но вы совершенно правы.