Решение на Първа задача от Пламена Петрова

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

Към профила на Пламена Петрова

Резултати

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

Код

def convert_to_bgn(price, currency)
rates_usd = {:usd => 1.7408}
rates_eur = {:eur => 1.9557}
rates_gbp = {:gbp => 2.6415}
if (currency.to_s <=> 'usd') == 0
(price*(rates_usd[:usd])).round(2)
elsif(currency.to_s <=> 'eur') == 0
(price*(rates_eur[:eur])).round(2)
else(currency.to_s <=> 'gbp') == 0
(price*(rates_gbp[:gbp])).round(2)
end
end
def compare_prices(a, b, c, d)
convert_to_bgn(a, b) <=> convert_to_bgn(c, d)
end

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

...F..F.

Failures:

  1) #convert_to_bgn converts bgn
     Failure/Error: expect(convert_to_bgn(333, :bgn)).to eq 333
       
       expected: 333
            got: 879.62
       
       (compared using ==)
     # /tmp/d20151012-23382-xcftgj/spec.rb:15:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) #compare_prices compares usd and bgn
     Failure/Error: expect(compare_prices(1000, :usd, 1740.8, :bgn)).to eq 0
       
       expected: 0
            got: -1
       
       (compared using ==)
     # /tmp/d20151012-23382-xcftgj/spec.rb:33:in `block (2 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.00736 seconds
8 examples, 2 failures

Failed examples:

rspec /tmp/d20151012-23382-xcftgj/spec.rb:14 # #convert_to_bgn converts bgn
rspec /tmp/d20151012-23382-xcftgj/spec.rb:31 # #compare_prices compares usd and bgn

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

Пламена обнови решението на 12.10.2015 14:43 (преди около 9 години)

+def convert_to_bgn(price, currency)
+ rates_usd = {:usd => 1.7408}
+ rates_eur = {:eur => 1.9557}
+ rates_gbp = {:gbp => 2.6415}
+ if (currency.to_s <=> 'usd') == 0
+ (price*(rates_usd[:usd])).round(2)
+ elsif(currency.to_s <=> 'eur') == 0
+ (price*(rates_eur[:eur])).round(2)
+ else(currency.to_s <=> 'gbr') == 0
+ (price*(rates_gbp[:gbp])).round(2)
+ end
+end
+
+def compare_prices(a, b, c, d)
+ convert_to_bgn(a, b) <=> convert_to_bgn(c, d)
+end

Пламена обнови решението на 12.10.2015 17:16 (преди около 9 години)

def convert_to_bgn(price, currency)
rates_usd = {:usd => 1.7408}
rates_eur = {:eur => 1.9557}
rates_gbp = {:gbp => 2.6415}
if (currency.to_s <=> 'usd') == 0
(price*(rates_usd[:usd])).round(2)
elsif(currency.to_s <=> 'eur') == 0
(price*(rates_eur[:eur])).round(2)
- else(currency.to_s <=> 'gbr') == 0
+ else(currency.to_s <=> 'gbp') == 0
(price*(rates_gbp[:gbp])).round(2)
end
end
def compare_prices(a, b, c, d)
convert_to_bgn(a, b) <=> convert_to_bgn(c, d)
end
  • a, b, c, ... са лоши имена на променливи.
  • Не виждам смисъл от отделните хешове, съдържащи обменните курсове. Можеше да е един общ хеш, или изобщо да ги няма и да си сложиш обменния курс директно на реда с преобразуването.
  • Няма нужда да обръщаш символа в низ, за да го сравняваш; може да си сравняваш символи спокойно, това им е идеята: if currency == :usd...

Благодаря за коментарите. В бъдеще ще се опитам да изчистя тези грешки. По повод имената на променливите - в първоначалния вариянт на решението ми бяха first/second_item_original_price и first/second_item_currency като се стремях да съм максимално описателна и кодът да е разбирем, но тогава пък думите на ред стават повече от 80. Дори и след редуциране пак беше повече. Променливите от вида price1/2 и currency1/2 не ми ги прие, защото са несъществуващи в английския език думи. a, b, c и d са резултат на отчаяние :D Но да, приемам забележката. На мен също ми изглежда грозен кодът написан така! За символите - няма да лъжа, че не го разбрах напълно на лекции :D Предполагах, че не е най-оптималното решение, но до това успях да стигна сама.