当我偶然发现一个错误时,我正在尝试创建一个反向栅栏密码! 这是我的代码:
n=len(cipher)
strings=[]
for r in range(3,4):
lis=[[0 for i in range(n)] for i in range(r)]
x,y=0,0
for c in cipher:
try:
lis[x][y]=c
except:
for i in lis:
print(i)
print(x,y)
break
y+=2*r-3
print(y)
if y>=n:
y-=n
x+=1
print(x,y)
x,y,z=0,0,1
s=""
for i in range(n):
try:
if(lis[x][y]==0):
print(r,n)
s+=lis[x][y]
except:
for i in lis:
print(i)
print(x,y,c)
break
y+=1
if x==0:
z=1
elif x==r-1:
z=0
if z==1:
x+=1
else:
x-=1
strings.append(s)
return strings
我添加了一些try / except语句来确定错误。不过,后来发现,如果我将一行4更改为一行,则读为
lis=[['.' for i in range(n)] for i in range(r)]
代码可以完美地工作(因为没有产生任何错误-它仍然没有产生正确的结果)!
代码之间的唯一区别是这一行。我在Windows 10上使用的是Python 37。
为什么一个代码在其他代码不起作用的地方起作用?
编辑:我的输入密码是“ Js s!ae saeoemiwm”,它是使用围栏密码中的三个“ rails”编码的。
编辑2:我有一个可以逆转此密码的工作版本,但是这个问题的重点是为什么将0更改为'。有什么不同吗?
答案 0 :(得分:0)
原因是这一行:
s+=lis[x][y]
s
是一个字符串,因此只能将其他字符串连接到该字符串。如果lis[x][y]
包含0
,则该数字是数字,而不是字符串,因此您无法将其连接起来。
如果将其更改为:
s += str(lis[x][y])
然后它将使用任何一个初始值。