僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
昨日、じゃなくて既に一昨日に読んだ、三年生だか四年生だかの 教科書に、四則演算を組み合わせて上の等式を満たすことを 求める問題があった。
今回は
python3で解いた。
解は15通り出てきた。
本当はもう少しエレガントに記述したかったが、
段数が8つになったループ、以外の解は
すぐには見当たらない。
$ python3 dumb.py 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 * 9 = 100 1 + 2 + 3 - 4 * 5 + 6 * 7 + 8 * 9 = 100 1 + 2 - 3 * 4 + 5 * 6 + 7 + 8 * 9 = 100 1 + 2 - 3 * 4 - 5 + 6 * 7 + 8 * 9 = 100 1 + 2 * 3 + 4 * 5 - 6 + 7 + 8 * 9 = 100 1 + 2 * 3 * 4 * 5 / 6 + 7 + 8 * 9 = 100 1 - 2 + 3 * 4 * 5 + 6 * 7 + 8 - 9 = 100 1 - 2 + 3 * 4 * 5 - 6 + 7 * 8 - 9 = 100 1 - 2 * 3 + 4 * 5 + 6 + 7 + 8 * 9 = 100 1 - 2 * 3 - 4 + 5 * 6 + 7 + 8 * 9 = 100 1 - 2 * 3 - 4 - 5 + 6 * 7 + 8 * 9 = 100 1 * 2 * 3 + 4 + 5 + 6 + 7 + 8 * 9 = 100 1 * 2 * 3 - 4 * 5 + 6 * 7 + 8 * 9 = 100 1 * 2 * 3 * 4 + 5 + 6 + 7 * 8 + 9 = 100 1 * 2 * 3 * 4 + 5 + 6 - 7 + 8 * 9 = 100
bc(1)で検算。一応合っている、はず。
4^8、つまり65536通りの総当り、よりましな解もありそうな気がするが。
全部出力するスクリプトも追加。
$ python3 all.py | cat -n 1 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45 2 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 - 9 = 27 3 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 * 9 = 100 4 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 / 9 = 28.88888888888889 5 1 + 2 + 3 + 4 + 5 + 6 + 7 - 8 + 9 = 29 . . . 65532 1 / 2 / 3 / 4 / 5 / 6 / 7 * 8 / 9 = 0.0001763668430335097 65533 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 + 9 = 9.000024801587301 65534 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 - 9 = -8.999975198412699 65535 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 * 9 = 0.0002232142857142857 65536 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 = 2.7557319223985893e-06
120GBのSSD購入(SE800 2.5" SATAIII)。
適当に検索して
みつけたページを頼りに、乱暴に換装。
Ubuntu17.10.1のLive USBが無事起動したことを確認して、stretchを
入れてみた。いくら待ってもインストーラが起動しないことに気づいて
確認。イメージがamd64でなくarm64であった。
ダウンロードして書き直したイメージで無事インストール。
$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 udev 860M 0 860M 0% /dev tmpfs 175M 3.1M 172M 2% /run /dev/sda1 108G 3.3G 100G 4% / tmpfs 871M 0 871M 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 871M 0 871M 0% /sys/fs/cgroup tmpfs 175M 4.0K 175M 1% /run/user/110 tmpfs 175M 0 175M 0% /run/user/1000
買ったおもちゃで、大体遊べたようだ。
解が100になる組み合わせは14あった。
その他に、100.0になるものが一つ。
割り算のため整数演算でなくなっていた。
ただし、割り算の結果、100ぴったりになるのはこれだけのようだ。
1 + 2 * 3 * 4 * 5 / 6 + 7 + 8 * 9 = 100.0
下の例のように、除算と乗算がくっついて いないものは 当然整数に戻せない。
1 + 2 / 3 + 4 + 5 * 6 + 7 * 8 + 9 = 100.66666666666666
割り算の演算子を"//"に変えてみたが、すると 今度は2//3のように値が切り捨てられるものまでが出てきた。
1 - 2 // 3 + 4 + 5 * 6 + 7 * 8 + 9 = 100
raspi(Python3.4.2)や、stretch(同3.5.3)で動かした結果、
昨晩のスクリプトは、python3.6未満で動かないことが判明。
全部がいっぺんに3.6にならない以上、2.xは切り捨てるにしても
もっとましな書き方にせねば。
ついでのついでに、1から9まで順不同であった場合も対応したい ところか。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。