総当たりでやってみた。
当てはまらない条件を追加していき、範囲を狭めていく方針。
#1000~9999を、各桁の間に最低一回加減乗除を入れて計算する。できた数が元の数の逆順になる数を求めよ。(引用:プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問)
例)1234 -> 1+23-4 = 3
9876 -> 987+6 = 789
3桁の場合
351 -> 351=153 => "351"=="153".reverse
621 -> 621=126 => "621"=="126".reverse
886 -> 8*86=688 => "886"=="688".reverse
もっといけてる書き方がありそうだが、とりあえず
q2.rb
(1000..9999).each do |i|
a=["", "*", "/", "+", "-"]
b=[]
b=i.to_s.split("")
(0..4).each do |j|
(0..4).each do |k|
(0..4).each do |l|
c=a[j]+a[k]+a[l]
next if c=="" # 少なくとも一つ加減乗除
t = b[0]+a[j]+b[1]+a[k]+b[2]+a[l]+b[3]
next if(/[^0-9]0[0-9]/=~t)||(/[^0-9][0-9]00/=~t)
next if /[0-9]\/0/=~t # 0で割るとき
if t =~ /([0-9]+?)\/([0-9]+?)/
next if $1.to_i%$2.to_i !=0 # 割り算の箇所について、余りが0以外ならば、整数でない
end
next if eval(t)<=0 # 計算結果がマイナス、0のとき
puts i if b==eval(t).to_s.split("").reverse
end
end
end
end
~/workspace > time ruby q2.rb
5931
real 0m18.761s
user 0m18.634s
sys 0m0.094s