Как перейти из «наклонного» списка обратно в исходный - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть этот фрагмент кода, который превращает список «Головоломка» из его первоначального формата:

Puzzle = ["FUNCTIONRRIRAI",
          "RAIOONFRCCPWON",
          "PTCSNOBEUITOLO",
          "BNCACIANTOSLIH",
          "RBYOLILYNREFBT",
          "HYYNOGESTIBRIY",
          "AATTSIONCMCENP",
          "UORTENRRCBFVAU",
          "CEBEECVWIERORI",
          "PROCESSORTOPYF",
          "OHCOMPUTERHSOS",
          "YCYPRESREOSMRW",
          "OATHBRMVTHHCTR",
          "PGORWOOUIPSCHP"]

в это:

F
RU
PAN
BTIC
RNCOT
HBCSOI
AYYANNO
UAYOCOFN
COTNLIBRR
PERTOIAECR
ORBTSGLNUCI
YHOEEIEYTIPR
OCCCENOSNOTWA
PAYOECRNTRSOOI
GTPMSVRCIELLN
OHRPSWCMBFIO
RBEUOIBCRBH
WRSTREFEIT
OMRETRVNY
OVEROOAP
UTOHPRU
IHSSYI
PHMOF
SCRS
CTW
HR
P

Мне нужен способ быть возможность изменить загадку обратно в исходный формат после внесения необходимых изменений. Вот код для поворота головоломки:

i = 0
        while i < len(Puzzle) * 2:
            character = ""
            for y in range(0, len(Puzzle)):
                for x in range(0, len(Puzzle[0])):
                    if (y - x) + i == 13:
                        character += Puzzle[x][y]
            if character != "":
                LeftOutPuz.append(character)
            i += 1

1 Ответ

0 голосов
/ 26 февраля 2020

Это будет работать для предоставленного вами примера


original = ["FUNCTIONRRIRAI",
            "RAIOONFRCCPWON",
            "PTCSNOBEUITOLO",
            "BNCACIANTOSLIH",
            "RBYOLILYNREFBT",
            "HYYNOGESTIBRIY",
            "AATTSIONCMCENP",
            "UORTENRRCBFVAU",
            "CEBEECVWIERORI",
            "PROCESSORTOPYF",
            "OHCOMPUTERHSOS",
            "YCYPRESREOSMRW",
            "OATHBRMVTHHCTR",
            "PGORWOOUIPSCHP"]

puzzle = ['F',
          'RU',
          'PAN',
          'BTIC',
          'RNCOT',
          'HBCSOI',
          'AYYANNO',
          'UAYOCOFN',
          'COTNLIBRR',
          'PERTOIAECR',
          'ORBTSGLNUCI',
          'YHOEEIEYTIPR',
          'OCCCENOSNOTWA',
          'PAYOECRNTRSOOI',
          'GTPMSVRCIELLN',
          'OHRPSWCMBFIO',
          'RBEUOIBCRBH',
          'WRSTREFEIT',
          'OMRETRVNY',
          'OVEROOAP',
          'UTOHPRU',
          'IHSSYI',
          'PHMOF',
          'SCRS',
          'CTW',
          'HR',
          'P']

max_lines = 14
solution = [''] * max_lines

decrement = 0
lineno = -1
for item in puzzle:
    lineno += 1
    index = lineno
    if lineno >= max_lines:
        index = max_lines - 1
    decrement = 0
    for char in item:
        solution[index - decrement] += char
        decrement += 1

assert(solution == original)

Примечание : в приведенном выше коде используется конкатенация строк, которая по своей природе медленная, если производительность является проблемой, используйте bytearray вместо.

Мой алгоритм по сути является обратной версией алгоритма, используемого для создания головоломки. Вот как это работает, если вам интересно ->

Я называю puzzle индексы списка как line number (s)

  • Итерация по списку и строкам в списке, когда элемент в списке исчерпан, номер строки увеличивается

  • самый первый символ каждого элемента должен быть в том же индексе , что и номер строки (начиная с 0).

    Например, в строке 2 (фактически 1, начиная с 0), 1-й символ R, он должен быть в индексе 1st (начиная с 0) нашего списка

  • Второй символ будет находиться в предыдущий индекс

    Например, в строке 2 (фактически 1, начиная с 0) второй символ - U, он должен быть в индексе 0th нашего списка

  • Для следующего символа нам снова придется понизить индекс на и так далее ...

  • Делайте это до строки Num ber на больше или равно для длины original списка (или длины самого длинного элемента в puzzle списке), в данном случае 14

  • После line no >= 14, index больше не увеличивается и должно оставаться на максимальном индексе, который в данном случае равен 13. Все остальное останется прежним.

В конце концов, вы должны иметь исходный список

, отредактированный в соответствии с точными потребностями OP.

...