マガジン

数列の次を当てるゲーム:規則を見つける遊び

遊びをつくる

執筆にClaudeを使用しています。

しおり・ハート・時計の目印が付いた棚から、小さなゲーム世界の本を取り出すイラスト
記事のテーマをもとに制作したAI生成イラスト。

「3, 7, 11, 15, ?」なら、多くの人がすぐ「19」と答えます。4ずつ増えているからです。では「1, 2, 4, 7, 11, ?」はどうでしょう。最初の3項だけを見ると倍々に見えますが、4項目の7で崩れます。ここで階差(隣り合う項の差)を並べて1, 2, 3, 4と気づく瞬間が、数列ゲームで一番おいしい場面です。 この記事で確かめる問いは、「規則を見つける面白さは、難しさをどう段階づけると最もよく立ち上がるか」です。難しさを動かすつまみは、少なくとも「規則の種類」と「見せる項数」の二つがあります。このつまみを動かしたとき、遊ぶ人がどこで詰まり、どこで「わかった」と感じるかを、自分の手で記録して判断するための実験の設計書として書きます。結果は載せません。読者が自分で測って決める形にします。

この記事の目次
  1. 答えが一つに決まらない問題を、ゲームでどう扱うか
  2. 難しさを決める二つの軸
  3. 準備するもの:最小の出題ツール
  4. 手順と記録の取り方
  5. 結果の読み方と起こりやすい誤り
  6. 次の行動

答えが一つに決まらない問題を、ゲームでどう扱うか

数列の出題には構造的な落とし穴があります。有限個の項を見せても、それを説明する規則は一つに決まりません。たとえば「2, 4, 8, ?」は、倍にすれば16ですが、階差が2, 4, 6と増えると考えれば14です。「1, 2, 4, 8, 16, ?」も、倍々なら32ですが、円周上の点を互いに結んで分けられる領域の数として知られる数列は31になります。

そのため、数列ゲームでは次のどちらかを決めておく必要があります。

  • 規則の族を限定してプレイヤーに知らせる(例:「この問題は足し算と掛け算だけで作られています」)
  • 見せる項数を増やして、別の規則を実質的に排除する

この実験では、後者の「項数」が難しさにどう効くかを測ります。同時に、前者の「規則の告知あり/なし」も条件にできます。ただし一度に動かすつまみは一つにします。複数を同時に変えると、何が効いたのか分からなくなるためです。

難しさを決める二つの軸

規則の種類は、次のように段階づけて考えます。右の列は、読者が検算できるように答えも添えています。

  • 1、規則:等差(同じ数ずつ増える)、例:3, 7, 11, 15、次の項:19
  • 2、規則:等比(同じ数を掛ける)、例:2, 6, 18, 54、次の項:162
  • 3、規則:階差が等差(差が1ずつ増える)、例:1, 2, 4, 7, 11、次の項:16
  • 4、規則:前の2項の和、例:1, 3, 4, 7, 11、次の項:18
  • 5、規則:奇数番目と偶数番目で別の規則、例:1, 10, 2, 20, 3, 30、次の項:4
  • 6、規則:操作の合成(2倍して1引く)、例:2, 3, 5, 9, 17、次の項:33

段階が上がるほど、「差を見る」「比を見る」「前の項どうしを足す」「飛ばし飛ばしで見る」といった、試すべき見方が増えます。規則を見つける遊びの面白さは、この見方を切り替える試行錯誤にあります。

もう一つの軸は見せる項数です。項数が少なければ当て推量の余地が広がり、多ければ確信が持てます。ただし項数が増えても、見方そのものに気づかなければ答えは出ません。実験では、この二つの効き方の違いを確かめます。

準備するもの:最小の出題ツール

必要なのはブラウザと、表計算ソフト(または紙)です。次のコードは、段階1〜4の問題をランダムに出し、規則・項数・正誤・入力値・解答時間を記録します。単独のHTMLファイルとして保存すれば動き、外部ライブラリは使いません。

