0

我有这段代码可以将列表“拼图”从它的原始格式转换为:

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
4

1 回答 1

0

这适用于您提供的示例


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 开始时),第一个字符是R,这应该在1st我们列表的索引中(从 0 开始)

  • 第二个字符,将在前一个索引中

    比如第 2 行(实际上是 1,从 0 开始时),第 2 个字符是U,这应该在0th我们列表的索引中

  • 对于下一个字符,我们将不得不再次降低一个索引,依此类推……

  • 这样做直到行号大于或等于列表长度original(或者,列表中最长项目的长度puzzle),在这种情况下14

  • 一旦line no >= 14,index不再增加并且应该保持在最大索引处,在这种情况下为 13。其他一切都将保持不变。

最后,你应该有原始列表

编辑以匹配 OP 的确切需求。

于 2020-02-26T08:23:59.590 回答