
我在 YouTube 上觀看了一個名為“A4 紙拼圖影片中,演示者拿一張 A4 紙,按照一定的方式折疊,然後要求觀眾計算週長,但沒有給出答案,而是給出了一種使用哈希檢查答案是否正確的方法。
知道正確答案的順序是 = 取出答案,在計算器上單擊 sq rt 5 次,然後從結果中取出小數點右側的 6 位數字,並按數字升序重新排列它們,如果它們等於234477 你就有了正確答案。
因此,我不想嘗試計算週長,而是想反轉雜湊值以獲得解決方案。所以我啟動了 Excel,在 A5 中輸入了候選編號(例如 42),然後在 B5 到 F5 中開始求平方根。在 G5 中,我減去 1,得到 0.123897073,在 H5 中,我乘以 100 萬,得到 123897,然後在 I5:I10 中,我提取了每個數字。在J5:J10 中,我使用公式對數字進行排序,J5-1, J6=2,J7=3,J8=7,J9=8,J10=9,最後在K5 中,我將所有數字連接起來,得到123789 和將目標 234477 放置在 L5 中。
現在我陷入了困境,我假設我可以使用 Goal Seek 透過更改 A5 將 K5 設定為等於 234477,但它找不到解決方案。
我不想使用程式碼/巨集來查找答案或手動操作(例如排序等),我喜歡觀看目標搜尋並嘗試解決方案並能夠「看到」解決方案的路徑的想法。
有誰知道我怎麼才能完成這件事?
公式
A5 = 使用者輸入數字
B5 = SQRT(A5)
C5 =
SQRT(B5)
D5
= SQRT(C5 ) E5 = SQRT(D5) F5 = SQRT(E5)
G5 = F5-1
H5 = IF(MID(G5,3 ) ,1)*1=0,G5*10000000,G5*1000000)
(LIST)I5:I10 = MID($F$5,3,1)*1 [每行 3 加 1]
J5:J10 { = INDEX(列表, MATCH(SMALL(COUNTIF(列表, "<"&列表), ROW(1:1)), COUNTIF(列表, "<"&列表), 0))}
K5 = J5&J6&J7&J8&J9&J10
編輯:也許我不應該使用Goal Seek,它可能有限制,即使我輸入目標123789,它仍然找不到起始值42。
答案1
一般來說,您應該嘗試找到一種不僅對您的解決方案有效的演算法。
甚至盡量加快計算速度。
A5
它將保留您的初始值B5
=A5^(1/32)
,是的,一點數學知識
(SQRT(x) 相當於 x^1/2;執行五次意味著 1/2*1/2*.... = 1/32)C5
=Mod(B5,1)
在這裡你不能簡單地做1-x
:想像一下它是 2.smth 還是 0.smth...MOD 函數傳回數字除以除數後的餘數。
D5
=3-TRUNC(LOG(C5,10))
您需要取第一個不為零的數字(函數 Log 10),並跳過0.
字串的。E5
=MID(C5,D5,6)
在這裡您提取字串。F5:F10
下一列函數的簡單索引。G5
=0+MID($E$5,F5,1)
它提取 F5 中的數字。複製並貼上到G5:G10
.H5
=LARGE($G$5:$G$10,7-F5)
從範圍中 取7-F5
第一個G5:G10
最大的。複製並貼上到H5:H10
.I5
=H5&H6&H7&H8&H9&H10
再次組合字串J5
它會保留HASH解來查找(你稱它為目標)K5
=I5=MID(J5,1,6)
I5
比較和中的字串從J5
。
以下是解決方案:
這是 SHA256 的 bash 程式碼
這裡是 SHA256 StartSeq=1的 bash 程式碼;結束序列=5
for i in $(seq $StartSeq $EndSeq) ;
do
[[ $(printf "$i" | sha256sum | awk '{print $1}'| xxd -r -p | base64) \
== "SyJ3d9TdH8Ycb4hPSGQdArTRIdP9Moywi1Ux/Kzav4o=" ]] && \
echo "### The Solution is "$i ;
done
答案2
感謝哈斯塔我找到了一種讓 Goal Seek 發揮作用的方法。到目前為止,它已經為我找到了兩個解決方案 -
4和2340。
好吧,我們現在是基於哈斯塔的回答
我們再次開始A5
- A5= 任意數字
- B5
=INT(A5)
- C5
=B5^(1/32)
- D5
=INT(MID(C5,FIND(".",C5,1)+1,10))
- E5
=INT(IFERROR(IF(FIND("0",D5,1)<6,CONCATENATE(LEFT(D5,FIND("0",D5,1)-1),MID(D5,FIND("0",D5,1)+1,10-FIND("0",D5,1)))),LEFT(D5,6)))
- F5
=INT(IFERROR(IF(FIND("0",E5,1)<=6,CONCATENATE(LEFT(E5,FIND("0",E5,1)-1),MID(E5,FIND("0",E5,1)+1,7-FIND("0",E5,1))),LEFT(E5,6)),LEFT(E5,6)))
- G5至G10索引 1,2,3,4,5,6 - 它們永遠不會改變
- H5至H10
=INT(0+MID($F$5,$G5,1))
向下拖動,$G5
增加到 6、7 等。 - I5至I10
=SMALL($H$5:$H$10,ROW(A1))
被拉低從而Row(A1)
增加 - J5
=INT(CONCATENATE(I5,I6,I7,I8,I9,I10))
現在您可以尋找目標J5到234477透過改變A5
解決方案