![見出し画像](https://assets.st-note.com/production/uploads/images/140734726/rectangle_large_type_2_d93fceb7f8204749bb6da88b7967cd7f.png?width=1200)
「足したり、引いたり、掛けたり、割ったりして答を24にしたまえ」
「笑わない数学者」森博嗣
上記作中の算数問題です。
そこの周辺だけネタバレです。
(周辺状況も少しだけネタバレします。本筋とはさして関係ないと思います。多分。あと、Dobble(Spot It!)というカードゲームについても話します。)
推理小説シリーズの1作です。
”理系”推理小説として有名です。
面白いですよ。お読みでない方は是非。
さて。
随分ぶりにシリーズ読み直しをしています。
しかし、まだ読み直しができていないので、
作中の算数の問題を考えて時間を潰してみます。
作中序盤に2つ問題が出されます。
A, B とでも呼びましょうか。
1つ目。問題A。
「まず、ちょっとした、算数の問題を出そう。考えたまえ」
A-1
「10が二つ、4が二つある。どんな順番でも良いから、これらを全部使って、足したり、引いたり、掛けたり、割ったりして答を24にしたまえ」
登場人物の萌絵ちゃんの同級生の片山和樹君が1分後には解けています。もちろん犀川先生も。多分、西之園君も。
やってみてください。
割と普通に難しいですよねぇ。
(本シリーズ、登場人物には多数の天才が・・・)
そもそも天才数学者とはいえ、いきなり別荘とかに呼ばれてコレやられたらウケますね。
犀川もちょっとそういう反応ですが。
(いや、こういう人いると思います。実際。(ここまでの天才じゃなくても。)
僕は好きです。こういう人。
広い別荘みたいなところに呼んでくれる時点で楽しそうですけども
(殺人事件は御免こうむりますが)。
ただ、この問題自体は微妙に嫌いです。
まぁ、僕は計算が嫌いなので難しくも感じます。
頭が回転しない。
(首から上が回るマジックの種なら分かります)
小・中学生当時はずっと早くできた様な。
(いや、その時から具体的な計算は嫌いでした)
この問題なんて言うんですかね。
make 24, find 24とでもいいいますか。
多分、有名な問題だと思います。
4つの数字を四則演算で組み合わせて、24にしろという奴ですね。
オリジナルは何で、いつからあるんでしょうか。(誰か教えて)
どうして24なんでしょうか。
10を作るっていうバリエーションもありますよね。
(メイクテンって聞いたことある気がします)
この問題は、次の組み合わせでも問われます。
A-2
「では、今度は7が二つ、3が二つだ。この四つの数で同じように24を作りたまえ」
先ほどの(A-1)より難しい、と作中で表現されています。
正直、どっちが難しいかと問われると同じくらいではないか、という風に僕は思ってしまいます。(どちらも僕には結構難しい。)
さて、これらの問題の答えです。
(作中にも書かれていますが)
(さらに、ほかの組み合わせによる問題も作中に現れます)
A答え
$${(10\times10 - 4) \div 4}$$
これが答えですね。一回100という大きな数にして大丈夫というのが少し意外な感じがしますかね。次です。
$${(3 + (3 \div 7)) \times 7) }$$
ですね。
7分の3を作って、それに3を足して、7分の24を作るところがポイントと言えばポイントでしょうか。分数が必要ってことですね。
だからアイディア的に難しいのかな。
ただ、分数にするというのは、要は計算にカッコが入るのと同じですから、どうですかね。さして変わらない難易度な気がします。
いや、カッコが多い分だけ難しいわけですね。
A-1はカッコが一つ
A-2はカッコが二つ
計算が早い人はあんまり考えずにパって答えが出るから逆に難易度差があるんでしょうかね。
さて、ChatGPT3.5にやらせてみます。
「10が二つ、4が二つある。どんな順番でも良いから、これらを全部使って、足したり、引いたり、掛けたり、割ったりして答を24にしたまえ」
=>プロンプトとして使用
このパズルはよく知っています。解き方はいくつかありますが、ひとつの方法は次の通りです。10を2倍して20にします。
残った10に4を足して14にします。
14を2で割って7にします。
20を7で足して27にします。
27を4で引いて23にします。
もう一つの10と4の組み合わせで、23に1を足せば24になりますね。
あー、ダメですね。
(「たまえ」とか言ったから「知っています」とか生意気になってたり?)
やりたい放題です。
10を2倍して20にします。
どこに2がある。(何処にも無い!)
残った10に4を足して14にします。
どこに4がある!(何処にも無い!)
もう一つの10と4の組み合わせで、23に1を足せば24になりますね。
え?
英語で聞いてみると、すこーしだけマシな感じですが、4を何回も使ったりしました。(偶然できた時もあるにはある。まぁ、数えたり計算したりは特に苦手だからね。)
じゃあ、コーディングでなら出来るかなと思ってChatGPTに聞いてみました。結果は?というと、
出来たりできなかったり。
という感じです。
部分的に良いところがあるので、どっかから直接コピペ状態なんでしょうね。有名問題ですから。
(割と有名どころのコードとか文章は、これ見たことあるなというのが出てきますよね。あ、あの人のgithubにこれあるな、みたいな。人間の記憶力もいい加減とはいえ、侮れません。)
とにかくちゃんとは出来ません。
(まぁ、論理力は殆ど無いですからね。まぁ、プロンプトが悪いのかもしれない。)
15分ぐらいプロンプトエンジニアリング(なんて大層な事は僕にはできないんですが)したところ、僕には思ったようにやらせることができませんでした。
偶然、特定の組なら答えが出るというのはあるのですが。
(実際、作中の難易度で最も優しいA-1までは解けるコード。)
というわけで自分で書いてみました。
(結局もう20分かかる。もう。)
いろいろな解き方があると思いますが、僕が考えたのは
逆ポーランド記法を使う
ことでした。
(まぁ、一番安直かも)
逆ポーランド記法
(RPN: Reverse Poland Notation)というのは、
1 + 2
を
1 2 +
という風に書く記法です。
左から読んでいって演算記号に出会ったら前の2つの数字たちにその演算を適合する、という方法で計算します。(実際のコードもそう書くだけです)
多分、コンピュータサイエンスとか電卓の仕組みとかの基礎としてすぐに習うやつですね。
カッコが不要というのが、使おうと思った理由です。
なので
10, 10, 4, 4, 演算子4種3個
を並べ替えて虱つぶせば良いわけです。
左から順に読んで行ったときに、
常に 数字の数>演算子+1 の状態を維持しながら虱潰します。
(2個数字が先に無いと、演算子を使いようがない。
中置記法(=普通の計算の記法)でいえば左右に数字がないのに+とかだけあっても困るでしょう、ということですね。)
これを頑張って説明しても、ChatGPT4 にやらせられない。
(RPNを生成してっていうので躓く。RPNとしてvalidかどうかの判定ができない。数字の数>演算子+1がいろんな形で言っても分からない。
勝手にやらせると、網羅的でない順列生成とかをしてくる。
割とそのまんまの解説の文章がありそうなシチュエーションだけどなぁ。)
で実行結果です。
A-1
10,10,*,4,-,4,/, => 24
10,10,*,4,-,4,/, => 24
10,10,*,4,-,4,/, => 24
10,10,*,4,-,4,/, => 24
えっと、適当に書いたので同じ数字があった時のことを考えていなかったので、4パターン出てきていますが、全く同じですね。
$${(10\times10 - 4) \div 4}$$
です。
これ以外に答えは無い様です。
(頓智を使えばあるいは)
では次A-2ですね。
7,3,7,/,3,+,*, => 24
7,3,3,7,/,+,*, => 24
7,3,7,/,3,+,*, => 24
7,3,3,7,/,+,*, => 24
7,3,7,/,3,+,*, => 24
7,3,3,7,/,+,*, => 24
7,3,7,/,3,+,*, => 24
7,3,3,7,/,+,*, => 24
3,7,/,3,+,7,*, => 24
3,7,/,3,+,7,*, => 24
3,3,7,/,+,7,*, => 24
3,3,7,/,+,7,*, => 24
3,7,/,3,+,7,*, => 24
3,7,/,3,+,7,*, => 24
3,3,7,/,+,7,*, => 24
3,3,7,/,+,7,*, => 24
結局は
$${(3 + (3 \div 7)) \times 7) }$$
だけです。
なんか、無駄にいっぱい出ていますね。
(恥ずかしい。まぁプロでも何でもないので目を瞑ります。)
先ほどの同じ数字の重複と
掛けるとか割るとかの順番の可換と
を気にしていないので、16通りになっています。
が、全部同じですね。
という訳で、基本的には1つの答えってことですね。
次に気になってくるのは、
どんな数字の組でもできるのか?
あたりでしょうか。
まぁ、流石にできない組はあるはずですね。
1から10で二つずつ同じ数字という組で見ますと、
出来ないのは
--- NGs are below ---
[ 1, 2 ]
[ 1, 3 ]
[ 1, 7 ]
[ 1, 9 ]
[ 1, 10 ]
[ 2, 9 ]
[ 3, 10 ]
[ 4, 6 ]
[ 4, 9 ]
[ 6, 7 ]
[ 6, 9 ]
[ 6, 10 ]
[ 7, 8 ]
[ 7, 9 ]
[ 7, 10 ]
[ 8, 9 ]
[ 8, 10 ]
[ 9, 10 ]
という具合ですね。
まぁ、適当な数字の2組を考えなしに言っても、半分以上は助かっていますね。
作中人物は考えなしに言うようなキャラじゃあ無い訳ですが。
(これで「たまえ」とか言ってたらウケましたが。)
天王寺翔蔵ごっこ
出来ますね。
(特に西ノ園君みたいな頭の回転が速い若者がいる場合に良いですね。)
(まぁ、あんなに凄い人は居ないにしても。)
〇二つと△二つとで24を作ってみたまえ
(〇や△には脳死で1から10の数字を入れる)
適当な数字を言いましょう。
だいたい大丈夫ですよ!
(今日から、あなたも天才数学者!)
答えの確認は簡単です。
(四則演算が出来ればよい。)
非対称性です。
出し得です。
(暗号理論に使えますか?)
優秀な若者が正解したら?
「正解だ。●分で解けるとは回転が速い」
と言いましょう。
ここまでがセットです。
(さぁ、皆さん。今年のお盆当たりにでも、親戚の優秀な若者にでもやりましょう。小学生から大学生まで行けます。多分。)
![](https://assets.st-note.com/img/1715803419328-ThhBycKQf6.png)
赤は24できません。
萌絵ちゃんが最終盤に犀川先生に出す奴は丸目誤差が出るので、
プログラムで解くときはうっかりすると浮動小数点演算が理由で赤になります。
(2を基数とする指数表現なので、3とかで割ると循環小数的になり誤差が出ます。)
さて、長々と話しました。
次です。
問題Bと呼びましょう。
問題B
「さて、ではもう一つ問題を出そう。五つのビリヤードの玉を、真珠のネックレスのように、リングにつなげてみるとしよう。玉には、それぞれナンバが書かれている。さて、この五つの玉のうち、幾つ取っても良いが、隣どうし連続したものしか取れないとしよう。一つでも、二つでも、五つ全部でも良い。しかし、離れているものは取れない。この条件で取った玉のナンバを足し合わせて、1から21までのすべての数ができるようにしたい。さあ、どのナンバの球を、どのように並べて、ネックレスを作ればよいかな。」
こちらは、明らかに難しいですね。
小・中学生時代に友達と
これがMAXなのか?
6個の場合どうなる?
7個の場合どうなる?
というのまでやりました。
なつかしい。
最大値である21が既に明かされているので、答えを得るのは意外と出来ます。人力でも。
しかし、面倒くさいので、Brute Forceです。力技です。
総当たりでやっても大したことはありません。
そう、コンピュータならね!
というわけでやってみました。
力技的には、こちらの問題のほうがコードは書きやすいです。
すぐ書けます。
作中にある5個の問題ですが、答えはコレですね。
(答えは作中には無かった気がします。)
21 was achievable: [ 1, 3, 10, 2, 5 ]
6個の場合は
31 was achievable: [ 3, 7, 1, 14, 4, 2 ]
ですね。
適当に数字の組を生成して、その順列も生成。
無理やり合計を連続したすべての場合で計算。
1から21まですべてチェック
という具合です。
さらに、6個の場合は最大が不明なので、それさえも順番に1からNまでできますか?と出来なくなるまで調べるという方法。
うーん。Brute Force。
(7個の時点で、コードを書くのより実行時間が長くなってしまった。7個の場合は、また今度にしましょう。)
この問題、数学的な背景が多分あると思うんですが、深いところはちょっと僕には難しすぎます。
わかる範囲で少しだけ触れていきます。
Cyclic Difference Set
っていうのがあります。
CDS
これもよく(ビーズ)ネックレスとかを例えに説明されます。
(似てますね)
数学的には
In combinatorics, $${a ( v , k , λ )}$$ (v,k,λ) difference set is a subset D of size k of a group G of order v such that every non-identity element of G can be expressed as a product d 1 d 2 − 1 $${d_{1}d_{2}^{-1}}$$ of elements of D in exactly λ ways. A difference set D is said to be cyclic, abelian, non-abelian, etc., if the group G has the corresponding property. A difference set with λ = 1 is sometimes called planar or simple.[1] If G is an abelian group written in additive notation, the defining condition is that every non-zero element of G can be written as a difference of elements of D in exactly λ ways. The term "difference set" arises in this way.
らしいですが、まぁ、こんなん意味が分からんので。
さっさとネックレスにご登場頂きます。
![](https://assets.st-note.com/img/1715790785199-uGW6mpmcOv.png)
ネックレスがあります。
赤色のビーズと緑色のビーズがあります。
赤色ビーズ同士でネックレスを切り出して
(赤ビーズは片方だけ含めて)
ビーズの数(長さ)を数えます。
(間のビーズの数ってパターンもありますね。)
どの赤ビーズ2個の組かによって全ての組毎に長さが異なります。
(1から21の任意の長さ!)
例えば
位置番号0-1のビーズで切れば1個の長さ
14-16で切れば2個のビーズ。
1-4の間で切れば長さ3。
0(21)-4で切れば長さ4。
という具合で、長さ21まですべての長さが作れます。
これは、実は
Perfect Difference Set
ってやつですね。
(知るか)
0-1-4-14-16-21
という赤ビーズの位置番号の”差”(=長さ)が
[ 1, 3, 10, 2, 5 ]
作中問題の答えのビリヤード玉の数字と同じ
になっています。
(まぁ、そのまんまじゃん、って話なんですけど。)
で、Cyclic Difference Setのネックレスは、すべての長さの組み合わせが異なるわけですから、選んだ2つの赤ビーズの
1個目の位置番号
2個目の位置番号
との差を比べればよいわけです。
やはり、同じような2次元の表を書けばよいわけですね。
(どこが何と同じなのか)
![](https://assets.st-note.com/img/1715793544378-bQ9Edwm1i1.png?width=1200)
セル内の数字は切り出されるネックレスの長さ。
全切り出し(ネックレスを切らない)もあるので、もう一つだけパターンがある。+1。
また、対称性があります。
例えば1-10までが決定されれば、残りも決まるわけです。
これを見ればわかるように、
(表に1から20が出来ていますね。21は全部取った場合なので、表にはありません。)
$${n^2 - n + 1}$$
パターン作れます。
縦×横で$${ n^2 }$$で
対角線分$${ -n }$$
それに全切り取りで$${ +1 }$$です。
というわけで、1から21が作れ、作中のビリヤード玉5個の場合は21が最大であっています。最小の長さのネックレスとなる場合Perfectになる訳です。
また、このnoteで暴力的に求めた6個の場合も31が最大であっています。
(1から31まで出来たので)
7個で(仮に1から出来るなら)43までが出来ます。
どうやって構成できるか?
というのが本論ですが、また今度にしましょう。
(と言うか恐らく本質的に難しい。が、ある程度までは何とかなります。)
で、これが何の役に立つのって話ですが。
色々あるらしいんですよ。
まぁ、なんだか知らんのですけども。
ゴロム定規
っていう想像上の定規がございまして。
これは定規なんですけど、マークしてある部分の差を測ると、どの任意のマークの距離も整数で異なっている、みたいな奴ですね。
(詳細はWikipediaあたりをご参照ください)
こういう問題と関連していると。
数学でだけの話でしょ?
って感じですが
実用的な話もあるみたいです。
フェーズドアレイレーダってのがありますね?
フェーズドってのはタイミングをずらしたって意味ですね。
アレイってのは、
配列とか
並べたものとか
ってことですけども。
可動部分なしに任意の方向に指向的な電磁波を発生させる装置な訳です(多分)
横一列の波紋発生装置から
波紋を複数発生させると特定の場所で波が重なって強い部分ができますね?
波紋の発生タイミング(フェーズ)を各発生場所でずらしてやると、重なるのが起きる場所も変わりますね?
ちょっと飛躍がありますけど
これを特定方向にだけ強いピークを出したいとします。
差が必ず異なる値になる。
そういう性質がなんか役に立つかもって気がしません?
(乱暴すぎるか。これもまた今度にしましょう。)
ということで、ゴロム定規が実際に使われます。
(本当に現代のテクノロジというのは、随分と込み入ったものまで使われているものです。(この程度で?って言われるかもしれないけど。))
もっと分かりやすく直接的に関係がある身近な例で言うと
Dobble
っていうゲームがあるんですが、それを生成する(自分で作る)のにもCDSは使えます。
(英語ではSpot It!という名前)
面白いですよ。
多分、Amazonとかで買えます。
多人数プレーのカードゲームで結構小さな子でも出来ますし、大人も楽しめます。
動画を見てもらうのがよいと思いますが
一応ルールを説明してみます。
トランプの「スピード」に似たゲームです。
50枚くらい丸いカードがあります。
1枚のカードに8種ほどの絵柄が描いてあります。
各カードは必ずお互いに共通の絵柄を1つ(は)持っています。
(すべてで共通というわけではない。任意の組で共通というだけ)
プレイヤーにはこのカードの手札が配られます。
手札は重ねて一番上のカードだけが見れます。
で、プレイヤー間で共通の場に1枚カードを出してスタートです。
手札のカードと場のカードに同じ絵柄を見つけたら
その絵柄の名前を宣言して、場にカードを重ねていきます。
先に手札を空にしたほうが勝ちです。
(他のルールもあるらしいですね)
で、このカードのどれでも互いに共通の絵柄を1つ持っているという性質が実はこのCDSと関係しているのです。(実際のゲームのカードは厳密にこの通りになっていないようですが)
ビーズの位置番号が絵柄を表しているとしましょう。
赤いビーズは、ある1枚のカードに乗っている絵柄を表しています。
ところで、ビーズの番号は回転に対して対称です。
(0番というのは恣意的に決めていますね?)
つまり、番号を1個分回転させて(0番を1番と呼びなおせます)
同じ位置関係のまま、赤ビーズの番号を1個ずらす(シフトする)ことができます。
この時の赤ビーズの番号は、必ず1つは元の回転前の赤ビーズの位置番号と同じ番号を共有して持ちます。
つまり、新たなカードの絵柄をやはり番号に基づいて決め、赤ビーズの番号のものをカードに載せることにする。
そうするとルールを満たしたカードがもう一枚できます。
ビーズは21個あるので、20のビーズシフト回転ができ、こうして絵が5個なら21個のカードができます。
Dobbleの仕組みの考え方はいろいろあります。
例えば、すべてのカードを7並べのように置いて並べ整理することを考えます。
ある絵柄を共通に持つカードをある直線上に並べることができます。
それを繰り返して並べていくと、複数の直線が見えてきます。
例えば、ライオンの絵柄があるとすると、ライオンの直線というものがあり、その上にライオンの絵柄を持つカード全てを並べられます。
同様にペンギンの直線というのも考えられます。
するとペンギンとライオンが共に載っているカードはその2つの直線の交点である、とも言えます。
このように考えると、射影”幾何”なんかで捉えることもできます。
つまり、CDSは幾何学とも関係しています。
組み合わせ幾何
って奴ですね。
割と応用したアルゴリズムがあるようです。
という訳で、たぶん作中のこの数学問題、なにか背景や意味があって出しているのだろうという気もするのですが、イマイチ僕には理解しきれません。
(まぁ、回転操作がある種意味があるかな、という気が多少します)
問題Bは割と難しめの問題の様に思いますし、答えも開陳されない?のでモヤモヤしている人もいるでしょうから、お役に立てば幸いです。
(もっとモヤモヤしたかも。結局、答え合わせだけの提供ですからね。しかし、一般の場合は解かれていません。(多分))
長々書きましたが、お付き合いありがとうございました。
と、言う訳で作中の問題も面白いですし、もちろん、作品自体も面白いのです。
「笑わない数学者」
是非。
読み返し終わったら、その辺もまた書きたいと思います。
ところで、Dobbleのオリジナルを作る事も可能ですね?
作ってみたまえ。絵柄が何個なら出来るかな。
グラフィック部分は、適当にChatGPTにでもやらせたまえ。
作るのはだるい。
という方はぜひ購入しましょう。
Dobble(Spot it!)。
こちらも面白いですよ。
追記
Grace Graphとかのほうが有名かもしれない。
この記事が気に入ったらサポートをしてみませんか?