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

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

Към профила на Теодор Иванов

Резултати

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

Код

def convert_to_bgn(price, currency)
price_in_bgn = case currency
when :usd then price * 1.7408
when :eur then price * 1.9557
when :gbp then price * 2.6415
else price
end
price_in_bgn.round(2)
end
def compare_prices(first_price, first_currency, second_price, second_currency)
first_price_in_bgn = convert_to_bgn(first_price, first_currency)
second_price_in_bgn = convert_to_bgn(second_price, second_currency)
first_price_in_bgn <=> second_price_in_bgn
end

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

........

Finished in 0.00639 seconds
8 examples, 0 failures

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

Теодор обнови решението на 11.10.2015 12:05 (преди над 9 години)

+#solution.rb
+def convert_to_bgn(price, currency)
+ if currency == :usd
+ price = price*1.7408
+ elsif currency == :eur
+ price = price*1.9557
+ elsif currency == :gbp
+ price = price*2.6415
+ end
+ price = price.round(2)
+ #puts price
+end
+
+
+
+def compare_prices(first_price, first_currency, second_price, second_currency)
+ convert_to_bgn(first_price, first_currency)
+ convert_to_bgn(second_price, second_currency)
+
+ if first_price < second_price
+ -1
+ elsif first_price == second_price
+ 0
+ else
+ 1
+ end
+end

Теодор обнови решението на 11.10.2015 12:06 (преди над 9 години)

#solution.rb
def convert_to_bgn(price, currency)
if currency == :usd
price = price*1.7408
elsif currency == :eur
price = price*1.9557
elsif currency == :gbp
price = price*2.6415
end
price = price.round(2)
- #puts price
end
def compare_prices(first_price, first_currency, second_price, second_currency)
convert_to_bgn(first_price, first_currency)
convert_to_bgn(second_price, second_currency)
if first_price < second_price
-1
elsif first_price == second_price
0
else
1
end
end

Здравей :)

Пусна ли си примерните тестове? Сигурен ли си, че compare_prices работи?

Имам и някои стилови коментари:

  • Имаш доста повторение на price = price * число. Напомням, че в Ruby всичко е израз и връща стойност - дори if и case. Тоест можеш да присвоиш резултата от if и case на променлива. Можеш ли да използваш това знание, за да премахнеш дублирането на код? :)
  • Около * трябва да има празни места.
  • Последното присвояване price = price.round(2) е безсмислено - променливата price не я използваш след това.
  • Изтрий коментара на първия ред - не ни интересува как се е казвал файлът при теб и няма място в кода.
  • Нямаш нужда от проверката в compare_prices. Прочети за оператора <=>.

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

Здравей,

след тестване с Rspec и файла sample_spec.rb първоначалният код (и функцията compare_prices) не даде грешки (2 examples, 0 failures).

Използвам round() метода на края на първата функция, защото по условие е дадено резултатът да се закръгля до втората цифра след десетичната запетая. Възможно е да не съм разбрал идеята напълно.

Мисля, че поправих останалите неща. Тествах кода и не показва грешки. Наложи се да въведа и else в условието на първата функция заради присвояването на резултата, възможно е да има по-добро решение за 'default' стойност за if. Ако все още има нещо, което създава проблеми, ще поработя по него.

Благодаря за помощта!

Теодор обнови решението на 11.10.2015 19:18 (преди над 9 години)

-#solution.rb
def convert_to_bgn(price, currency)
- if currency == :usd
- price = price*1.7408
- elsif currency == :eur
- price = price*1.9557
- elsif currency == :gbp
- price = price*2.6415
- end
- price = price.round(2)
+ result = if currency == :usd
+ price * 1.7408
+ elsif currency == :eur
+ price * 1.9557
+ elsif currency == :gbp
+ price * 2.6415
+ else
+ price
+ end
+
+ result = result.round(2)
end
-
def compare_prices(first_price, first_currency, second_price, second_currency)
convert_to_bgn(first_price, first_currency)
convert_to_bgn(second_price, second_currency)
- if first_price < second_price
- -1
+ first_price <=> second_price
- elsif first_price == second_price
+end
- 0
- else
- 1
- end
-end

Стана по-добре стилово :)

Не е сигурно, че щом примерният тест минава, решението е напълно вярно :) Изпълни следния код, провери накрая a на колко е равно и направи някакъв извод за твоя код:

def change_variable(a)
  a = 5
end

a = 3
change_variable(a)
# a = ?

Казвам, че присвояването е безсмислено, не round. Когато напишеш променлива = нещо и нямаш повече код, очевидно можеш просто да напишеш нещо. Това е така, защото нямаш код, който да използва променлива, след като я промениш.

Между другото, result е лошо име за променлива, защото не дава никаква информацията за това, че съдържа цена в bgn. Можеш ли да измислиш по-добро? :)

В този случай аз бих използвал case, защото проверяваш каква е стойността на една променлива:

име = case currency
        when :usd then price * 1.7408
        when :eur then price * 1.9557
        ...
        else price
      end

Теодор обнови решението на 11.10.2015 21:08 (преди над 9 години)

def convert_to_bgn(price, currency)
- result = if currency == :usd
- price * 1.7408
- elsif currency == :eur
- price * 1.9557
- elsif currency == :gbp
- price * 2.6415
- else
- price
- end
+ price_in_bgn = case currency
+ when :usd then price * 1.7408
+ when :eur then price * 1.9557
+ when :gbp then price * 2.6415
+ else price
+ end
- result = result.round(2)
+ price_in_bgn.round(2)
end
+
def compare_prices(first_price, first_currency, second_price, second_currency)
- convert_to_bgn(first_price, first_currency)
- convert_to_bgn(second_price, second_currency)
+ first_price_in_bgn = convert_to_bgn(first_price, first_currency)
+ second_price_in_bgn = convert_to_bgn(second_price, second_currency)
- first_price <=> second_price
-end
+ first_price_in_bgn<=>second_price_in_bgn
+end

Теодор обнови решението на 11.10.2015 21:09 (преди над 9 години)

def convert_to_bgn(price, currency)
- price_in_bgn = case currency
- when :usd then price * 1.7408
- when :eur then price * 1.9557
- when :gbp then price * 2.6415
- else price
- end
+ price_in_bgn = case currency
+ when :usd then price * 1.7408
+ when :eur then price * 1.9557
+ when :gbp then price * 2.6415
+ else price
+ end
price_in_bgn.round(2)
end
def compare_prices(first_price, first_currency, second_price, second_currency)
first_price_in_bgn = convert_to_bgn(first_price, first_currency)
second_price_in_bgn = convert_to_bgn(second_price, second_currency)
first_price_in_bgn<=>second_price_in_bgn
-end
+end

Теодор обнови решението на 11.10.2015 22:23 (преди над 9 години)

def convert_to_bgn(price, currency)
price_in_bgn = case currency
when :usd then price * 1.7408
when :eur then price * 1.9557
when :gbp then price * 2.6415
else price
end
price_in_bgn.round(2)
end
def compare_prices(first_price, first_currency, second_price, second_currency)
first_price_in_bgn = convert_to_bgn(first_price, first_currency)
second_price_in_bgn = convert_to_bgn(second_price, second_currency)
- first_price_in_bgn<=>second_price_in_bgn
+ first_price_in_bgn <=> second_price_in_bgn
end