这个算法可以反转吗?

2024-06-16 09:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有下面的python代码。你知道吗

Note... yes, I am asking you to solve my algorithm.. I have become burnt out working on it. If you fancy a challenge give it a go.

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

如果您愿意,请进行分析,但它基本上会查看列表datalisted,并确保它不包含patternsontallowed中的任何列表。你知道吗

它通过检查patternsNotAllowed中是否有与序列datalisted的一部分匹配的case来实现,如果找到匹配,它将翻转导致datalisted中匹配的最后一位,并且该位右侧的所有位也将翻转。你知道吗

我的问题是:

Is the process above reversible?

上个星期我一直在想办法解决这个问题,但是我不能。。。下面是一些我尝试过的代码。(做同样的事情会倒退,但显然不起作用)。此外,我知道你可以存储的位置翻转发生了逆转,但我想避免这样做。(但我开始觉得这是不可能的)。你知道吗

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

任何帮助都将不胜感激

谢谢你

伍迪


Tags: 代码inyouforlenifrangeit
2条回答

不,这是不可逆的。你知道吗

如果patternsNotAllowed = [[0]],您将从输入列表[0, 1][1, 1]得到相同的结果[1, 1]。你知道吗

由于有多个输入具有相同的输出,因此无法判断哪个输入产生了输出,因此无法将其反转为实际输入。你知道吗

再加上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

(为了测试这一点,我删除了所有print语句。)通过将它们放入一个集合中并找出长度,我们可以看到只有178个不同的输出,因此每个输出平均有8192/178≈46个不同的预图像。你知道吗

相关问题 更多 >