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

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

Към профила на Илия Беличев

Резултати

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

Код

# -*- coding: utf-8 -*-
MONEY_MAP = {
usd: 1.7408,
eur: 1.9557,
gbp: 2.6145,
bgn: 1.00
}
def convert_to_bgn(amount, currency)
(Money_map[currency] * amount).round(2)
end
def compare_prices(f_price, f_currency, s_price, s_currency)
convert_to_bgn(f_price, f_currency) <=> convert_to_bgn(s_price, s_currency)
end

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

FFFFFFFF

Failures:

  1) #convert_to_bgn converts usd
     Failure/Error: expect(convert_to_bgn(1000, :usd)).to eq 1740.8
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:3: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) #convert_to_bgn converts eur
     Failure/Error: expect(convert_to_bgn(1000, :eur)).to eq 1955.7
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:7: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)>'

  3) #convert_to_bgn converts gbp
     Failure/Error: expect(convert_to_bgn(1000, :gbp)).to eq 2641.5
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:11: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)>'

  4) #convert_to_bgn converts bgn
     Failure/Error: expect(convert_to_bgn(333, :bgn)).to eq 333
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/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)>'

  5) #convert_to_bgn rounds to 2 digits after the point
     Failure/Error: expect(convert_to_bgn(123, :usd)).to eq 214.12
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:19: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)>'

  6) #compare_prices compares prices of the same currency
     Failure/Error: expect(compare_prices(10, :usd, 13, :usd)).to be < 0
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/solution.rb:14:in `compare_prices'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:25: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)>'

  7) #compare_prices compares usd and bgn
     Failure/Error: expect(compare_prices(5, :usd, 10, :bgn)).to be < 0
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/solution.rb:14:in `compare_prices'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:32: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)>'

  8) #compare_prices compares eur and gbp
     Failure/Error: expect(compare_prices(5, :usd, 10, :gbp)).to be < 0
     NameError:
       uninitialized constant Money_map
     # /tmp/d20151012-23382-1bhu31d/solution.rb:10:in `convert_to_bgn'
     # /tmp/d20151012-23382-1bhu31d/solution.rb:14:in `compare_prices'
     # /tmp/d20151012-23382-1bhu31d/spec.rb:38: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.01098 seconds
8 examples, 8 failures

Failed examples:

rspec /tmp/d20151012-23382-1bhu31d/spec.rb:2 # #convert_to_bgn converts usd
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:6 # #convert_to_bgn converts eur
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:10 # #convert_to_bgn converts gbp
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:14 # #convert_to_bgn converts bgn
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:18 # #convert_to_bgn rounds to 2 digits after the point
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:24 # #compare_prices compares prices of the same currency
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:31 # #compare_prices compares usd and bgn
rspec /tmp/d20151012-23382-1bhu31d/spec.rb:37 # #compare_prices compares eur and gbp

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

Илия обнови решението на 08.10.2015 15:39 (преди над 8 години)

+# -*- coding: utf-8 -*-
+MONEY_MAP = {
+ :usd => 1.7408,
+ :eur => 1.9557,
+ :gbp => 2.6145,
+ :bgn => 1.00
+}
+
+def convert_to_bgn(amount, currency)
+ MONEY_MAP[currency] * ammount.round(2)
+end
+
+def compare_prices(f_price, f_currency, s_price, s_currency)
+ convert_to_bgn(f_price, f_currency) <=> convert_to_bgn(s_price, s_currency)
+end

Здравей :)

Супер! Само две-три неща:

  • Имаш проблем в логиката на convert_to_bgn. Опитай да го откриеш.
  • Има по-добър (и по-кратък) начин да създадеш хеш със символи за ключове: {usd: 1.7408, ...}.
  • Не ми харесват имената на аргументите на втората функция. Трябваха ми няколко секунди да осъзная, че идват от first и second. И то защото гледах други решения досега с first и second. :) Напиши го с пълното му име, не го съкращавай. Ако те притеснява, че няма да се събере тялото на функцията на един ред - това не е проблем. Не всичко трябва да е на един ред - понякога е по-прегледно ако се разделят нещата.

Здрасти, мерси за бързият feedback, ами да :) де факто, закръглям до второ число с аргумента, вместо с крайният резултат.

Не знаех за символите, въпрос - освен в речници, имат ли друга реална употреба ? И по реални проекти, като ключове се ползват симовлите или стрингове ?

За аргументите, не исках да става мега дълъг подписа на самата функция, понеже за първи път поствам домашно и не съм от FMI, да разбирам, че трябва да кача наново домашното ?

За символите - използват се доста по реални проекти, но е малко размито къде какво да използваш. Аз следвам следния набор от правила:

  • Ако не се приема като вход от потребителя - символ.
  • Ако по някакъв начин логиката на програмата зависи от него (променя се в зависимост от стойността му) - вероятно трябва да е символ. Като цяло, ако в друг език би направил константа или enum, то символът е твоят избор. В този случай са аргументите за валутата.
  • Ако можеш да го промениш на едно място без да счупиш програмата или го приемаш като информация от потребител - низ.

Символи използвам за данни с по-голямо значение за логиката на кода, които не се променят често. Низове - за самото съдържание - данните, които могат да се променят без проблем и без да счупят приложението.

Не се притеснявай от дължината на compare_prices, стига да се вместваш в ограничението от 80 символа на ред. Прегледността е много по-важна.

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

Илия обнови решението на 12.10.2015 15:29 (преди над 8 години)

# -*- coding: utf-8 -*-
MONEY_MAP = {
- :usd => 1.7408,
- :eur => 1.9557,
- :gbp => 2.6145,
- :bgn => 1.00
+ usd: 1.7408,
+ eur: 1.9557,
+ gbp: 2.6145,
+ bgn: 1.00
}
def convert_to_bgn(amount, currency)
- MONEY_MAP[currency] * ammount.round(2)
+ (Money_map[currency] * amount).round(2)
end
def compare_prices(f_price, f_currency, s_price, s_currency)
convert_to_bgn(f_price, f_currency) <=> convert_to_bgn(s_price, s_currency)
-end
+end