2015年4月13日月曜日

150413

Ruby


Schizophrenic number(連続する個数 2.0)

150412分のコードが長ったらしかったので少し改良した。

require 'bigdecimal'
M = 700
N = 51
n = 7
a = 0
(1..N).each{|i| a = 10 * a + i
  if i % 2 == 1
    str = BigDecimal.new(a).sqrt(M * 2).to_s
    ary = str.scan(/((.)\2{#{n - 1},}|.)/).map{|v| v[0]}
    cnt = -2
    cnt0 = -2
    cnt1 = 0
    ary1 = []
    ary.each{|i|
      # 数字以外が出てきたら停止
      break if i == 'E'
      # M桁まで
      break if cnt > M - 1
      j = i.size
      cnt += j
      if j < n
        cnt0 += j
      else
        cnt1 += j
        ary1 << j
      end
    }
    p [i, cnt, cnt0, cnt1, ary1.inject(:+), ary1]
  end
}

出力結果
[1, 1, 1, 0, nil, []]
[3, 700, 700, 0, nil, []]
[5, 700, 700, 0, nil, []]
[7, 700, 700, 0, nil, []]
[9, 700, 692, 8, 8, [8]]
[11, 700, 682, 18, 18, [10, 8]]
[13, 700, 678, 22, 22, [12, 10]]
[15, 700, 666, 34, 34, [14, 12, 8]]
[17, 700, 660, 40, 40, [16, 14, 10]]
[19, 700, 646, 54, 54, [18, 16, 12, 8]]
[21, 700, 638, 62, 62, [20, 18, 14, 10]]
[23, 700, 626, 74, 74, [21, 19, 15, 12, 7]]
[25, 700, 616, 84, 84, [23, 21, 17, 14, 9]]
[27, 700, 598, 102, 102, [25, 23, 19, 16, 11, 8]]
[29, 700, 587, 113, 113, [27, 25, 21, 17, 13, 10]]
[31, 700, 570, 130, 130, [29, 27, 23, 19, 14, 11, 7]]
[33, 700, 556, 144, 144, [31, 29, 25, 21, 16, 13, 9]]
[35, 700, 536, 164, 164, [33, 31, 27, 23, 18, 15, 10, 7]]
[37, 700, 520, 180, 180, [35, 33, 29, 25, 20, 17, 12, 9]]
[39, 700, 505, 195, 195, [37, 35, 31, 27, 22, 19, 14, 10]]
[41, 700, 489, 211, 211, [39, 37, 33, 29, 24, 21, 16, 12]]
[43, 700, 465, 235, 235, [41, 39, 35, 31, 26, 23, 18, 14, 8]]
[45, 700, 448, 252, 252, [43, 41, 37, 33, 28, 24, 20, 16, 10]]
[47, 700, 424, 276, 276, [45, 43, 39, 35, 29, 26, 22, 18, 12, 7]]
[49, 700, 405, 295, 295, [47, 45, 41, 37, 31, 28, 23, 20, 14, 9]]
[51, 700, 388, 312, 312, [49, 47, 42, 39, 33, 30, 25, 21, 15, 11]]

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。