2020年10月20日火曜日

201020

Crystal


A316384(2)

Crystal ではinject ではなく、reduce だが、
和の場合はsum が使える。

def f(ary)
  f_ary = Array(Int32).new
  while !(ary.all?{|i| i == 0})
    a = Array(Int32).new
    s = 0
    ary.each{|i|
      if i == 1
        a << 0
        s += 1
      elsif i > 0
        a << i - 2
        s += 2
      end
    }
    ary = a
    f_ary << s
  end
  f_ary
end

def a316384(n)
  return 1 if n < 3
  a = (1..n - 1).map{|i| [i]}
  ary = Array(Array(Int32)).new
  while a.size != 0
    b = Array(Array(Int32)).new
    a.each{|i|
      x = i[-1].to_i
      s = n - i.sum
      t = x % 2
      (x + t..s - 1).each{|j| b << i.clone + [j]}
      ary << i.clone + [s] if s >= x + t
    }
    a = b
  end
  ary.select{|i| i.reverse == f(i)}.size
end

p (0..90).map{|i| a316384(i)}

出力結果
[1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 4, 2, 5, 2, 5, 2, 6, 3, 8, 4, 9, 4, 10, 4, 12, 6, 15, 7, 17, 7, 19, 8, 22, 10, 26, 12, 30, 13, 33, 14, 38, 17, 45, 21, 51, 22, 56, 24, 64, 29, 74, 33, 83, 36, 92, 40, 104, 46, 119, 53, 133, 58, 147, 63, 165, 73, 187, 83, 208, 90, 229, 99, 256, 113, 288, 127, 319, 138, 351, 152, 390, 171, 435, 191, 481]

0 件のコメント:

コメントを投稿

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