这种算法可以逆转吗?

时间:2019-12-19 04:12:19

标签: python

嗨,我有以下python代码。

  

注意...是的,我要你解决我的算法..我已经精疲力尽了   正在努力。如果您喜欢挑战,那就去吧。

dataListEdited = [0,1,1,1,0,0,1,0,1,0,1,1,0]    #This is just random 1's and 0's

patternsNotAllowed = [[1,1,1],[0,0,0],[1,0,1,0,1],[0,1,0,1,0],[1,1,0,0,1,1],[0,0,1,1,0,0]]

#Condition data
def conditionData(dataListEdited,patternsNotAllowed):
    offset=0
    for x in range(len(dataListEdited)):
        print(dataListEdited[:x+1])
        for notAllowed in patternsNotAllowed:
            if(len(dataListEdited[:x+1])> len(notAllowed)-1):
                if((dataListEdited[(x+1)-len(notAllowed):x+1]) == notAllowed):
                    print("Matched"+str(notAllowed))
                    lenToFlip = len(dataListEdited) - x +1
                    print(dataListEdited)
                    print("Swap @" + str(lenToFlip-1))
                    for y in range(lenToFlip-1):
                        if(not(dataListEdited[-y-1]) == True):
                            dataListEdited[-y-1] = 1
                        else:
                            dataListEdited[-y-1] = 0
                    print(dataListEdited)
                    offset = x
                    break
    return dataListEdited

请分析您是否愿意,但它基本上会查看列表dataListEdited,并确保它不包含patternsNotAllowed中的任何列表。

它通过检查patternsNotAllowed中是否存在与序列dataListEdited的一部分匹配的情况来执行此操作,如果找到匹配项,则会翻转导致dataListEdited中匹配的最后一位,并且该位右边的所有位都为也翻转了。

我的问题是这个

  

上述过程是否可逆?

上周,我一直在试图自己解决这个问题,但我无法……下面是我尝试过的一些代码。 (它做同样的事情会倒退,但显然不起作用)。另外,我知道您可以存储发生翻转的位置以将其反转,但是我想避免这样做。 (但我开始认为这是不可能的。)

def unconditionData(dataListEdited,patternsNotAllowed):
    for x in range(len(dataListEdited)):
        if(not(dataListEdited[-1-x]) == True):
            dataListEdited[-1-x] = 1
        else:
            dataListEdited[-1-x] = 0
        #print(dataListEdited)
        for notAllowed in patternsNotAllowed:
            #print(dataListEdited[len(dataListEdited)- x - len(notAllowed):len(dataListEdited)-x])
            if(dataListEdited[len(dataListEdited)- x - len(notAllowed):len(dataListEdited)-x] == notAllowed):
                print("Matched " + str(notAllowed))
                lastFlipPoint = len(dataListEdited)- x
                break

    return dataListEdited

我们将不胜感激

谢谢

伍迪

2 个答案:

答案 0 :(得分:3)

不,这是不可逆的。

如果使用patternsNotAllowed = [[0]],您将从输入列表[1, 1][0, 1]中获得相同的结果[1, 1]

由于存在多个具有相同输出的输入,因此无法分辨是哪个输入产生了输出,因此您无法将其反转为实际输入。

答案 1 :(得分:2)

要添加到Barmar的答案中,使用您自己的patternsNotAllowed列表也是不可逆的。有2 ^ 13 = 8192个长度为13的不同列表,其中仅包含0和1,我们可以使用itertools.product进行尝试:

>>> len({
...     tuple(conditionData(list(a), patternsNotAllowed))
...     for a in itertools.product((0, 1), repeat=13)
... })
...
178

(我删除了所有打印语句以对其进行测试。)通过将它们放入集合中并找到长度,我们可以看到只有178个不同的输出,因此每个输出平均具有8192/178≈46个不同的pre-图片。