11

11

[Ruby] 「4つの数字を入力して四則演算だけで10を作る式を出力しなさい」

2011.11.11(23:14)

ツイッター上では、診断メーカーで有名。
10になったー
4つの数字を組み合わせて答えが10になる式を作れ。数字をくっつけて2桁以上の数にしてはいけない。
http://shindanmaker.com/27613

あらかじめ指定された4つの数字を入力して四則演算だけで10を作る式を出力するプログラムです。@akiyama924さんに、1199と1158という問題をいただいて、それを解くプログラムをRubyでこしらえました。


#!/usr/bin/ruby -Ks

#「4つの数字を入力して四則演算だけで10を作る式を出力しなさい」
# 1199とか1185がちょっと難しい

$prev = Array.new

def formula(form)
stack = []
form.split(//).each { |n|
case n
when "+" then
r = stack.pop
l = stack.pop
stack.push(l + r)
when "-" then
r = stack.pop
l = stack.pop
stack.push(l - r)
when "*" then
r = stack.pop
l = stack.pop
stack.push(l * r)
when "/" then
r = stack.pop
l = stack.pop
if r != 0.0 then
stack.push(l / r)
else
return
end
else
stack.push(n.to_f)
end
}
result = stack.pop
if result > 9.9 && result < 10.1 && (! $prev.include?(form)) then
printf "#{form} = #{result}\n"
$prev << form
end
end

def digit4(d4)
ope = "+-*/".split(//)
d4.split(//).permutation(4).to_a.each { |d|
ope.each { |op1|
ope.each { |op2|
ope.each { |op3|
# nnonono、nnnoono、nnonnoo、nnnonoo、nnnnooo
formula( d[0] + d[1] + op1 + d[2] + op2 + d[3] + op3 )
formula( d[0] + d[1] + d[2] + op1 + op2 + d[3] + op3 )
formula( d[0] + d[1] + op1 + d[2] + d[3] + op2 + op3 )
formula( d[0] + d[1] + d[2] + op1 + d[3] + op2 + op3 )
formula( d[0] + d[1] + d[2] + d[3] + op1 + op2 + op3 )
}
}
}
}
end

digit4("1158")
digit4("1199")
-------------------------------------------
実行結果
8115/-/ = 10.0
119/+9* = 10.0
19/1+9* = 10.0
9119/+* = 10.0
919/1+* = 10.0



考えた経路
--------------------------
括弧を使わなくて済むように、(8+8)-(4+2)は88+42+-、2x(8/8+4)は288/4+*と表わすことにすると数字4つと演算子3つを並べる問題。数字2つと演算子1つは数字1つに置き換えられ、最終的に数字1つに置き換えられてそれが10となること。
--------------------------
数字をn、演算子をoとする。数字1つnを数字2つに変換するのはnnoの1通り。数字3つへは1x2でnnonoとnnnooの2通り。数字4つへは2x3でnnonono、nnnoono、nnonnoo、nnonnoo、nnnonoo、nnnnoooの6通り。3と4番目は同じで5通り。
--------------------------
数字演算子の位置は5通り。4つの数字の並びは順列で最大4x3x2x1=24通り。3つの演算子は4x4x4=64通り。なので5x24x64=7680通り。
--------------------------

コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示