题目信息
达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711
记录在达芬奇窗台口的神秘数字串:36968853882116725547342176952286
这道题目需要很好的数感和联想能力
依靠数感,感觉到达芬奇隐藏在蒙娜丽莎中的数字列是乱序的斐波那契序列
用python生成一下斐波那契序列
a=1
b=1
print(1,end=" ")
print(1,end=" ")
for i in range(32):
c=a+b
print(c,end=" ")
a=b
b=c
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578
发现达芬奇隐藏在蒙娜丽莎中的数字列是乱序的斐波那契序列
联想到记录在达芬奇窗台口的神秘数字串是乱序的flag
且造成乱序的交换位置
和达芬奇隐藏在蒙娜丽莎中的数字列是乱序的斐波那契序列一样(但是斐波那契序列有两个重复元素1,这样解决导致位置有歧义,会有两种结果,我们可以都解出来试着提交)
按照这个想法编写脚本解题
#思考一个问题,斐波那数列有两个1,交换后序列中的两个1到底是原理位置0还是位置1的1我们不知道,那就会出现两种情况
#但是这只会出现两种情况,并且两种可能的序列只有前两位不一样
exchange_fibo="1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 "
_fibo="1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 "
array="36968853882116725547342176952286"
fibo=_fibo.split()
e_fibo=exchange_fibo.split()
f1=""
f2=""
for i in range(0,len(e_fibo)):
x=e_fibo.index(fibo[i]) #根据斐波那契数列第i个位置的元素交换后在哪个下标
#index搜索到的是序列从左到右第一个值为参数的下表,交换后的斐波那契序列第一个就是1,这样搜出来会导致前两位交换后的下标都是1
#根据这道题的实际情况,我们只需要把交换后序列的第一个1换成序列中没有的值,index函数就会为我们找到另一个1的位置
f1+=array[x] #将交换后位置的元素加回到原来的位置i,这里操作array
#找另一个1的位置
for i in range(0,len(e_fibo)):
x=e_fibo.index(fibo[i],1,len(e_fibo))
f2+=array[x]
flag1="flag{"+f2[0:1]+f1[1:]+"}"
flag2="flag{"+f1[0:1]+f2[1:]+"}"
print("一种可能的flag:")
print(flag1)
print("另一种可能的flag:")
print(flag2)
脚本的解为
一种可能的flag:
flag{73995588256861228614165223347687}
另一种可能的flag:
flag{37995588256861228614165223347687}
经过提交验证,正确的flag是
flag{37995588256861228614165223347687}