sugiです。
In message "[TSabc:150] 言語の比較の参考4(電車の切符で昔やりました)"
Sun, 12 May 2002 01:57:10 +0900
Naomasa Numajiri <naonuma@...> wrote:
> お題:
> 任意の値の異なる1桁の数値4つが与えられたとき、
> 四則演算(+、−、×、÷)を使用して計算結果を
> 10にする。
--^ ticket.rb
# ruby
num= %w(8 4 2 1)
op = %w(+ - * /)
ans= 10
for i in 0..4**3-1
n =num[0]+op[i/4/4%4]+num[1]+op[i/4%4]
n+=num[2]+op[i%4]+num[3]
puts "#{n}=#{eval(n)}" if eval(n)==ans
end
--$
実行結果
% ruby ticket.rb
8+4-2*1=10
8+4-2/1=10
8+4/2*1=10
8+4/2/1=10
この場合 1/4+2+8=10 なんてのがあっても拾ってしまうのですが、ご愛敬
ということで。:-)
4つの数値の順番を変更する場合は、順番を変更する処理があまりうまく
書けなくって、なんだか分かりにくいスクリプトになってしまいました。
--^ ticket2.rb
# ruby
num= %w(8 4 2 1)
op = %w(+ - * /)
ans= 10
count=1
#1/4+2+8=10 とかを外したい場合は
#次の行のコメントを外す。
#num.collect!{|e| e.to_f.to_s}
(0..3).each do |a|
num1=num.sort
num0=[]
num0<<num1[a]
num1.delete_at(a)
(0..2).each do |b|
num2=num1.dup
num2[b]
num0=num0[0,1]+[num2[b]]
num2.delete_at(b)
(0..1).each do |c|
num3=num2.dup
num0=num0[0,2]+[num3[c]]
num0+= (c==0) ? [num3[1]] : [num3[0]]
for i in 0..4**3-1
n =num0[0]+op[i/4/4%4]+num0[1]+op[i/4%4]
n+=num0[2]+op[i%4]+num0[3]
if eval(n)==ans
puts "#{count}: #{n}=#{eval(n)}"
count+=1
end
end
end
end
end
--$
--
sugi