Привет всем, идущим путем Ruby.
Для закрепления навыков программирования на Ruby, я решил таки добить
Ruby Koans.
Для объяснения, что это такое, процитирую egoholic из его
поста:
… проект Ruby Koans, который представляет собой учебную среду построенную на базе Test::Unit. Суть состоит в том, чтобы все тесты проходили правильно, в результате вашей правки содержимого тестовых матчеров. RubyKoans можно скачать на свою машину, но специально для таких лентяев как я был реализован веб интерфейс, что означает, что устанавливать ничего не нужно, просто пройдите по указанному далее адресу и заполняйте поля так, чтобы в матчерах не было ошибок. Сайт проекта: rubykoans.com/, онлайн версия: koans.heroku.com/.
Мой вопрос касается этой части:
about_scoring_project
Задача: написать метод, подсчитывающий количество очков в результате выброса игральных костей.
Аргумент — массив содержащий до 5 значений. Например [1, 4] или [4, 4, 4, 1, 5]
Правила подсчета:
- Три единицы дают 1000 очков.
- Любое другое число встречающееся 3 раза, даёт 100 умноженное на это число (три пятерки дадут 500).
- Встречающаяся единица дает 100. Кроме случаев, когда она входит в набор из трех единиц (см пункт 1).
- Пятерка дает 50 Кроме случаев, когда она входит в набор из трех пятерок (см пункт 2).
- Все остальное 0.
Как вам мое решение? Не проглядывается образ человека, пришедшего из PHP?
<pre><code class="ruby">def score(dice)
# no dice given
return 0 if dice.empty?
total = 0
# find triple match
# collect duplicates into array (not more than 3)
duplicates = dice.map do |n|
n if dice.count{|d| d == n} > 2
end.compact
# get number or nil
triple = duplicates.pop
# if there IS triple match
if triple
# triple one gives 1000
if triple == 1
total += 1000
# other values give x100
else
total += triple*100
end
# remove those numbers from the collection
# also ensure that only 3 array items can be removed
array_min_size = dice.count - 3
dice = dice.delete_if do |n|
true if (n == triple && dice.count > array_min_size)
end
end
# look for 1 or 5
dice.each do |n|
total += 50 if n == 5
total += 100 if n == 1
end
return total
end
Буду очень благодарен за любую критику.
Если вы тоже играли с Ruby Koans, выкладывайте решения сюда. Уверен, что каждый прошедший эту часть, идет искать как сделали другие.