嗨,我有以下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
我们将不胜感激
谢谢
伍迪
答案 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-图片。