作者: sugi
日時: 2002/5/12(22:00)
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