Ищете объяснение кода ниже о том, как найти координаты для кубоида? - PullRequest
0 голосов
/ 11 января 2020

Я смог придумать приведенные ниже коды с примерами ввода и вывода, приведенными в вопросе, но мне очень не хватает концепции, стоящей за этой проблемой. Может кто-нибудь объяснить, как эта программа работает с самого начала и до конца? например, почему мы используем (x + 1) и (y + 1) .. и так далее, спасибо.

x = int(input())
y = int(input())
z = int(input())
n = int(input())

print([[i,j,k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if (i+j+k) != n])

Пример ввода 0

1 1 1 2

Пример вывода 0

[ [0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]

1 Ответ

1 голос
/ 13 января 2020

Понимание списка:

[[i,j,k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if (i+j+k) != n]

Более читабельно, если вы «развернете» его:

[
    [i,j,k]
    for i in range(x+1)
    for j in range(y+1)
    for k in range(z+1)
    if (i+j+k) != n
]

Это эквивалентно обычному l oop:

ret = []
for i in range(x+1): # 0, 1, ..., x
    for j in range(y+1): # 0, 1, ..., y
        for k in range(z+1): # 0, 1, ..., z
            if i+j+k != n:
                ret.append([i,j,k])

По сути, вы храните каждый триплет в кубе [0, x] * [0, y] * [0, z], сумма которого не равна n.

Функция range создает неизменяемую последовательность. range(stop) - это последовательность 0, 1, ..., stop-1. Следовательно, range(x+1) - это последовательность 0, 1, ..., x. (Существуют другие параметры, см. Ссылку.)

С x, y, z, n = (1, 1, 1, 2) у вас есть:

ret = []
for i in (0, 1): # 0, 1
    for j in (0, 1): # 0, 1
        for k in (0, 1): # 0, 1
            if i+j+k != 2:
                ret.append([i,j,k])

Триплеты: [0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1] проверены, а [0, 1, 1], [1, 0, 1], [1, 1, 0] удалены, оставив [0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1].

...