我在 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 中。
现在我陷入了困境,我以为我可以通过改变 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(list, MATCH(SMALL(COUNTIF(list, "<"&list), ROW(1:1)), COUNTIF(list, "<"&list), 0))}
K5 = J5&J6&J7&J8&J9&J10
编辑:也许我不应该使用目标搜索,它可能有局限性,即使我输入目标 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 ; EndSeq=5 的bash 代码
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
感谢哈斯塔我找到了一种让“目标搜索”发挥作用的方法。到目前为止,它已经为我找到了两个解决方案 -
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
解决方案