以上をまとめると,冒頭の問題の答え(式)は,以下の10個になります.
アレイ図の応用問題
- 2×3×4=24
- (2×3)×4=24
- 2×3=6 6×4=24
- 2×(3×4)=24
- 3×4=12 2×12=24
- 2×4×3=24
- (2×4)×3=24
- 2×4=8 8×3=24
- 2×(4×3)=24
- 4×3=12 2×12=24
カッコを含む式,総合式・分解式を含め,「2と3と4のかけ算」の全組み合わせを求めるRubyスクリプトを作成しました.
#!/usr/bin/env ruby # multiply234.rb : Print all the expressions for multiplying 2, 3, and 4 together # by takehikom q = [2, 3, 4] q.each do |x| q2 = q - [x] q2.each do |y| z = (q2 - [y]).first puts "%d * %d * %d = %d" % [x, y, z, x * y * z] puts "(%d * %d) * %d = %d" % [x, y, z, (x * y) * z] w = x * y puts "%d * %d = %d, %d * %d = %d" % [x, y, w, w, z, w * z] puts "%d * (%d * %d) = %d" % [x, y, z, x * (y * z)] w = y * z puts "%d * %d = %d, %d * %d = %d" % [y, z, w, x, w, x * w] end end
実行結果は以下の通りです.
$ ruby multiply234.rb 2 * 3 * 4 = 24 (2 * 3) * 4 = 24 2 * 3 = 6, 6 * 4 = 24 2 * (3 * 4) = 24 3 * 4 = 12, 2 * 12 = 24 2 * 4 * 3 = 24 (2 * 4) * 3 = 24 2 * 4 = 8, 8 * 3 = 24 2 * (4 * 3) = 24 4 * 3 = 12, 2 * 12 = 24 3 * 2 * 4 = 24 (3 * 2) * 4 = 24 3 * 2 = 6, 6 * 4 = 24 3 * (2 * 4) = 24 2 * 4 = 8, 3 * 8 = 24 3 * 4 * 2 = 24 (3 * 4) * 2 = 24 3 * 4 = 12, 12 * 2 = 24 3 * (4 * 2) = 24 4 * 2 = 8, 3 * 8 = 24 4 * 2 * 3 = 24 (4 * 2) * 3 = 24 4 * 2 = 8, 8 * 3 = 24 4 * (2 * 3) = 24 2 * 3 = 6, 4 * 6 = 24 4 * 3 * 2 = 24 (4 * 3) * 2 = 24 4 * 3 = 12, 12 * 2 = 24 4 * (3 * 2) = 24 3 * 2 = 6, 4 * 6 = 24
総合式のみ,分解式のみにするには,「,」の有無でgrepを通しましょう.
$ ruby multiply234.rb | grep , 2 * 3 = 6, 6 * 4 = 24 3 * 4 = 12, 2 * 12 = 24 2 * 4 = 8, 8 * 3 = 24 4 * 3 = 12, 2 * 12 = 24 3 * 2 = 6, 6 * 4 = 24 2 * 4 = 8, 3 * 8 = 24 3 * 4 = 12, 12 * 2 = 24 4 * 2 = 8, 3 * 8 = 24 4 * 2 = 8, 8 * 3 = 24 2 * 3 = 6, 4 * 6 = 24 4 * 3 = 12, 12 * 2 = 24 3 * 2 = 6, 4 * 6 = 24
$ ruby multiply234.rb | grep -v , 2 * 3 * 4 = 24 (2 * 3) * 4 = 24 2 * (3 * 4) = 24 2 * 4 * 3 = 24 (2 * 4) * 3 = 24 2 * (4 * 3) = 24 3 * 2 * 4 = 24 (3 * 2) * 4 = 24 3 * (2 * 4) = 24 3 * 4 * 2 = 24 (3 * 4) * 2 = 24 3 * (4 * 2) = 24 4 * 2 * 3 = 24 (4 * 2) * 3 = 24 4 * (2 * 3) = 24 4 * 3 * 2 = 24 (4 * 3) * 2 = 24 4 * (3 * 2) = 24
カッコを使わない総合式は,以下のコマンドで求められます.
$ ruby multiply234.rb | grep -v -E '[,(]' 2 * 3 * 4 = 24 2 * 4 * 3 = 24 3 * 2 * 4 = 24 3 * 4 * 2 = 24 4 * 2 * 3 = 24 4 * 3 * 2 = 24
6行出ましたが,3!=6だからです.
3つの演算の全ての場合を書いたものはというと,『新式算術講義 (ちくま学芸文庫)』が思い浮かびます.
これはp.33の上段にある数式の並びで,前ページの「組み合はせの法則及交換の法則に従ふ算法を多くの数に順次施行するときは其順序は最後の結果に影響する所なし」を示すために列挙されています.
閉じ括弧付きで番号が振られているとおり,12までありますが,S'の列を見ると,1番目と2番目,3番目と4番目,…が一致していますので,重複を除くと6通りです.S''を見ましょう.(a,b)の算法=演算で得た数と,cとを演算するとき,cを右に置いたら1),左に置いたら2)となります.なので,1)の((a,b),c)は,2と3と4のかけ算だと「(2×3)×4」,自作Rubyスクリプトの出力のうち「(2 * 3) * 4 = 24」に対応します.
そういえばスクリプトで,カッコを使った総合式のみ出力させるのを,忘れていました.やっておきましょう.
$ ruby multiply234.rb | grep '(' (2 * 3) * 4 = 24 2 * (3 * 4) = 24 (2 * 4) * 3 = 24 2 * (4 * 3) = 24 (3 * 2) * 4 = 24 3 * (2 * 4) = 24 (3 * 4) * 2 = 24 3 * (4 * 2) = 24 (4 * 2) * 3 = 24 4 * (2 * 3) = 24 (4 * 3) * 2 = 24 4 * (3 * 2) = 24
以上をまとめると,「2と3と4のかけ算の求め方」は,
- 3つを並べて乗算記号で結ぶのは,6通り
- 3つのうち2つをかけ,残り1つをかける総合式は,3×2×2=12通り
- 3つのうち2つをかけ,残り1つをかける分解式は,総合式と1対1で対応するので,12通り
- 合計すると,6+12+12=30通り
で,「ruby multiply234.rb | wc -l」の出力(式の行数)も30なので一致しました.
最後に,これまでと同様に,自作スクリプトのあとにgrepを通して,出力を冒頭の10行だけにすることを,試してみます.2は必ずかけられる数として使われる,言い換えるとかける数にならない,という方針でコマンドを作ったところ,次のとおりとなりました.
$ ruby multiply234.rb | grep -v -E '\* \(?2' 2 * 3 * 4 = 24 (2 * 3) * 4 = 24 2 * 3 = 6, 6 * 4 = 24 2 * (3 * 4) = 24 3 * 4 = 12, 2 * 12 = 24 2 * 4 * 3 = 24 (2 * 4) * 3 = 24 2 * 4 = 8, 8 * 3 = 24 2 * (4 * 3) = 24 4 * 3 = 12, 2 * 12 = 24 2 * 4 = 8, 3 * 8 = 24 2 * 3 = 6, 4 * 6 = 24
最後2行の「* 8」「* 6」は,「* (2 * 4)」「* (2 * 3)」を意味します.それらがかける数になるのは,やはりまずいので,除外しないといけませんが,これは容易ではありません.そうなってくると,Rubyスクリプトを書き換えるほうが早い*1のですが…
整数どうしの演算で,1つだけ区別しようとすると,ずいぶんと手間がかかる,という落ちにしてよろしいでしょうか.
(最終更新:2015-12-04 朝)
*1:「q.each」を「[2].each」に置き換えるだけです.