LoginSignup
1
2

More than 5 years have passed since last update.

『Q02 数列の四則演算』プログラマ脳を鍛える数学パズル

Posted at

総当たりでやってみた。
当てはまらない条件を追加していき、範囲を狭めていく方針。

1000~9999を、各桁の間に最低一回加減乗除を入れて計算する。できた数が元の数の逆順になる数を求めよ。(引用:プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問)

例)1234 -> 1+2*3-4 = 3
  9876 -> 9*87+6 = 789

3桁の場合
  351 -> 3*51=153 => "351"=="153".reverse
  621 -> 6*21=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

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2