Решение на Първа задача от Мартин Христов

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

Към профила на Мартин Христов

Резултати

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

Код

def convert_to_bgn(amount, currency)
case currency
when :bgn then amount.round(2)
when :usd then (amount * 1.7408).round(2)
when :eur then (amount * 1.9557).round(2)
else
(amount * 2.6415).round(2)
end
end
def compare_prices(first_amount, first_currency, second_amount, second_currency)
convert_to_bgn(first_amount, first_currency) <=>
convert_to_bgn(second_amount, second_currency)
end

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

........

Finished in 0.0065 seconds
8 examples, 0 failures

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

Мартин обнови решението на 10.10.2015 14:54 (преди около 9 години)

+def convert_to_bgn(amount, currency, formatting=true)
+ case currency
+ when :bgn
+ formatting ? format_price(amount) : amount
+ when :usd
+ formatting ? format_price(usd_to_bgn(amount)) : usd_to_bgn(amount)
+ when :eur
+ formatting ? format_price(eur_to_bgn(amount)) : eur_to_bgn(amount)
+ else
+ formatting ? format_price(gbp_to_bgn(amount)) : gbp_to_bgn(amount)
+ end
+end
+
+def usd_to_bgn(amount)
+ amount * 1.7408
+end
+
+def eur_to_bgn(amount)
+ amount * 1.9557
+end
+
+def gbp_to_bgn(amount)
+ amount * 2.6415
+end
+
+def format_price(price)
+ ('%.2f' % price).to_f
+end
+
+def compare_prices(first_amount, first_currency, second_amount, second_currency)
+ convert_to_bgn(first_amount, first_currency, false) -
+ convert_to_bgn(second_amount,second_currency, false)
+end

Здравей :)

Имам няколко препоръки:

  • Виждам, че си се сетил за случая, в който закръгляването може да промени резултата от сравнението. Този случай няма да го тестваме и не ни интересува :) По-добре махни аргумента formatting (който всъщност трябва да се казва rounding или round).
  • Защо са ти отделни функции usd_to_bgn, eur_to_bgn и gbp_to_bgn? Можеш просто да ги умножиш в convert_to_bgn.
  • След като махнеш formatting може да използваш едноредове условия при case:
case currency
  when :usd then ...
  when :eur then ...
  when :gbp then ...
  else ...
end
  • Забележи индентацията при case-a. :)
  • ('%.2f' % price).to_f е като да напишеш числото на лист, да го срежеш с ножица след втория символ, евентуално поправяйки последната цифра. Вместо да го закръглиш наум. Погледни документацията :) Може да погледнеш и за оператора <=>. :)

Напомням, че все още имаш възможност да подобриш кода и да ни изпратиш ново решение :)

Мартин обнови решението на 10.10.2015 16:39 (преди около 9 години)

-def convert_to_bgn(amount, currency, formatting=true)
+def convert_to_bgn(amount, currency)
case currency
- when :bgn
- formatting ? format_price(amount) : amount
- when :usd
- formatting ? format_price(usd_to_bgn(amount)) : usd_to_bgn(amount)
- when :eur
- formatting ? format_price(eur_to_bgn(amount)) : eur_to_bgn(amount)
- else
- formatting ? format_price(gbp_to_bgn(amount)) : gbp_to_bgn(amount)
+ when :bgn then amount.round(2)
+ when :usd then (amount * 1.7408).round(2)
+ when :eur then (amount * 1.9557).round(2)
+ else
+ (amount * 2.6415).round(2)
end
end
-def usd_to_bgn(amount)
- amount * 1.7408
-end
-
-def eur_to_bgn(amount)
- amount * 1.9557
-end
-
-def gbp_to_bgn(amount)
- amount * 2.6415
-end
-
-def format_price(price)
- ('%.2f' % price).to_f
-end
-
def compare_prices(first_amount, first_currency, second_amount, second_currency)
- convert_to_bgn(first_amount, first_currency, false) -
- convert_to_bgn(second_amount,second_currency, false)
+ convert_to_bgn(first_amount, first_currency) <=>
+ convert_to_bgn(second_amount, second_currency)
end