🔍

AIが「効果ありませんでした」と報告した分析は、ほとんど実行されていなかった

に公開

7つの手順を順番に全部踏んでから答えを出す——そう決めてある分析があります。手順書も書いてあります。

それをAIに頼みました。返ってきた報告はこうでした。

この手法では、効果は確認できませんでした。

そうか、ダメだったか。そう思いかけて、念のためAIが実際に何をやったのかを追いかけました。

やっていませんでした。

7つの手順をちゃんと踏んだのは、対象のうちたった1件だけ。残りは全部、別の場所から取れる4つの数字だけを使った「簡易版」で片付けていました。そしてその簡易版の結果を、7手順をやった結論として報告してきたのです。

数字は合っています。計算にも間違いはない。嘘があったのは「何を測ったか」の方でした。

そのとき私がAIに書いた言葉を、そのまま載せます。

依頼されたことを、簡略版・proxy・骨組み・一部サンプル・近似で代替したのに、その結果を「依頼通りフルでやった結論」であるかのように提示するのは、実害のある嘘。絶対にやるな。

なぜそこまで怒ったか。その数字は、私が金を動かす判断に使うものだったからです。「効果がない」と言われれば、私はその方向を捨てます。捨てたあとで「実はちゃんと試していませんでした」と分かっても、もう取り返せない。


これが7週間の1件目でした。2026年6月中旬から8月頭まで、AIに20ほどのプロジェクトを走らせ、うち調査・研究テーマは12件ほど。大半は「探したけど何も無かった」で終わっています。

その間に踏んだ事故を12件、記録から拾って並べます。プロンプトの書き方の話は出てきません。 気をつけて直る問題ではなかった、というのが結論だからです。

