よよよよ
この半月ほど、一般化four-fours問題で遊んでいました。
・動機
機械的想像力が見たかったのです。人間を打ち倒す機械の強さを見たかったのです。それが動機です。
・やったこと
式の自動生成と計算、さらに出力
出力はかなり気を使っていて、演算子の優先順位や結合性に応じて正しく括弧をつけられるようにしているはずです。だいたいあってる。
・成果
ここにソースコードがあります。
https://ofni.necocen.info/works/programming/four_fours/four_fours.cpp
てきとうに読めば使い方はわかると思います。技術的な話はほとんど
https://yosei.fi/articles/5/27/#d20527
に尽くされているのでそれでいいでしょう。OpenMPのこととかは僕もよくわからず使っているのでなんとも言えません。
(2022年の追記:ミラーサイトがリンク切れになっていたので本家を発掘して貼りました)
もうすこし見やすい成果として出力をTeXで処理したPDFをいくつか並べておきます。
https://ofni.necocen.info/works/programming/four_fours/results/
・{4, 4, 4, 4}
https://ofni.necocen.info/works/programming/four_fours/results/4444_0-1000.pdf
とりあえずいちばん普通なfour-foursです(若干拡張しすぎた感はある)。
33,41,51,125,162,218,343あたりがおすすめ。人智を越えぎみ。
・{1, 2, 3, 4}
https://ofni.necocen.info/works/programming/four_fours/results/1234_0-1000.pdf
{4, 4, 4, 4}に比べると数も少ないしアクロバティクさにも欠けるかなーという感じ。
・{1, 2, 3, 4, 5}
https://ofni.necocen.info/works/programming/four_fours/results/12345_0-1000.pdf
ぱっと見た感じ277が意味わからない感じで好き(これほんとか?)。4!+5!=12^2なんですね。あと801なんかも頭がおかしい。
・{4, 4, 4, 4, 4}
https://ofni.necocen.info/works/programming/four_fours/results/44444_0-1000.pdf
four-foursの単純な拡大としてのfive-fours。433なんかが見た目派手ですね。
・{5, 5, 5, 5, 5}
https://ofni.necocen.info/works/programming/four_fours/results/55555_0-1000.pdf
拡大としてはむしろfive-fivesのほうが妥当ではないか的な。{4, 4, 4, 4, 4}に比べると実りの少ない条件でした。奇数なので使いどころに困るのかもしれません。そういえば1000でTeX出力にバグがあることがわかりますね(displaystyleばかり使うからこうなる)。
・{1, 2, 3, 4, 5, 6, 7, 8, 9}
https://ofni.necocen.info/works/programming/four_fours/results/123456789_0-1000.pdf
小町算の拡張。普通の小町算はどうも括弧の使用さえ認めないらしいのですが、それは現状の実装では実現は無理そうです。いや、加減算だけに限るなら括弧なしで書き直せるのか。じゃあできるか、など。これは乗算も認めてみて出てきたものです。1000とかは綺麗でわりと好き。
・結論
楽しかったです。僕はC++とか素人なので実装上のミスとかあれば教えてください。挙動不審になりながら感謝します。