Решение на Девета задача от Кузман Белев

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

Към профила на Кузман Белев

Резултати

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

Код

REPOSITORY = 'https://github.com/Kuz-man/ruby-retrospective-2015-1'
# Двадесет неща, които научих.
#
# 1. (possible_food = x_array.product(y_array) - food - snake).sample
# Няма практическа полза от ненужни присвоявания, sample така или
# иначе връща една от стойностите на масива, независимо дали е
# присвоен на променлива или не.
# 2. snake.include? вместо snake.member?
# Доста по-приятно в случая е за четене с include?, вместо с member?,
# а Руби код трябва да е четим, нали?
# 3. #def out_of_bounds?(snake, dimensions)
# Спазвайки разни single responsibility принципи, създаване на отделен
# метод е подходящо решение, понеже #obstacle_ahead? не трябва да е
# отговорен за това дали змията ще е извън полето.
# 4. snake.map { |i| moved_snake << i }
# От гледна точка на езикови средства, map няма смисъл да се ползва
# вместо each.
# 5. moved_snake = snake.dup
# Вместо да се използва map или each за да се „пълни“ масив с
# елементите на друг масив, доста по-практично е да се направи плитко
# копие, което, на практика, прави същото.
# 6. rat_cage.reduce(:+) <= nth_fibonacci
# Използване на #reduce вместо да се създава допълнителна променлива,
# която да пази сума.
# 7. #.each { |item| all_rats << item } е еквивалентно на all_rats =
# RationalSequence.new.to_a
# Вместо да се „пълни“ масив с елементи един по един, използвайки
# #each, може да се създаде нова поредица от елементи, която да се
# „масивизира“ с to_a
# 8. Понякога изглежда по-подредено и приятно за четене да се използва
# do - end, вместо да се пише на един ред с { }.
# 9. Вместо да се извиква инстанционна променлива с @, може да се
# ползва attr_reader.
# 10. FibonacciSequence.new(count).to_a.last вместо
# nth_fibonacci = FibonacciSequence.new(count).to_a -
# FibonacciSequence.new(count - 1).to_a)[0]
# Вместо да се вади разлика от два идентични масива(различаващи се с
# един елемент), може просто да се вземе нужният елемент от масива,
# който го съдържа. Така или иначе този елемент не се съдържа във
# втория масив, а е последен на първия.
# 11 array#first по-приятно за четене от array[0], въпреки че заема
# повече символи.
# 12. all_primes.each_slice(2).map do |numerator, denominator|
# Rational(numerator, denominator || 1 end.reduce(:+)
# || може да се използва, когато нещо е nil или false. В случая,
# когато липсва втора стойност в each_slice.
# 13. RationalSequence.new(count * count).take_while do |rat| rat_cage
# << rat; rat_cage.reduce(:+) <= nth_fibonacci
# Няма нужда да се създава променлива да запазване на
# RationalSequence, може директно да се работи с него.
# 14. Методът capitalize на string не работи с fixnum, но fixnum може
# да бъде кастнат към string и да бъде капитализиран. Реално научих,
# че можем да кастваме вместо да правим проверки за тип и да имаме
# различен output на база на тип.
# 15. Методите могат да бъдат изкарани в модул. По този начин
# класовете стават по-лесни за четене и разбиране.
# 16. Клас може да бъде създаден като наследник на Struct. Така няма
# нужда от initialize, което е доста приятно при минималистични
# класове.
# 17. return true if not_trump.any? do |set| forty?(set) end
# Вместо да се повтаря с малки разлики един и същ метод, може да се
# преизползва вече създаден такъв.
# 18. Между методи, include-и и подобни трябва да се оставя
# разстояние, иначе е трудно за четене.
# 19. temp_array.flatten & temp_array.flatten
# Вместо да се създават всички възможни кобинации от рационални числа,
# включително такива, които вече са създадени (6/2 == 3/1), много по
# добре е да се провери дали НОД на две числа е 1, което ще изключи
# повтаряне и нужда от премахване на дубликати.
# 20. Винаги ще има още какво да се доизкусури… и времето никога не
# стига.

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

From https://github.com/fmi/ruby-retrospective-2015-1
 * branch            master     -> FETCH_HEAD
HEAD is now at 767dd8d Update the task name in the readme for clarity
Cloning into 'submission'...
HEAD is now at a9f8637 modify #twenty? to use #forty? and modify card
From /tmp/ruby-retrospective-2015-1/checker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> upstream/master

Changes URL:
https://github.com/Kuz-man/ruby-retrospective-2015-1/compare/767dd8dfe46...a9f86373765

‘solutions/04.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/04.rb’
‘solutions/02.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/02.rb’
‘solutions/03.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/03.rb’
‘solutions/01.rb’ -> ‘/tmp/ruby-retrospective-2015-1/checker/solutions/01.rb’
OK
........

