読者です 読者をやめる 読者になる 読者になる

Rubyで話すようにしてみた

Ruby Python

話すようにプログラムするPythonチュートリアル - なんたらノート 第二期
を、Rubyで書いてみた。

リファクタリング

def is_prime_number(n)
    (2..n-1).find {|m|
        n % m == 0
    } == nil
end

def prime_numbers_until(limit)
    (2..limit).select {|n| is_prime_number n}
end

print (prime_numbers_until 100).join ','

最適化後(ただし、コピーのジェネレータ置き換えは含まず)

$prime_numbers = [2]
$max_known_number = 2
def expand_prime_number_dict_to limit
    ($max_known_number+1..limit).each {|n|
        $prime_numbers.push n if is_prime_number n
        $max_known_number = n
    }
end

def is_prime_number n
    return $prime_numbers.include? n if n <= $max_known_number
    (prime_numbers_until n-1).find {|m|
        n % m == 0
    } == nil
end

def prime_numbers_until limit
    expand_prime_number_dict_to limit if limit > $max_known_number
    $prime_numbers.select {|n| n <= limit}
end

print (prime_numbers_until 100).join ','

もはやRuby自然言語か、とw

あまりにも自然言語に近すぎて、逆に、コードの成長とともに形式言語独特の不自然さが出てくるという警鐘が鳴らなさそうで、ちょっと怖いかも。Pythonのように、シンプルな書式ルールで形式的に考えさせられるという制約があってくれたほうが、勉強するには向いてる気がする。
まあ、いきなりスキのないアルゴリズムを思い浮かべられる天才で、かつ、英語とRuby語のネイティブスピーカーであるというのが最強なんだろうな。ちょっとづつコードを洗練する書き方しかできない僕みたいなヤツは、Pythonで十分な気がする。Pythonはすぐにコードの異臭を教えてくれるから。