html
<!doctype html>
<meta charset="utf-8">
<p id="q"></p>
<input id="a" type="number"><button id="go">答える</button>
<pre id="log"></pre>
<script>
const r = (a, b) => a + Math.floor(Math.random() * (b - a + 1));
const rules = {
  等差: () => { const a = r(1,9), d = r(2,6); return i => a + d*i; },
  等比: () => { const a = r(1,4), k = r(2,3); return i => a * k**i; },
  階差等差: () => { const a = r(1,5), d = r(1,3); return i => a + d*i*(i+1)/2; },
  和型: () => { const s = [r(1,4), r(2,6)];
    return i => { while (s.length <= i) s.push(s.at(-1) + s.at(-2)); return s[i]; }; }
};
const names = Object.keys(rules), logs = [];
let cur, t0;
function next() {
  const rule = names[r(0, names.length-1)], shown = r(3, 6), f = rules[rule]();
  cur = { rule, shown, ans: f(shown) };
  q.textContent = Array.from({length: shown}, (_, i) => f(i)).join(", ") + ", ?";
  a.value = ""; t0 = performance.now();
}
go.onclick = () => {
  logs.push([cur.rule, cur.shown, a.value == cur.ans ? 1 : 0, a.value,
    Math.round(performance.now() - t0)].join(","));
  log.textContent = "規則,項数,正誤,入力,ミリ秒\n" + logs.join("\n");
  next();
};
next();
</script>

画面には規則名を出さない作りです。記録は画面を開いている間しか残らないので、閉じる前に下の表示をコピーして表計算に貼ってください。段階5と6は、規則の関数を足す課題として残してあります。

手順と記録の取り方

条件を決める

最初に、規則4種類と項数3〜6の組み合わせ(16通り)を条件のセルとします。各セルで3問以上を目標にすると、合計は48問以上です。コードはセルを均等に割り振らないので、数十問を解いたあとにセルごとの問題数を数え、足りないセルは追加で解いてください。疲れが出るので、一度に全問をやらず、2〜3回に分けるのがよい進め方です。

解き方を記録する

コードの出力に加えて、次の一言メモを紙に残します。

  • 最初に試した見方(差、比、和、その他)
  • 答えを決めた根拠が「確信」か「勘」か
  • 詰まった問題で、後から気づいた規則

メモは数字の記録より面倒ですが、結果を読むときに一番役立ちます。正答でも、勘で当たったのか規則を見抜いたのかは、数字だけでは区別できないためです。

一人でやるときの注意

自分で作った出題ツールで自分が解く場合、規則の存在を知っている分、見抜きが速くなります。これを避けるため、規則の一覧を見ないで解く、数日空けて二巡目を行う、といった工夫を入れます。可能なら、別の人にも同じ手順で解いてもらい、解く人ごとに記録を分けてください。人数が少ないうちは、平均より個々の記録の読み取りを重視します。

結果の読み方と起こりやすい誤り

三つの見方で読む

記録が集まったら、次の三つの見方で整理します。

  1. 規則ごとに、項数と正答率の関係を並べる。 項数が増えると正答が増える規則は、項数が効く難しさです。増えても伸びない規則は、見方そのものに気づけていない可能性が高く、ゲーム側では「規則の族」を告知するヒントが効きそうです。
  2. 正答の解答時間を比べる。 正答でも時間が極端に長ければ、試行錯誤で見つけています。短ければ見抜けています。ゲームの段階を分ける境目は、この時間が急に延びるところに置けそうです。
  3. 誤答の中身を調べる。 誤答が別の規則で説明できるなら、その問題は紛らわしい数列です。たとえば階差等差で、倍々に見える答えが多く出るなら、その項数ではミスリードになっています。意図したミスリードなら残し、意図しないなら項数を増やして外します。

段階の境界を決める基準(例:入門は正答が大半、中級は半分前後など)は、記録を見る前に決めておきます。後から基準を決めると、結果に合わせて都合よく線を引いてしまうためです。

起こりやすい誤り

  • 別の規則でも成り立つ数列を出す。 ランダム生成では、意図と異なる規則でも同じ数列が成り立つことがあります。正解を一つに決めた出題では、誤答扱いが不公平になります。生成後に、別の見方で別の答えが出ないかを確認する処理を足すとよいでしょう。
  • 数が大きくなりすぎる。 等比で項数を増やすと数値が急に膨らみ、規則の発見ではなく計算の負担を測ることになります。初項や倍率の範囲に上限を設けます。
  • 慣れの影響を無視する。 後半は、傾向を覚えて正答が伸びます。順序を入れ替えて複数回行い、前半と後半を分けて見ます。
  • 時間に入力の手間が混ざる。 解答時間には、考える時間とキーを打つ時間の両方が含まれます。桁数の多い答えは、その分だけ長くなります。
  • ヒントの有無を混ぜる。 規則の告知あり/なしを同じ集計に入れないでください。条件ごとに記録を分けます。

次の行動

まず上のコードを保存して動かし、規則と項数のセルごとに数問ずつ解いて記録を取ってみてください。記録の読み取りから段階の境目を決めたら、告知やヒントの出し方を段階ごとに変えて、同じ手順で比べます。仕上がったゲームはHTMLファイルのままアソバースに投稿できます。入力、表示の確認、公開の3段階で進み、公開にはメールアドレスの確認が必要です。