Это будет работать для предоставленного вами примера
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.