Премьер калькулятор количество


Я начинаю изучать Ruby.

Это почти первое, что я закодировался. Это очень просто; это основной калькулятор количество. Так как это мой первый код на Ruby, я бы хотел сделать комментарий по следующим вопросам:

  1. Соблюдение стандартов рубиновый
  2. Это делается в руби (так, как рубист бы закодировал ее)?
  3. Соблюдение Руби именования

Что я не ищу-это проверка на простое число алгоритм. Я знаю, что есть там более эффективные.


Файл: prime_numbers.РБ

class PrimeNumber
    def is_prime_kata(number)
        if number == 1 then return false end        

        max = Math.sqrt(number)

        (2..max).any? do |i| 
            if number % i == 0 then return false end
        end

        true
    end
end

Файл: prime_numbers_test.РБ

require 'test/unit'
require 'set'
require_relative 'prime_numbers.rb'

class PrimeNumberTest < Test::Unit::TestCase
    def test_is_prime
        primeNumbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

        primeNumber = PrimeNumber.new

        for i in primeNumbers
            result = primeNumber.is_prime_kata(i)
            assert_equal(true, result)
        end

        primeNumbersSet = Set.new(primeNumbers)
        allNumbersSet = Set.new(1..100) 

        nonPrimeNumbersSet = allNumbersSet - primeNumbersSet

        for i in nonPrimeNumbersSet
            result = primeNumber.is_prime_kata(i)
            assert_equal(false, result)
        end
    end 
end


4725
4
задан 4 ноября 2011 в 01:11 Источник Поделиться
Комментарии
4 ответа

Незначительные вещи. Я оставлю ваши фактические вопросы правильного "рубистов". :)

защитное Программирование

Я бы поменял первое условие для

return false if number <= 1

0 не является простым числом, и отрицательных чисел нет.
Возможно, я бы также адаптировать тест для проверки этих случаях.

лаконичность

if <condition> then <statement> end

может быть написано

<statement> if <condition>

так вы могли бы написать

return false if number == 1

и

return false if number % i == 0

2
ответ дан 4 ноября 2011 в 09:11 Источник Поделиться

Направленный на ваши вопросы, соглашений об именовании-это хорошо. Однако, в вашем тесте вы склонны переключиться между верблюжьего и words_separated_by_underscores. Я хотел бы предложить придерживаться той или иной (мы склонны использовать знак подчеркивания). Ваш алгоритм выглядит хорошо и с ANeves предложения будет выглядеть более "Рубин"ишь.

Однако, я предложу гораздо более эффективный способ генерации простых чисел и простых чисел нет в вашем тесте. Вместо того, чтобы вводить каждое простое число между 1 и 100 вручную в массив, вы могли бы использовать массив#выберите способ. Он принимает в перечислитель, бежит данного блока против каждого пункта передают, и возвращает массив только те элементы, которые возвращают true.

prime_numbers = (1..100).select {|num| num.prime?}

Это дал вам один и тот же массив у тебя, вписав все это в ручную. Вы можете сделать то же самое для не простых чисел.

non_prime_numbers = (1..100).select {|num| num unless num.prime?}

Это вернется Нум только если это не Прайм.

Это сэкономит вам много печатать, и он будет выглядеть более "Рубин"ишь.

3
ответ дан 10 ноября 2011 в 04:11 Источник Поделиться

По вашей просьбе, я предлагаю:

Файл: prime_numbers.РБ

class PrimeNumbers
def self.prime_kata? number
n=number.floor
return false if n < 2
max=Math.sqrt(n).floor
(2..max).none?{|k| 0==n % k}
end
end

Файл: prime_numbers_test.РБ

require 'mathn'
require 'test/unit'
require_relative 'prime_numbers'

class PrimeNumbersTest < Test::Unit::TestCase
LIMIT=100
def test_is_prime_or_not
primes=Prime.each(LIMIT).to_a
non_primes = (0.. LIMIT).to_a - primes
non_primes.each{|k| assert ! (PrimeNumbers.prime_kata? k)}
primes. each{|k| assert PrimeNumbers.prime_kata? k }
end
end

1
ответ дан 21 января 2012 в 11:01 Источник Поделиться

Я бы написал:

class PrimeNumber
def is_prime_kata(number)
return false if number == 1
max = Math.sqrt(number)
(2..max).all? { |x| number % x != 0 }
end
end

0
ответ дан 27 ноября 2011 в 07:11 Источник Поделиться