Help us understand the problem. What is going on with this article?

エレベータに乗る

More than 5 years have passed since last update.

前説

鍋谷さんのpplogより。
※pplogは最終記事しか読めない仕様のため、パーマリンクを記載することは不可能です。

(前略)
ソスウノカイニハトマリマセンノデ、ツウカシマス」

「ナオ」
「ルイジョウスウノカイニハトマリマセン」
「コウドゴウセイスウノカイニハトマリマセン」
「カジョウスウノカイニハトマリマセン」
「ハンソスウノカイニハトマリマセン」
「カンゼンスウノカイニハトマリマセン」

次に止まる階はどこだか考える。
半素数ってなんだっけ。

コード

とりあえず、 止まる階を下から5つ求めると、675, 1125, 1323, 2312, 2888階だそうです。寒気しかしません。
求めると、44, 45, 50, 52, 63, 68, 75, 76, 92, 98のようになるようです。かなりバグっていてすみませんでした。おかしいとは思ったんですよね…。

nabetani_elevator.rb
#!/usr/bin/ruby
require 'prime'
class Integer
    def check(m)
        a=self.prime_division
        return :prime if a.size==1 && a[0][1]==1
        return :half_prime if a.size==2 && a[0][1]==1 && a[1][1]==1
        divisornum=a.reduce(1){|s,(n,p)|s*(p+1)}
        return divisornum if divisornum>m
        divisorsum=a.reduce(1){|s,(n,p)|s*(n**(p+1)-1)/(n-1)}
        return :perfect_number if divisorsum==self*2
        return :abundant_number if divisorsum>self*2
        power_min=a.select{|n,p|p>1}.map{|n,p|p}.min
        return :perfect_power if power_min && a.all?{|n,p|p%power_min==0}
        return nil
    end
end
p Enumerator.new{|y|
    m=0
    i=2
    loop{
        r=i.check(m)
        m=[m,r].max if r.is_a?(Integer)
        y<<i unless r
        i+=1
    }
}.take(10) # [44, 45, 50, 52, 63, 68, 75, 76, 92, 98]

ところで、chan gemは(golangと同様)read onlyなchanの作成ができるので、Enumerator.new{...}Chan.new{...}.gen_enum(Enumerator.new{})と変形できることになりますが、特に意味はないですね--;

perfect_powerについて

私の最初の実装は

power_min=a.map{|n,p|p}.min
a.all?{|n,p|p%power_min==0}

だった。これは勿論

power_min=a.select{|n,p|p>1}.map{|n,p|p}.min
power_min && a.all?{|n,p|p%power_min==0}

の間違いなのだが(現在は訂正済み)。
鍋谷さんが

a.inject(a[0][1]){|acc,x|acc.gcd(x[1])}>1

なる実装を提案してくださった。これならpower_minは不要になりますが…。パフォーマンス的にはどちらが良いのでしょうね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away