CTF編程題-三羊獻瑞(實驗吧)解題隨記


題目如下。解題步驟參考的是https://cloud.tencent.com/developer/news/373865中作者的思路。

1.首先,兩個四位數相加等於一個五位數,那么這個五位數的第一位必定是1,也就是“三”=1,。

2.繼續分析“祥”+“三”,若是“祥”(8),“三”為1,那么低位必定有進位(才能結果為五位數);若是“祥”(9),假如低位沒有進位,則也滿足條件,而低位有進位那么“羊”為1,這就不符合題目要求(“三”=1,不同的漢字代表不同的數字)。所以總結下來,“祥”可能為9或8,滿足所有條件的情況下,“羊”必定為0。

3.接下來可以看到“瑞”+“羊”並沒有等於“瑞”,而是等於另外一個數字“生”。因為“羊”=0,“瑞”在2~9范圍內,兩者相加只可能等於“瑞”,而此處不是,則低位必然有進位。接下來可以知道“瑞”+“羊”+1不可能等於10,即“生”=0(與“羊”=0沖突)。那么“瑞”+“羊”並沒有加進位,結合上一步的分析【若是“祥”(9),假如低位沒有進位,則也滿足條件】得知“祥”=9。

4.“生”-“瑞”=1,“生”最大為7,因為9被“祥”占用。那么“生”最小為3。

綜上,瑞(2~7),生(3~8),“輝”、“獻”、“氣”的范圍均為2~8。

接下來就是編程了,代碼同樣也是參考作者的。

 1 #encoding:utf-8
 2 #     祥9 瑞d[2] 生d[1] 輝d[0]
 3 #  +  三1 羊0    獻d[4] 瑞d[2]
 4 #------------------------------
 5 # 三1 羊0 生d[1] 瑞d[2] 氣d[3]
 6 import random
 7 #隨機0-9的數組
 8 def shuzu():
 9     b1 = []
10     while True:
11         j=random.randint(2,8) 
12         if j not in b1:
13             b1.append(j)
14         if(b1.__len__()==5):
15             break
16     return b1
17 #
18 def shuzu1():
19     while True:
20         b2=shuzu()
21 #"生"-"瑞"=1,瑞(2-7),生(3-8)
22         if(b2[1]-b2[2]==1 and b2[1]!=2 and b2[2]!=8):
23             break
24     print(b2)
25     return b2
26 while True:
27 #d生成隨機的數組
28         d=shuzu1()
29 # 祥c 瑞d[2] 生d[1] 輝d[0]
30         xrsh=9000+d[2]*100+d[1]*10+d[0]
31 #三a 羊b 獻d[4] 瑞d[2]
32         syxr=1000+d[4]*10+d[2]
33 #三a 羊b生d[1] 瑞d[2] 氣d[3]
34         sxsrq=10000+d[1]*100+d[2]*10+d[3]
35 #如果等式成立,就終止循環,輸出數字
36         if(sxsrq==xrsh+syxr):
37             print("________________")
38             print("  祥瑞生輝:",xrsh)
39             print("+ 三羊獻瑞:",syxr)
40             print("三羊生瑞氣:",sxsrq)
41             break

代碼運行時間也是隨機的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM