Виктор обнови решението на 15.10.2012 15:33 (преди около 12 години)
+class Integer
+ def prime_divisors
+ value = self
+ value = -self if self < 0
+ if value < 2
+ puts "Method is undefined for #{value}"
+ return
+ end
+ divisor = 2
+ prime_divisors = Array.new
+ while(divisor <= value) do
+ if (value.remainder(divisor) == 0)
+ prime_divisors << divisor if divisor.prime?
+ end
+ divisor+=1
+ end
+ return prime_divisors.sort
+ end
+
+ def prime?
+ value = self
+ value = -value if value < 0
+ return false if value < 2
+ divisor = 2
+ while(divisor < value)
+ return false if(value.remainder(divisor) == 0)
+ divisor+=1
+ end
+ true
+ end
+end
+
+class Range
+ def fizzbuzz
+ a = self.to_a
+ a.map! { |digit|
+ digit = case
+ when (digit.remainder(3) == 0 and digit.remainder(5) == 0) then :fizzbuzz
+ when digit.remainder(3) == 0 then :fizz
+ when digit.remainder(5) == 0 then :buzz
+ else digit
+ end
+ }
+ return a
+ end
+end
+
+puts 21.prime_divisors
+puts (1...15).fizzbuzz
- Идентацията и употребата ти на whitespace не е наред и съгласно предупрежденията ни, ти отнемаме една точка за това; за справка виж ръководството за стил на курса
- "unbound" цикли в Ruby като
while
,until
и прочее се ползват много рядко — например ако четеш данни по мрежа и не знаеш кога ще свършат; в случаите, в които ти ги ползваш, се предпочитатeach
,map
,select
и сродни - За ред 3 и 4, 21 и 22 си има метод
abs
:) - Избягвай да ползваш метода
puts
по начина, по който си го ползвал (за грешки); за тази цел има изключения, за които ще говорим по-натам; в случая, условието не изискваше да покривате тези случаи и работата, която си свършил, е излишна (да не говорим, че не се прави така). Принципно, добре е да се стремиш да не извършваш излишна работа, тъй като повече код = повече проблеми във всяко едно отношение :) -
Array.new
,Hash.new
и т.н. никога не се ползват в този си вид (без аргументи); винаги се предпочита литералния синтаксис в тези случаи, т.е.[]
,{}
и прочее - Скоби около условието в
if
,while
и прочее не се поставят в Ruby, тъй като са ненужни (не само, че могат да се изпуснат като при методите — просто не се пишат, защото е такъв синтаксисът; това, че можеш да ги напишеш, е просто страничен ефект) - В
Range#fizzbuzz
е било по-подходящо да ползвашif
/else
, отколкотоcase
;case
е подходящ за други ситуации, не когато имаш да оценяваш произволни условия - Редове 48 и 49 не е трябвало да ги оставяш в крайното решение, което си предал
Другия път по-добре ;)
Благодаря за коментара! :)