Finished in 0.00486 seconds
8 examples, 0 failures
OK
....................

Finished in 0.01119 seconds
20 examples, 0 failures
OK
....................

Finished in 0.03972 seconds
20 examples, 0 failures
OK
.........................................................

Finished in 0.03163 seconds
57 examples, 0 failures
From https://github.com/fmi/ruby-homework
 * branch            master     -> FETCH_HEAD
HEAD is now at 9dd040c Modify a test in task 8 to not include empty cells
.

Finished in 0.00159 seconds
1 example, 0 failures

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

Кузман обнови решението на 27.01.2016 16:22 (преди около 9 години)

+REPOSITORY = 'https://github.com/Kuz-man/ruby-retrospective-2015-1'
+
+# Двадесет неща, които научих.
+#
+# 1. (possible_food = x_array.product(y_array) - food - snake).sample
+# Няма практическа полза от ненужни присвоявания, sample така или
+# иначе връща една от стойностите на масива, независимо дали е
+# присвоен на променлива или не.
+# 2. snake.include? вместо snake.member?
+# Доста по-приятно в случая е за четене с include?, вместо с member?,
+# а Руби код трябва да е четим, нали?
+# 3. #def out_of_bounds?(snake, dimensions)
+# Спазвайки разни single responsibility принципи, създаване на отделен
+# метод е подходящо решение, понеже #obstacle_ahead? не трябва да е
+# отговорен за това дали змията ще е извън полето.
+# 4. snake.map { |i| moved_snake << i }
+# От гледна точка на езикови средства, map няма смисъл да се ползва
+# вместо each.
+# 5. moved_snake = snake.dup
+# Вместо да се използва map или each за да се „пълни“ масив с
+# елементите на друг масив, доста по-практично е да се направи плитко
+# копие, което, на практика, прави същото.
+# 6. rat_cage.reduce(:+) <= nth_fibonacci
+# Използване на #reduce вместо да се създава допълнителна променлива,
+# която да пази сума.
+# 7. #.each { |item| all_rats << item } е еквивалентно на all_rats =
+# RationalSequence.new.to_a
+# Вместо да се „пълни“ масив с елементи един по един, използвайки
+# #each, може да се създаде нова поредица от елементи, която да се
+# „масивизира“ с to_a
+# 8. Понякога изглежда по-подредено и приятно за четене да се използва
+# do - end, вместо да се пише на един ред с { }.
+# 9. Вместо да се извиква инстанционна променлива с @, може да се
+# ползва attr_reader.
+# 10. FibonacciSequence.new(count).to_a.last вместо
+# nth_fibonacci = FibonacciSequence.new(count).to_a -
+# FibonacciSequence.new(count - 1).to_a)[0]
+# Вместо да се вади разлика от два идентични масива(различаващи се с
+# един елемент), може просто да се вземе нужният елемент от масива,
+# който го съдържа. Така или иначе този елемент не се съдържа във
+# втория масив, а е последен на първия.
+# 11 array#first по-приятно за четене от array[0], въпреки че заема
+# повече символи.
+# 12. all_primes.each_slice(2).map do |numerator, denominator|
+# Rational(numerator, denominator || 1 end.reduce(:+)
+# || може да се използва, когато нещо е nil или false. В случая,
+# когато липсва втора стойност в each_slice.
+# 13. RationalSequence.new(count * count).take_while do |rat| rat_cage
+# << rat; rat_cage.reduce(:+) <= nth_fibonacci
+# Няма нужда да се създава променлива да запазване на
+# RationalSequence, може директно да се работи с него.
+# 14. Методът capitalize на string не работи с fixnum, но fixnum може
+# да бъде кастнат към string и да бъде капитализиран. Реално научих,
+# че можем да кастваме вместо да правим проверки за тип и да имаме
+# различен output на база на тип.
+# 15. Методите могат да бъдат изкарани в модул. По този начин
+# класовете стават по-лесни за четене и разбиране.
+# 16. Клас може да бъде създаден като наследник на Struct. Така няма
+# нужда от initialize, което е доста приятно при минималистични
+# класове.
+# 17. return true if not_trump.any? do |set| forty?(set) end
+# Вместо да се повтаря с малки разлики един и същ метод, може да се
+# преизползва вече създаден такъв.
+# 18. Между методи, include-и и подобни трябва да се оставя
+# разстояние, иначе е трудно за четене.
+# 19. temp_array.flatten & temp_array.flatten
+# Вместо да се създават всички възможни кобинации от рационални числа,
+# включително такива, които вече са създадени (6/2 == 3/1), много по
+# добре е да се провери дали НОД на две числа е 1, което ще изключи
+# повтаряне и нужда от премахване на дубликати.
+# 20. Винаги ще има още какво да се доизкусури… и времето никога не
+# стига.