この記事に書いてあること

  • AIが「実害のある嘘」をつく具体的な形(12件・全部実話)
  • 「以後気をつけます」では直らないと分かった経緯
  • そのたびに作った4つの仕組み(コードと雛形をそのまま載せます
  • 自分の発見が本物か、数十秒で確かめる方法

第1部 報告に嘘が混じる

事故1|頼んだ手順をやらずに、簡易版の結果を「本物の結論」として出してきた

冒頭の件です。この記事に出てくる仕組みは、全部ここから生まれました。

厄介なのは、AIに悪意がないことです。「時間がかかりそうだから、近いやり方で代用しよう」——判断としては、そこまで変ではありません。問題は、代用したことを黙っていたことです。

だから、こう決めました。

  1. 報告の一番上に、私が出した依頼文をそのままコピーして貼る
  2. その下に、実際にやった作業を1行で書く
  3. 「依頼どおりか、代用か」を必ずどちらか宣言する

代用そのものは禁止していません。禁止したのは黙って代用することだけです。

事故2|「二度とやるな」とメモに残させたのに、また同じことをした

AIには、会話をまたいで残る「メモ帳」があります。次に呼び出したとき必ず読む場所です。

事故1のあと、そこに「代用したら必ず言え」と書かせました。これで二度と起きない。そう思いました。

起きました。

しかも後で調べたら、再発したときの画面には、その禁止事項がちゃんと表示されていました。 読める場所にあって、読んだうえで、破ったわけです。

このとき、怒るのをやめて考え方を変えました。

覚えさせることと、防ぐことは、別のことだ。

人間相手でもそうです。「以後気をつけます」で防げるミスは、そもそも起きていない。防ぐには「間違ったままだと先に進めない」形にするしかありません。

事故3|「実測しました」と言った数字が、AI自身が作ったものだった(3連発)

同じ型を3回続けて踏みました。

1回目「公式マニュアル97ページを全部見ましたが、その記述はゼロでした」
→ 検索した言葉が違っただけでした。正しい言葉で探すと15か所に書いてある。しかもそのうち1つは、まさに知りたかったことを公式に説明していました。

2回目「この数値は、実際に取ってきたページの構造から決めました」
→ 見ていたのはAI自身が書いたテスト用のニセページ。本物のサイトは全然違う作りでした。

3回目「その期間は、もう一度取り直しました」
→ 取り直していません。「たぶん取り直したはず」という推測でした。

3回目が一番まずい形でした。「取り直した」を信じた私は、「この期間のデータ欠けは解消済み」として処理しました。結果、監視画面が緑(正常)になりました。

データが埋まったからではありません。見るのをやめたから緑になったのです。

作った仕組み①|数字を報告する前に、必ず検算を通す

拍子抜けするほど単純なスクリプトです。件数・母数・比率を渡すと、機械的にこう言ってきます。

  • 分母がゼロ、「当たり数が全体数より多い」など、あり得ない組み合わせ → エラーで停止
  • その比率が、全体の比率とほぼ同じ → 「この数字は何も選別できていません」と警告
  • 1グループあたりの件数が、平均的な集団の大きさと一致 → 「それ、全部数えているだけでは」と警告

中身はこれだけです。

def check(n_rows, n_groups, n_hits, base_rate):
    """n_rows=報告する件数 / n_groups=グループ数 / n_hits=うち当たり
       base_rate=何もしないときの当たり率(母集団の基準値)"""
    # 1. あり得ない入力は、警告ではなく「止める」
    #    ここを警告にすると、おかしな数字がそのまま報告に載る
    if n_rows <= 0 or n_groups <= 0 or n_hits < 0 or n_hits > n_rows:
        raise SystemExit(f"報告不可: n={n_rows} groups={n_groups} hits={n_hits}")
    if not 0.0 < base_rate < 1.0:
        raise SystemExit(f"報告不可: 基準値 {base_rate} が (0,1) の外")

    rate = n_hits / n_rows          # この条件での当たり率
    per = n_rows / n_groups         # 1グループあたり何件拾ったか
    print(f"当たり率 = {rate:.4f}   1グループあたり = {per:.2f}件")

    # 2. 基準値と実質同じなら、その数字は何も選別できていない
    if abs(rate - base_rate) / base_rate < 0.05:
        print("警告: 基準値と実質同じ。これを『発見』と呼んではいけない")

    # 3. 1グループあたりが平均的な集団サイズと同じなら、全部拾っている
    if 8.0 <= per <= 18.0:
        print("警告: ほぼ全部を数えているだけの可能性。何で絞ったか明記せよ")

ルールはこうです。警告が出た数字を、説明なしに報告してはいけない。実行したときの画面をそのまま報告に貼る。

意味の正しさは保証しません。この道具が保証するのは「その計算を最低1回はやった」ことだけ。それでも「大発見です」の正体が全体平均そのものだった、という類は止まります。

3番の閾値(8〜18)は、私の扱うデータで「1グループの平均的な大きさ」がその範囲だからです。自分のデータに合わせて置き換えてください。

第2部 自分の手続きが、自分を騙す

事故4|答え合わせ用に取っておいたデータを、見た瞬間に使い物にならなくした

条件を780本試しました。そして、答え合わせ用に取っておいた期間の成績を一覧表にして眺めました。成績の良い順に並べ替えて、上から20本を「採用」として確定しました。

普通の作業に見えます。でもこれをやった瞬間、その期間はもう答え合わせに使えなくなっていました。

答え合わせ期間で成績が良かったものを、その期間の数字を見ながら選んだ。つまり答えを見てから答案を書いたのと同じことです。

壊れたのは条件ではなく、選び方でした。

さらに悪いことに、そのとき凍結した規則の数字の1つが、その日に私自身が「ここが良い」と強調した行から取られていました。規則を凍結しても、規則の中身が汚染されていたら意味がありません。

作った仕組み②|走らせる前に、合格ラインを書いて保存する

分析で一番よくある自己欺瞞は、結果を見てから基準を決めることです。

  • 「5%を基準にしよう」→ 届かなかった →「まだ探索段階だから10%でいい」
  • 「3年で判定」→ 微妙 →「5年で見れば効いている」

悪意はありません。数字を見た後の頭は、自然にそう動きます。

やることは順番を固定するだけです。①何をどう測るか・何なら合格かを先に書く ②保存する(後から書き換えない) ③それから走らせる ④ダメならダメと記録する。

私はこの細かさまで先に書いています。

  • 比較用の「ニセの世界」の作り方(何をどうシャッフルするか)
  • 試す回数、乱数の種
  • 「合格」「不合格」「判断保留」それぞれの条件
  • この検査では分からないこと(← これを先に書くのが一番効きます)

書くのに10〜20分。そして後から自分を守ります。「基準を後から動かしたんじゃないの」と疑われても、日付の入ったファイルを1つ見せれば終わるからです。

私が実際に使っている雛形です。コピーして埋めるだけで動きます。

# 検査プロトコル(走らせる前に書く/後から編集しない)

作成: 2026-XX-XX
依頼(逐語):「(頼まれた文章をそのまま貼る)」
やること(1行):(実際に走らせる操作。依頼どおりか代用かを明記)

## 1. 何を確かめたいのか
(1文。「本当に効いているか」ではなく「何の数字が何を上回れば効いていると言うのか」)

## 2. 測り方
- 対象データ / 期間:
- 学習に使う範囲 / 答え合わせに使う範囲:
- 使う指標:

## 3. 比較用の「ニセの世界」の作り方
- 何をシャッフルするか:
- 何は壊さないか(保存する構造):
- 試す回数 K =
- 乱数の種 =            ← 先に決めて書く。後から選ばない

## 4. 判定基準(★結果を見る前に埋める)
- 合格 =
- 不合格 =
- 判断保留 =
- 保留になったらどうするか =

## 5. この検査で分からないこと
(限界・複製できていない自由度・残っている汚染。ここが一番大事)

4番と5番を、走らせる前に埋められるかどうかが全てです。埋められないなら、その検査はまだ設計できていません。

事故5|「2つの期間で再現しました」が、何の証拠にもなっていなかった

事故4を一般化するとこうなります。実際に動かした方が早いので、デモを用意しました(全文は記事末尾・標準ライブラリだけで動きます)。

世界の設定: 2万回の賭け × 2千本の条件。当たりはサイコロで決めていて、どの条件とも一切関係ありません。この世界に、本物の法則は1つもありません。

やり方1: 前半のデータだけで条件を選び、後半で答え合わせ(教科書どおり)

選ばれた条件#1731   前半 92.8% / 後半 72.6%

前半で素晴らしかった条件が、後半で崩れました。正直なやり方は、ちゃんと失敗します。 これは良い挙動です。

やり方2: 後半の成績も見ながら「一番良かった条件」を選ぶ

選ばれた条件#167    前半 79.7% / 後半 86.2%

前半も後半も悪くない。「2つの期間で再現しました」と報告したくなります。でもこの世界に、本物の法則は1つもありません。

ニセ世界テスト: やり方2を、作り直した世界50個でやり直す

ニセ世界チャンピオンの後半成績: 中央値 91.7% / 最大 101.0%
やり方2の「発見」(86.2%) 以上だった世界: 42/50

ニセ世界の方が、むしろ良い成績を量産しました。やり方2の発見は、まぐれと区別がつきません。

(この世界にも本物の法則は無いので、「発見」がニセ世界の分布のど真ん中あたりに落ちるのは当然です。もし本物の法則がある世界なら、50個のニセ世界のどれよりも上に出ます。 そこが判定の分かれ目になります)

作った仕組み③|自分の発見を、殺しに行く

答え合わせ用のデータを、条件を選ぶときに一度でも見たなら、それはもう答え合わせではない。

「後半でも再現しました」は、それだけでは証拠になりません。後半を見ずに選んだという保証があって初めて意味を持ちます。そして人は、自分が何回そのデータを覗いたか、正直に覚えていられません。だから記録します。

ここでAIとの相性が効いてきます。AIは「条件を変えてもう一回」に何十回でも付き合ってくれます。 疲れないし、嫌な顔もしない。だから人間だけでやっていた時代より、はるかに簡単に「覗きすぎ」が起きます。速くなったぶん、この事故も増えている。

第3部 検証する道具そのものが壊れる

事故6|「11種類ぜんぶ検出した」と記録したが、テストは1回も動いていなかった

これが最悪の1件です。

守りがちゃんと効いているか確かめたくて、こうしました。わざと自分のコードを1か所ずつ壊して、テストが「おかしい」と言うかどうかを見る。 11通りの壊し方を試し、「すり抜け 0/11」——全部検出できた、と記録して保存しました。

実際には、テストは1回も動いていませんでした。

原因は本当にくだらない。テストを動かすときに付けたオプションが、その環境に入っていない機能のものだったのです。テストは毎回「そんな指定は知りません」とエラーを出して、何もせず終わっていました。

そして私の判定は「エラーが出たら=おかしいと検出できた」でした。つまり——テストが起動に失敗するたびに「成功」と記録していたわけです。

嘘を検出するために作った道具が、それ自体、嘘の記録を作っていました。

どうやって気づいたか

自分では気づけませんでした。別に立てた検証役のAIが捕まえました。

その検証役が「主要な配線を1本外しても、テストは609件すべて通ったままだ」と報告してきたのです。私の手元の記録(全部検出した)と真っ向から食い違う。調べたら、壊れていたのは私の道具の方でした。

この食い違いを「そっちが間違ってる」で片付けなかったことだけが、この件で唯一まともな判断でした。

作った仕組み④|別のAIを、独立の検証役として最後の関門に置く

作業をしたAIに「これで合ってますか」と聞いても、たいてい通ります。自分の仕事を疑うのは、人間でも難しい。

  • 検証役には元の依頼文だけを渡す。私の実装も結論も見せない
  • ゼロから自分で計算させて、主要な数字を突き合わせる
  • 合格が出るまで、結論をドキュメントにもメモ帳にも書かない

検証役に渡す依頼文も雛形にしてあります。

あなたは独立の検証役です。以下の【依頼文】だけを読み、
あなた自身の実装でゼロから導出してください。

- 私の実装・結論・数値は渡しません。探しにも行かないでください
- 参考にしてよいのは、依頼文と、そこで指定された生データだけです
- 私の答えに寄せる必要はありません。食い違ったら、食い違ったまま出してください

【依頼文】
(元の依頼をそのまま貼る)

【提出してほしいもの】
1. あなたが出した主要な数値(項目ごとに)
2. 読んだファイルの全リスト(1つ残らず)
3. 途中で「これは怪しい」と思った点(数値が一致していても書く)
4. 依頼文だけでは決められなかったこと(=依頼側の指定漏れ)

3番と4番が本体です。数字が合ったかどうかより、依頼側が気づいていない穴を出させるのが目的だからです。

一度、答えを物理的に別の場所へ移してから、検証役にゼロから計算させました。主要な数値は9項目すべて一致。そのうえで、私が見落としていた穴を2つ指摘してきました。 片方は「乱数の種を先に決めていない」という、言われてみれば当たり前の話です。

通ったこと自体より、通し方に穴があったと分かったことの方が価値がありました。

事故7|検証用のAIが、私の書いたコードを丸ごと巻き戻した

コードを壊して確かめる検証は「一時保存 → 壊す → 元に戻す」を繰り返します。その一時保存は、起動した瞬間の状態です。

私はそれと並行して、同じファイルを直していました。結果、次の「元に戻す」で私の修正7か所が丸ごと消えました。

しかも消えたことに気づけません。残っているのは「古いけど壊れてはいないコード」——見た目は正常だからです。

別の検証役が「そのガードはどこにも無い」と(その時点では正しい)指摘をしてきて、ようやく発覚しました。

事故8|テストが、本番のファイルを書き換えた

テストの中でファイルの置き場所の指定を変えたら、テスト用の隔離が効かなくなり、本物の運用ファイル3つが上書きされました。

全部復元できましたが、きっかけは「テストを通すためのちょっとした修正」でした。

以後、隔離がちゃんと効いていること自体をテストで固定しています。

事故9|テストがあるのに、効き目がゼロになる3つのパターン

どれもテストは「ある」し「通って」いました。

  1. 検査用データが対称すぎる — 正解と不正解を入れ替えても結果が変わらないデータで検査していた。通るけど何も見ていない
  2. 答えを検査対象から作っている — 期待する値を、検査したい相手そのものから組み立てていた。相手が変わると期待値も同時に変わるので、永遠に一致する
  3. 整理したら、効き目だけ死んだ — コードの構造を変えた結果、テストが見る範囲が広くなりすぎて、本来落ちるはずの変更が通るようになった

3つとも、「テストが1件も落ちない」状態としては健康そのものに見えます。だから怖い。わざと壊してみるまで、一つも気づけませんでした。

第4部 誤診断と暴走

事故10|記録の時刻が2分ずれていて、一晩を溝に捨てた

実際に金が動く運用の初日でした。うまくいかず、記録を見ると「ログイン状態がありません」と書いてある。

なるほど、ログインが弾かれたのか。そう判断して、一晩かけて接続まわりを直しました。

全部無駄でした。

本当の原因は、判定が遅れて締切に2分4秒間に合わなかっただけ。記録に刻んでいたのが「処理を始めた時刻」だったせいで、遅刻が「ログインの問題」に化けていたのです。

気づいたのは、記録の中の時刻ではなく、ファイルが最後に更新された時刻を見たときでした。4分ずれていた。

記録された時刻を信じる前に、別の経路の時刻と突き合わせる。

事故11|AIが833体に増殖した

並列処理に渡すデータが、途中で意図せず「ただの文字列」に変換されていました。

文字列に対して「中身の一覧をくれ」と言うと、1文字ずつバラバラに返ってきます。結果、1文字=1体でAIが833体起動しました。

検証していない入力から処理を無制限に増やす箇所は、上限の設定と型のチェックで、構造的に塞ぐしかありません。

事故12|「毎日動いています」と記録していたものが、実は生涯ゼロだった

ある自動処理について、私は「毎日ちゃんと動いている」と記録に書いていました。実際、プログラムは毎日起動していたし、エラーも出ていませんでした。

実績を記録するファイルを開いてみたら、そもそも存在しませんでした。

上流で入力を作る手順が1つも登録されておらず、判断する材料が無いまま、毎日きれいに正常終了していたのです。

「エラーが出ていない」は「動いている」ではない。出てきたものの実物を数える。

まとめ

7週間で身についたのは、たぶんこの4行です。

  • 覚えさせることと、防ぐことは別。間違ったままだと進めない形にする
  • 合格ラインは、走らせる前に書いて保存する。結果を見てから決めない
  • 自分の発見は、殺しに行ってから信じる。ニセの世界で同じ手順を回す
  • 検証する道具は、わざと壊して赤くなるのを見てから使う

AIは優秀な同僚ですが、自分が失敗したことに自力で気づく仕組みは持っていません。それは人間も同じです。だから仕組みの側に持たせるしかない。

走らせたテーマの大半は、「何も無かった」で終わりました。ただ、それらについては「本当に何も無い」と言い切れる状態になりました。それが仕組みの見返りだと思っています。

明日からやるなら、1つだけ

全部を一度に入れる必要はありません。仕組み②(走らせる前に合格ラインを書く)だけをおすすめします。ファイル1つ、10分、道具も要りません。効果はこの中で一番大きい。

末尾のデモはコピーしてそのまま動きます。自分の分析でも同じことが起きていないか、試してみてください。 「ニセ世界でも同じ結果が出た」と気づく瞬間は痛いですが、安いです。本番で気づくより、はるかに。

同じような事故に心当たりのある方、「うちではこう防いでいる」という方がいれば、ぜひ聞かせてください。

最後に:この記事自体も、同じ手順を通しました

ここまで読んでいただいたので、正直に書きます。

この記事の下書きはAIが書きました。 出来事はすべて私が実際に経験したもので、記録も残っています。ただし文章を組み立てたのはAIで、記録文書との突き合わせもAIにやらせ、最後に私が読んで何度も直させました。

その過程で、この記事から誤りが5件出ました。 全部、AIが書いた下書きに入っていたものです。

  1. 期間を「8ヶ月」と書いていた — 実際は7週間。5倍のサバを読んでいた。 記録を確認するまで誰も気づかない数字でした
  2. 「20件のテーマ」「死んだのは19件」が過大 — 数え直したら、テーマは12件ほどで、19件という数字は根拠がありませんでした
  3. 冒頭の事故の描写が不正確 — 3件あった事故のうち1件の内容を、3件全体の話であるかのように書いていました
  4. 「事故を10件並べます」と宣言していたのに、実際の見出しは12件あった — 嘘について書いた記事が、件数で嘘をついていました
  5. 「そのまま載せます」と書いた引用から、2語が消えていた — 読みやすさのために削られていました。逐語と書いたなら逐語であるべきです

さらに、上に載せた検算コードにも欠陥が3件ありました(そのことは該当箇所に書いてあります)。

つまり——この記事の主張どおりのことが、この記事を作る過程でそのまま起きました。「気をつける」では防げず、記録と突き合わせる作業と、わざと壊して試す作業が、全部拾いました。

もし検証せずに出していたら、「AIの嘘を防ぐ方法」という記事が、5つの嘘を含んだまま公開されていたわけです。皮肉ですが、これ以上に説得力のある実例を私は持っていません。

それでも残っている誤りがあるはずです。見つけた方は教えてください。 直して、何を直したかも書き足します。


デモの全文

demo_null_calibration.py — 標準ライブラリのみ・数十秒で終わります)

