达芬奇密码题解
题目信息
达芬奇隐藏在蒙娜丽莎中的数字列: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}