Comment detail

自然数の分割(別表現) (Nested Flatten)

This comment is reply for 4532 nido: Ruby非再帰版です。 PenM 1....(自然数の分割(別表現)). Go to thread root.

たぶん move で変更すべき場所は上からではなく下から見ていくことになります。それと、単純にひとつだけ移動して終わりというわけにもいかなくて、「どこかを一つ減らし、そこから下はできるだけ上の方へ詰め込む」という処理が必要だと思います。
ご指摘ありがとうございます。
検証が甘かったです・・。
修正版はPenM 1.7GHz(Win XP)で16.1秒でした。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def move(a)
  min=a[-1]
  max=nil
  mv_from=nil
  a.each_with_index do |e,i|  # 移動可能な最小値の位置を探す
    break if e<(min+2)
    mv_from=i
    max=e
  end
  return false unless mv_from
  mv_sum=1
  mv_to=nil
  one_pos=a.size
  a.each_with_index do |e,i|  # 移動先を探す
    if e <= (max-2)
      mv_to ||=i
      if e==1
        one_pos=i
        mv_sum+=(a.size-i)
        break
      end
      mv_sum+=e
    end
  end

  a[mv_from]-=1
  if mv_to >= one_pos
    a[mv_to]+=1
  else
    mv_to.upto(a.size-1) do |i| # 移動先以降を詰め直し
      if mv_sum==a.size-i # ここ以降は1だけ
        a.fill(1,i...one_pos) if i<one_pos
        break
      end
      a[i]=[a[i-1],mv_sum-(a.size-i-1)].min
      mv_sum-=a[i]
    end
  end
  true
end

def print(a)
  puts a.map{|i| "o"*i}.join("\n")
  puts "--"
end

def young(n)
  1.upto(n) do |m|
    a=Array.new(m,1)
    a[0]+=n-m
    print a
    while move a
      print a
    end
  end
end
start_time=Time.now
young 50
puts Time.now-start_time

Index

Feed

Other

Link

Pathtraq

loading...