Решение на Първа задача от Чанита Иванова

Обратно към всички решения

Към профила на Чанита Иванова

Резултати

  • 6 точки от тестове
  • 0 бонус точки
  • 6 точки общо
  • 8 успешни тест(а)
  • 0 неуспешни тест(а)

Код

class Integer
def prime?(n)
return true if n == 2
(2..Integer(Math.sqrt(n))).each do |x|
return false if n % x == 0
end
return true
end
def prime_divisors
selfabs = abs
list = []
(2..selfabs).each do |x|
break if x > selfabs
if selfabs % x == 0 && prime?(x)
list = list | [x]
selfabs /= x
end
end
list
end
end
class Range
def fizzbuzz
i = -1
list = []
each do |x|
i += 1
list[i] = if x % 3 == 0 and x % 5 == 0 then :fizzbuzz
elsif x % 3 == 0 then :fizz
elsif x % 5 == 0 then :buzz
else x
end
end
list
end
end
class Hash
def group_values
hsh=Hash.new(nil)
each do |key, value|
if hsh[value] == nil
hsh[value] = [key]
next
end
hsh[value] += [key]
end
hsh
end
end
class Array
def densities
list = []
hsh=Hash.new(0)
each do |x|
if hsh[x] == 0
hsh[x] = 1
next
end
hsh[x] += 1
end
each {|x| list += [hsh[x]]}
list
end
end

Лог от изпълнението

........

Finished in 0.00739 seconds
8 examples, 0 failures

История (1 версия и 1 коментар)

Чанита обнови решението на 14.10.2012 16:40 (преди над 11 години)

+class Integer
+ def prime?(n)
+ return true if n == 2
+
+ (2..Integer(Math.sqrt(n))).each do |x|
+ return false if n % x == 0
+ end
+
+ return true
+ end
+
+ def prime_divisors
+ selfabs = abs
+ list = []
+
+ (2..selfabs).each do |x|
+ break if x > selfabs
+ if selfabs % x == 0 && prime?(x)
+ list = list | [x]
+ selfabs /= x
+ end
+ end
+
+ list
+ end
+
+end
+class Range
+
+ def fizzbuzz
+ i = -1
+ list = []
+
+ each do |x|
+ i += 1
+ list[i] = if x % 3 == 0 and x % 5 == 0 then :fizzbuzz
+ elsif x % 3 == 0 then :fizz
+ elsif x % 5 == 0 then :buzz
+ else x
+ end
+ end
+
+ list
+ end
+
+end
+
+class Hash
+
+ def group_values
+ hsh=Hash.new(nil)
+
+ each do |key, value|
+
+ if hsh[value] == nil
+ hsh[value] = [key]
+ next
+ end
+
+ hsh[value] += [key]
+ end
+
+ hsh
+ end
+
+end
+
+
+class Array
+
+ def densities
+ list = []
+ hsh=Hash.new(0)
+
+ each do |x|
+
+ if hsh[x] == 0
+ hsh[x] = 1
+ next
+ end
+
+ hsh[x] += 1
+ end
+
+ each {|x| list += [hsh[x]]}
+
+ list
+ end
+
+end
  • selfabs и hsh са лоши имена. Ако помня правилно, беше на лекцията и чу защо.
  • (x..y).each е по-добре като x.upto(y) do.
  • Впрочем, конвертирането до цяло число става с метода to_i, а не с подаване на метода Integer (учудващо, но Integer в този случай е метод).
  • Hash.new(nil) е учудващо страннен начин да запишеш {}
  • hash[value] == nil се записва като hash[value].nil? или в твоя случай, само hash[value].
  • Когато имаш each с next си струва да видиш дали кода няма да стане по-разбираем, ако премахнеш next-а. В случая на group_values, ще бъде по-добре ако останалата част от цикъла е в else-а, отколкото ако излизаш преждевременно с next.