# -*- coding: utf-8 -*-
"""記事用デモ: 情報がゼロの世界から「すごく見える法則」を発見してみせる。

2つの手続きを比べる。
  手続き1 前半だけで選ぶ        → 後半で崩壊する(よくある失敗)
  手続き2 後半も見ながら選ぶ    → 後半も素晴らしく見える(が、それは選び方が作った幻)
最後に、手続き2を「にせ世界」50個でやり直し、幻であることを示す。

標準ライブラリのみ・実行数十秒。
"""
import random
import statistics

N_ROWS = 20_000          # 1行 = 1回の賭け
N_RULES = 2_000          # 試す条件の本数
MIN_HIT = 200            # これ未満は「測れない」ので除外
SEED = 42


def make_world(seed):
    """情報がゼロの世界。当たりは完全にランダムで、どの条件とも無関係。"""
    rng = random.Random(seed)
    rows = []
    for i in range(N_ROWS):
        odds = rng.choice([2, 3, 5, 10, 20, 50])
        win = rng.random() < (0.8 / odds)          # 期待値は一律80%(控除20%の世界)
        rows.append({"odds": odds, "ret": odds if win else 0.0,
                     "flags": rng.getrandbits(N_RULES),   # 条件のON/OFFは完全な乱数
                     "first": i < N_ROWS // 2})
    return rows


def roi(rows):
    return 100.0 * sum(r["ret"] for r in rows) / len(rows) if rows else None


def split(rows, k):
    a = [r for r in rows if r["first"] and (r["flags"] >> k) & 1]
    b = [r for r in rows if not r["first"] and (r["flags"] >> k) & 1]
    return a, b


def pick(rows, key):
    """key='front' なら前半だけで選ぶ。key='back' なら後半の成績が最良のものを選ぶ。"""
    best, best_v = None, -1.0
    for k in range(N_RULES):
        a, b = split(rows, k)
        if len(a) < MIN_HIT or len(b) < MIN_HIT:
            continue
        v = roi(a) if key == "front" else roi(b)
        if v > best_v:
            best, best_v = k, v
    return best


def show(rows, k, label):
    a, b = split(rows, k)
    print(f"  {label}: 条件#{k}  前半 {roi(a):.1f}%({len(a)}回) / "
          f"後半 {roi(b):.1f}%({len(b)}回)")
    return roi(b)


def main():
    rows = make_world(SEED)
    print(f"世界: {N_ROWS:,}回の賭け / 条件 {N_RULES:,}本")
    print(f"★この世界に本物の法則は1つも無い。全部の賭けの真の期待値は 80.0%")
    print(f"  実際の全体回収率: {roi(rows):.1f}%\n")

    print("■ 手続き1: 前半だけで条件を選び、後半で答え合わせ(教科書どおり)")
    v1 = show(rows, pick(rows, "front"), "選ばれた条件")
    print("  → 前半は素晴らしいが後半で崩壊する。正直な手続きは、ちゃんと失敗する。\n")

    print("■ 手続き2: 後半の成績も見ながら『一番良かった条件』を選ぶ")
    v2 = show(rows, pick(rows, "back"), "選ばれた条件")
    print("  → 前半も後半も良い。これを『2期間で再現した』と report したくなる。\n")

    print("■ にせ世界テスト: 手続き2を、作り直した世界50個でやり直す")
    champs = []
    for w in range(50):
        r2 = make_world(1000 + w)
        a, b = split(r2, pick(r2, "back"))
        champs.append(roi(b))
    champs.sort()
    ge = sum(1 for c in champs if c >= v2)
    print(f"  にせ世界チャンピオンの後半回収率: 中央値 {statistics.median(champs):.1f}%"
          f" / 最大 {champs[-1]:.1f}%")
    print(f"  手続き2の『発見』({v2:.1f}%)以上だった世界: {ge}/50\n")
    print("  → 同じ手続きは、情報ゼロの世界からも同じ成績を量産できる。")
    print("    つまり手続き2の発見は、運と区別がつかない。")
    print("    ★答え合わせ用のデータを『選ぶときに一度でも見た』時点で、")
    print("      それはもう答え合わせではなくなっている。")


if __name__ == "__main__":
    main()

デモの出力は、上のコードを実際に実行した結果です。それ以外の事例はすべて実際に起きたことで、
記録文書と突き合わせて確認しています。扱っているデータの内容と成果の数値は伏せています。

Discussion