Решение на Първа задача - температура и химични елементи от Ралица Дарджонова

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

Към профила на Ралица Дарджонова

Резултати

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

Код

def convert_to_celsius(degrees, current_units)
case current_units
when 'C'
degrees
when 'K'
degrees - 273.15
when 'F'
(degrees - 32) / 1.8
end
end
def convert_from_celsius(degrees, result_units)
case result_units
when 'C'
degrees
when 'F'
degrees * 1.8 + 32
when 'K'
degrees + 273.15
end
end
def convert_between_temperature_units(degrees, current_units, result_units)
# To celsius.
degrees_in_celsius = convert_to_celsius(degrees, current_units)
# From celsius.
convert_from_celsius(degrees_in_celsius, result_units)
end
def melting_point_of_substance(substance, units)
melting_point_of_substance_in_celsius = {'water' => 0, 'ethanol' => -114, 'gold' => 1064, 'silver' => 961.8, 'copper' => 1085}
convert_between_temperature_units(melting_point_of_substance_in_celsius[substance], 'C', units)
end
def boiling_point_of_substance(substance, units)
boiling_point_of_substance_in_celsius = {'water' => 100, 'ethanol' => 78.37, 'gold' => 2700, 'silver' => 2162, 'copper' => 2567}
convert_between_temperature_units(boiling_point_of_substance_in_celsius[substance], 'C', units)
end

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

.................

Finished in 0.0082 seconds
17 examples, 0 failures

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

Ралица обнови решението на 15.10.2016 21:08 (преди над 7 години)

+def convert_between_temperature_units(degrees, current_units, result_units)
+ case current_units
+ when 'K'
+ case result_units
+ when 'C'
+ degrees - 273.15
+ when 'F'
+ (degrees - 273.15) * 1.8 + 32
+ when 'K'
+ degrees
+ else
+ "The result units are incorrect."
+ end
+ when 'C'
+ case result_units
+ when 'C'
+ degrees
+ when 'F'
+ degrees * 1.8 + 32
+ when 'K'
+ degrees + 273.15
+ else
+ "The result units are incorrect."
+ end
+ when 'F'
+ case result_units
+ when 'C'
+ (degrees - 32) / 1.8
+ when 'F'
+ degrees
+ when 'K'
+ (degrees - 32) / 1.8 + 273.15

Можеш ли да се сетиш как да направиш сметките на две стъпки? Така, че да не ти се налага да влагаш case-ове?

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

+ else
+ "The result units are incorrect."
+ end
+ else
+ "The input units are incorrect."
+ end
+end
+
+def melting_point_of_substance(substance, units)
+ case substance
+ when 'water'

Тук много полезни биха били Hash-ове с key => value двойките "substance" => temperature, и да достъпиш точно температурата на веществото, което ти трябва, вместо да имаш case/when/when/when. Така ще можеш да си достъпиш температурата на топене само по името на веществото и да я подадеш като аргумент на convert_between_temperature_units.

+ convert_between_temperature_units(0, 'C', units)
+ when 'ethanol'
+ convert_between_temperature_units(-114, 'C', units)
+ when 'gold'
+ convert_between_temperature_units(1064, 'C', units)
+ when 'silver'
+ convert_between_temperature_units(961.8, 'C', units)
+ when 'copper'
+ convert_between_temperature_units(1085, 'C', units)
+ else
+ 'Incorrect substance.'

За целите на тази задача не е необходимо да се грижим за невалидни данни. Нещо повече, не е особено добра практика една функция да връща стойности от различни типове въз основа на конкретните си входни данни. По-добре е да връщаме nil за момента. По-нататък в курса ще си говорим и за exception-и и техните приложения в подобни случаи. За тази задача просто считай, че входните данни винаги са верни.

+ end
+end
+
+def boiling_point_of_substance(substance, units)
+ case substance
+ when 'water'
+ convert_between_temperature_units(100, 'C', units)
+ when 'ethanol'
+ convert_between_temperature_units(78.37, 'C', units)
+ when 'gold'
+ convert_between_temperature_units(2700, 'C', units)
+ when 'silver'
+ convert_between_temperature_units(2162, 'C', units)
+ when 'copper'
+ convert_between_temperature_units(2567, 'C', units)
+ else
+ 'Incorrect substance.'
+ end
+end

Ралица обнови решението на 16.10.2016 13:04 (преди над 7 години)

-def convert_between_temperature_units(degrees, current_units, result_units)
+def convert_to_celsius(degrees, current_units)
+
case current_units
+ when 'C'
+ degrees
when 'K'
- case result_units
- when 'C'
- degrees - 273.15
- when 'F'
- (degrees - 273.15) * 1.8 + 32
- when 'K'
- degrees
- else
- "The result units are incorrect."
- end
+ degrees - 273.15
+ when 'F'
+ (degrees - 32) / 1.8
+ end
+end
+
+def convert_from_celsius(degrees, result_units)
+
+ case result_units
when 'C'
- case result_units
- when 'C'
- degrees
- when 'F'
- degrees * 1.8 + 32
- when 'K'
- degrees + 273.15
- else
- "The result units are incorrect."
- end
+ degrees
when 'F'
- case result_units
- when 'C'
- (degrees - 32) / 1.8
- when 'F'
- degrees
- when 'K'
- (degrees - 32) / 1.8 + 273.15
- else
- "The result units are incorrect."
- end
- else
- "The input units are incorrect."
+ degrees * 1.8 + 32
+ when 'K'
+ degrees + 273.15
end
end
+def convert_between_temperature_units(degrees, current_units, result_units)
+
+ # To celsius.
+ degrees_in_celsius = convert_to_celsius(degrees, current_units)
+
+ # From celsius.
+ convert_from_celsius(degrees_in_celsius, result_units)
+
+end
+
def melting_point_of_substance(substance, units)
- case substance
- when 'water'
- convert_between_temperature_units(0, 'C', units)
- when 'ethanol'
- convert_between_temperature_units(-114, 'C', units)
- when 'gold'
- convert_between_temperature_units(1064, 'C', units)
- when 'silver'
- convert_between_temperature_units(961.8, 'C', units)
- when 'copper'
- convert_between_temperature_units(1085, 'C', units)
- else
- 'Incorrect substance.'
- end
+
+ melting_point_of_substance_in_celsius = {'water' => 0, 'ethanol' => -114, 'gold' => 1064, 'silver' => 961.8, 'copper' => 1085}
+ convert_between_temperature_units(melting_point_of_substance_in_celsius[substance], 'C', units)
+
end
def boiling_point_of_substance(substance, units)
- case substance
- when 'water'
- convert_between_temperature_units(100, 'C', units)
- when 'ethanol'
- convert_between_temperature_units(78.37, 'C', units)
- when 'gold'
- convert_between_temperature_units(2700, 'C', units)
- when 'silver'
- convert_between_temperature_units(2162, 'C', units)
- when 'copper'
- convert_between_temperature_units(2567, 'C', units)
- else
- 'Incorrect substance.'
- end
+
+ boiling_point_of_substance_in_celsius = {'water' => 100, 'ethanol' => 78.37, 'gold' => 2700, 'silver' => 2162, 'copper' => 2567}
+ convert_between_temperature_units(boiling_point_of_substance_in_celsius[substance], 'C', units)
+
end
+