
私はYouTubeで「A4用紙パズルこの動画では、プレゼンターが A4 用紙を 1 枚取り、特定の方法で折り、視聴者に周囲の長さを計算するように求めますが、答えは示さず、代わりにハッシュを使用して正しい答えであるかどうかを確認する方法を示します。
正解を知るための手順は、答えを取得し、計算機で 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 を出し、L5 にターゲット 234477 を配置しました。
ここで行き詰まっています。ゴール シークを使用して 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 [行ごとに 1 ずつ 3 を増分します]
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 に相当します。これを 5 回実行すると、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
ハッシュソリューションを検索するために保存します(あなたがそれを呼び出した目標)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
ハスターに感謝私はゴールシークを機能させる方法を見つけました。これまでのところ、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
解決