a wandering wolf

Does a wandering wolf dreams of a wondering, sometimes programming sheep?

このエントリーをはてなブックマークに追加

Make 10 してみよう!

Make 10 とは

皆さんは Make 10 というゲームをご存知でしょうか?

4桁の整数が与えられた時、各桁の数字を使って10になるよう計算する、というものです。

例として 1357 という数字が与えられたとしましょう。これは 1, 3, 5, 7 の数字の間に適当な四則演算を行うと

1 - 3 + 5 + 7 = 10

となりますね。

解いてみる

このゲーム、数字を並び替えたり、カッコを導入して演算順序を変えたりするルールもあるんですが、最も素朴な

  • 並び替えは無し
  • カッコは使わない

という制限の下で解くプログラムを 以前 F# で書いたことがあります

…だいぶひどい感じのコードですが、まぁ4年も前なら仕方ないよね…?

さて、今回同じ問題を解くプログラムを、同じく F# ですが、趣を少し変えて書きなおしてみました。

Gab-km/Make10 - GitHub

結局やってることは「全通りの計算を網羅する」ということで変わりありません。ただ、互いに影響を及ぼさないたくさんの計算を直列にやる、というのはいくら何でも効率悪すぎだろうということで、全部の計算を並列に並べてガッと走らせております。

その他特筆するようなことは、判別共用体を結構(必要以上?)使っていることと、トップダウン設計(≒シグネチャ駆動開発)でやってみた、くらいでしょうか。

瑣末なこと

本プログラムにお愛想程度のテストを書いているんですが、このテストがほぼ fail します(

なぜかと言うと、 FsCheck でテストデータを食わせているんですが、確認しようとしている性質(結果なしか、結果の少なくとも1つは演算子に ‘+’ を含む)がマズいためです。言い訳になりますが、FsCheck の練習がてらに書いているので、別に fail して構わない、むしろ反例見たいのでわざとこうしている、と言うか。本当です。

ちょっとした FsCheck のサンプルコードになっているので、「2014年は FsCheck で一発当てるぞ!」と意気込んでいらっしゃる方は参考になさってください(・ω<)