Suingo.com

Make10 機械計算と解の数

Make10は4つの数字から計算して10を作る遊びです。本記事ではそれをコンピュータで解いているやり方について大まかに説明します。Make10ルールは「Make10に挑戦/答えを見る」を御覧ください。

Contents

コンピュータでMake10を解いている方法

当サイト現状のやり方では以下のように回答を作っています。

  1. 数字の並び、カッコ設定、演算の組み合わせにより3240パターンの計算式を機械的に作る
  2. 全パターンを計算して結果が10になるものだけ残す
  3. 計算式を(人から見て)意味が変わらない範囲内で式変形して単純化
  4. 式変形の結果、同じになった式を排除
  5. 残ったものを結果として出力

工夫しがいがある箇所がステップ1と3です。

1については、当初もっと安直に全ての組み合わせを作っていたときは7680パターン出してたものを、省略可能と分かった組み合わせを取り除くことで現在の3240パターンになっています。もっと工夫の余地はあるかもですが、現状でも不満がないくらいの速度で動いているのでこれ以上の工夫の予定はありません。(あまり強力じゃないマシンで全715問解くのに7秒ちょっとかかります)

3について、ここはかなり工夫の余地があるところで、このステップがなぜ必要なのかを含めて以降で説明していきます。

以降、話を簡単にするために問題0137に注目します。また他ページでは「+-×÷」としている四則演算の演算記号ですが、本記事でのみコンピュータに合わせて「+-*/」とします。

ステップ2出力の解

問題0137のステップ2出力での解の数は96個です(ちなみに7680パターン計算していたときはこの時点で倍くらいの数になります)。これには以下のような、人から見ると「実質同じじゃん」と思えるようなものがたくさん含まれています。

1 * (0 + (3 + 7))
1 * (3 + (0 + 7))
1 * (7 + (0 + 3))

ステップ3でやっていること

以前は意味のある解を減らしすぎることを恐れて、以下のうち無難なごく一部しかしていませんでした。よって各問題で最終的に見せている解の数がかなり多かった(問題0137の場合は70個)。今回2024年9月のリニューアルに合わせてステップ3を大胆に拡充しました。

プログラムで簡潔に書けているものでも文章にしようとすると複雑になったりするので、ざっくりと主要な一部だけを紹介します。

なお以降で「変更」とは、「変更前と変更後を区別させないため、上書きして同じ式として扱う」を意味します。

  • 0,1はいろいろごまかしが効きすぎてしまうので、そのパターンを制限する(以下の例はその一部)
    • 例)「- 0」は「+ 0」に変更
    • 例)「/ 1」は「* 1」に変更
    • 例)「0 + 3 * 1 + 7」は「0 + 3 + 7 * 1」に変更(「* 1」がいろいろあっても最後の項に統一)
  • なくても良いカッコは削除 例)「1 * (0 + (3 + 7))」は「1 * (0 + 3 + 7)」に
  • 項の順番をソート 例)「4 + 2 + 1 + 3」は「1 + 2 + 3 + 4」に、「5 * 1 * (1 + 1)」は「(1 + 1) * 1 * 5」に

以上を適用すると、「3 / 1 + (7 + 0)」「3 - 0 * 1 + 7」はどちらも「0 + 3 + 1 * 7」に変換され、元から存在する「0 + 3 + 1 * 7」と同じということで無視されるようになります。

他にも細々とやっているのですが、それらにより、2024年9月現在で全体的に「実質同じでしょ」と思えるような解はほぼ一掃できたと思います(ごく僅かに微妙なのもありますが許容範囲内ということで残しました)。

これにて問題0137の解の数は5個まで減りました。

まとめ

このようにしてコンピュータによりMake10計算をさせています。

以上でわかるように、Make10問題の「解の数」は流動的なものであり、いくつとははっきり言えないものです。いくつかの問題は項の並べかえくらいしかバリエーションがなくて流石に「解は1個」と言えるようなものもあります(例:1117: 1 + 1 + 1 + 7)が、大多数は捉え方によって解の数が変わってしまいます。

解の有無については変動しないので確定的に言えるが、解の数については「前提条件による」のが正直なところです。