Проверьте, имеет ли сетка 4x4 2 соседних числа (вверх или вниз), равных определенному числу - PullRequest
0 голосов
/ 29 июня 2019
The user has to enter a 4x4 grid of numbers as follows:
[[2,1024,8,8],
 [4,1024,16,32],
 [2,32,64,128],
 [8,256,2,2]]

Далее у пользователя запрашивается номер, например, для этого конкретного примера, который я выбрал 2048.

Теперь код должен проверить, является ли сумма любых двух соседних полей (вверх или вниз)добавьте в качестве заданного числа, в данном случае, 2048, если да, то поле будет правильным, иначе ложным.Выведите результат.

Код должен включать подсписки, а не словари или кортежи и т. Д.

Что ж, я довольно новичок в python и получил этот вопрос онлайн.Я попробовал обойти это, но безрезультатно.Все, что я создал до сих пор, это подсписок для ввода данных и попытался выполнить его индивидуально одну за другой, но это занимает слишком много времени.

  • Редактировать 1: Я попробовал пример кодаэто длинный метод, но при получении ошибки в качестве индексов списка должны быть целые числа или фрагменты, а не кортежи.Надеюсь, также хотел бы сократить код.

Вот код

a=[[2,1024,8,8],
   [4,1024,16,32],
   [2,32,64,128],
   [8,256,2,2]]

def winning(a):
 for i in range(0,4):
    for j in range(0,4):
        if (i==0):
            if(j==0):
                if a[i,j]+a[(i+1),j]==2048:
                    True
            if(j==3):
                if a[i,j]+a[i+1,j]==2048:
                    True
            if a[i,j]+a[i,j-1]==2048 or a[i,j]+a[i+1,j]==2048 or a[i,j]+a[i,j+1]==2048:
                True
        if(i==1 or i==2):
            if(j==0):
                if a[i,j]+a[i,j+1]==2048 or a[i,j]+a[i-1,j]==2048 or a[i,j]+a[i+1,j]==2048:
                    True
            if(j==3):
                if a[i,j]+a[i-1,j]==2048 or a[i,j]+a[i+1,j]==2048 or a[i,j]+a[i,j-1]==2048:
                    True
            if a[i,j]+a[i,j-1]==2048 or a[i,j]+a[i,j+1]==2048 or a[i,j]+a[i-1,j]==2048 or a[i,j]+a[i+1,j]==2048:
                True
        if(i==3):
             if(j==0):
                if a[i,j]+a[i-1,j]==2048:
                    True
             if(j==3):
                if a[i,j]+a[i-1,j]==2048:
                    True
             if a[i,j]+a[i,j-1]==2048 or a[i,j]+a[i-1,j]==2048 or a[i,j]+a[i,j+1]==2048:
                True
 return false

assert winning(a)

1 Ответ

1 голос
/ 29 июня 2019

Всегда лучше разделить код на большее количество функций, что вам нужно. Кроме того, вы также можете создавать переменные для не жестко кодирующих значений в вашем коде (если только эта матрица 4x4 не является единственным способом, которым вы собираетесь выполнять эту операцию).

Сначала мы находим, сколько строк в этой матрице, и если длина каждой строки равна постоянному значению (и не отличается между ними); Затем мы определяем две функции:

  • sum_up_down, учитывая позицию (индекс строки и индекс столбца), дают нам кортеж, содержащий элемент в таком положении, сумму с его верхним значением и сумму с его нижним значением;

  • find_number просто зациклите матрицу, найдите все возможные кортежи и при первом совпадении (number in result, где number - ваш выбор, например, 2048, а result кортеж, содержащий три значения ).

Затем мы печатаем матрицу и цикл, находя каждый раз число, указанное пользователем.

Если вам не нужно / не нужно, чтобы элемент был найден (просто суммируйте вверх и вниз), просто отредактируйте возврат sum_up_down и удалите element

my_list = [
    [2,1024,8,8],
    [4,1024,16,32],
    [2,32,64,128],
    [8,256,2,2]
]

number_rows = len(my_list)
if number_rows == 0:
    raise ValueError("Cannot play with an empty matrix!")
length_row = len(my_list[0])

# verify that every row length is equal to the first found
for row in range(number_rows):
    assert len(my_list[row]) == length_row

def sum_up_down(row, col):
    """Returns a tuple holding the element found at (row,col),
    the sum with its upper value and the sum with its lower value
    in the matrix (only if the element is not boundary)."""
    elem = my_list[row][col]
    up_sum = elem
    down_sum = elem

    if row != 0:  # can sum up
        up_sum += my_list[row-1][col]

    if row != number_rows - 1:  # can sum down
        down_sum += my_list[row+1][col]

    return elem, up_sum, down_sum

def find_number(number):
    """Find the choosen number in my_list applying sum_up_down
    row*col times. If found, returns True, False otherwise."""
    for row in range(number_rows):
        for col in range(length_row):
            result = sum_up_down(row, col)
            if number in result:
                print(
                    "{} was found as elem / sum up / sum down of {} ({},{})".format(
                        number, result[0], row, col
                    )
                )
                return True
    print("{} not found!".format(number))
    return False

# show matrix
for row in my_list:
    print(row)

while True:
    number = int(input("Insert the number you want to find: "))
    find_number(number)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...