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

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

Към профила на Момчил Баталов

Резултати

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

Код

def convert_between_temperature_units(degree, value_in, value_out)
case [value_in, value_out]
when ['C', 'C']
then degree

then не е задължително да се ползва, когато изразът е на нов ред. Дори е препоръчително да се пропуска в тези случаи. А и нещо друго - няма ли как да избегнеш 3-те случая, в които входната и изходната единица са равни? Някак излишно е да ги ловим поотделно.

when ['C', 'K']
then degree + 273.15
when ['C', 'F']
then degree * 1.8 + 32.0
when ['K', 'C']
then degree - 273.15
when ['K', 'K']
then degree
when ['K', 'F']
then degree * 1.8 - 459.67
when ['F', 'C']
then (degree - 32.0) * 5.0 / 9.0
when ['F', 'K']
then (degree + 459.67) * 5.0 / 9.0
when ['F', 'F']
then degree
end
end
def melting_point_of_substance(substance, type_in)
case [substance, type_in]
when ['water', 'C']
then 0
when ['water', 'K']
then convert_between_temperature_units(0, 'C', 'K')
when ['water', 'F']
then convert_between_temperature_units(0, 'C', 'F')
when ['ethanol', 'C']
then -114
when ['ethanol', 'K']
then convert_between_temperature_units(-114, 'C', 'K')
when ['ethanol', 'F']
then convert_between_temperature_units(-114, 'C', 'F')
when ['gold', 'C']
then 1064
when ['gold', 'K']
then convert_between_temperature_units(1064, 'C', 'K')
when ['gold', 'F']
then convert_between_temperature_units(1064, 'C', 'F')
when ['silver', 'C']
then 961.8
when ['silver', 'K']
then convert_between_temperature_units(961.8, 'C', 'K')
when ['silver', 'F']
then convert_between_temperature_units(961.8, 'C', 'F')
when ['copper', 'C']
then 1085
when ['copper', 'K']
then convert_between_temperature_units(1085, 'C', 'K')
when ['copper', 'F']
then convert_between_temperature_units(1085, 'C', 'F')

Доста дългичко се е получило. Може да пробваш да си дефинираш температурите в хеш, използвайки за ключове стринговете с имена на веществата. Така ще можеш директно да си достъпиш температурата, ползвайки подадения стринг. Например melting_points['water'] ще работи ако имаш хеша melting_points = { 'water' => 0 }.

end
end
def boiling_point_of_substance(substance, type_in)
case [substance, type_in]
when ['water', 'C']
then 100
when ['water', 'K']
then convert_between_temperature_units(100, 'C', 'K')
when ['water', 'F']
then convert_between_temperature_units(100, 'C', 'F')
when ['ethanol', 'C']
then 78.37
when ['ethanol', 'K']
then convert_between_temperature_units(78.37, 'C', 'K')
when ['ethanol', 'F']
then convert_between_temperature_units(78.37, 'C', 'F')
when ['gold', 'C']
then 2700
when ['gold', 'K']
then convert_between_temperature_units(2700, 'C', 'K')
when ['gold', 'F']
then convert_between_temperature_units(2700, 'C', 'F')
when ['silver', 'C']
then 2162
when ['silver', 'K']
then convert_between_temperature_units(2162, 'C', 'K')
when ['silver', 'F']
then convert_between_temperature_units(2162, 'C', 'F')
when ['copper', 'C']
then 2567
when ['copper', 'K']
then convert_between_temperature_units(2567, 'C', 'K')
when ['copper', 'F']
then convert_between_temperature_units(2567, 'C', 'F')
end
end
puts convert_between_temperature_units(22, 'K', 'F')
puts melting_point_of_substance('gold', 'K')
puts boiling_point_of_substance('silver', 'C')

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

-420.07
1337.15
2162
.................

Finished in 0.00836 seconds
17 examples, 0 failures

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

Момчил обнови решението на 16.10.2016 23:50 (преди над 7 години)

+def convert_between_temperature_units(degree, value_in, value_out)
+ case [value_in, value_out]
+ when ['C', 'C']
+ then degree

then не е задължително да се ползва, когато изразът е на нов ред. Дори е препоръчително да се пропуска в тези случаи. А и нещо друго - няма ли как да избегнеш 3-те случая, в които входната и изходната единица са равни? Някак излишно е да ги ловим поотделно.

+ when ['C', 'K']
+ then degree + 273.15
+ when ['C', 'F']
+ then degree * 1.8 + 32.0
+ when ['K', 'C']
+ then degree - 273.15
+ when ['K', 'K']
+ then degree
+ when ['K', 'F']
+ then degree * 1.8 - 459.67
+ when ['F', 'C']
+ then (degree - 32.0) * 5.0 / 9.0
+ when ['F', 'K']
+ then (degree + 459.67) * 5.0 / 9.0
+ when ['F', 'F']
+ then degree
+ end
+end
+
+def melting_point_of_substance(substance, type_in)
+ case [substance, type_in]
+ when ['water', 'C']
+ then 0
+ when ['water', 'K']
+ then convert_between_temperature_units(0, 'C', 'K')
+ when ['water', 'F']
+ then convert_between_temperature_units(0, 'C', 'F')
+ when ['ethanol', 'C']
+ then -114
+ when ['ethanol', 'K']
+ then convert_between_temperature_units(-114, 'C', 'K')
+ when ['ethanol', 'F']
+ then convert_between_temperature_units(-114, 'C', 'F')
+ when ['gold', 'C']
+ then 1064
+ when ['gold', 'K']
+ then convert_between_temperature_units(1064, 'C', 'K')
+ when ['gold', 'F']
+ then convert_between_temperature_units(1064, 'C', 'F')
+ when ['silver', 'C']
+ then 961.8
+ when ['silver', 'K']
+ then convert_between_temperature_units(961.8, 'C', 'K')
+ when ['silver', 'F']
+ then convert_between_temperature_units(961.8, 'C', 'F')
+ when ['copper', 'C']
+ then 1085
+ when ['copper', 'K']
+ then convert_between_temperature_units(1085, 'C', 'K')
+ when ['copper', 'F']
+ then convert_between_temperature_units(1085, 'C', 'F')

Доста дългичко се е получило. Може да пробваш да си дефинираш температурите в хеш, използвайки за ключове стринговете с имена на веществата. Така ще можеш директно да си достъпиш температурата, ползвайки подадения стринг. Например melting_points['water'] ще работи ако имаш хеша melting_points = { 'water' => 0 }.

+ end
+end
+
+def boiling_point_of_substance(substance, type_in)
+ case [substance, type_in]
+ when ['water', 'C']
+ then 100
+ when ['water', 'K']
+ then convert_between_temperature_units(100, 'C', 'K')
+ when ['water', 'F']
+ then convert_between_temperature_units(100, 'C', 'F')
+ when ['ethanol', 'C']
+ then 78.37
+ when ['ethanol', 'K']
+ then convert_between_temperature_units(78.37, 'C', 'K')
+ when ['ethanol', 'F']
+ then convert_between_temperature_units(78.37, 'C', 'F')
+ when ['gold', 'C']
+ then 2700
+ when ['gold', 'K']
+ then convert_between_temperature_units(2700, 'C', 'K')
+ when ['gold', 'F']
+ then convert_between_temperature_units(2700, 'C', 'F')
+ when ['silver', 'C']
+ then 2162
+ when ['silver', 'K']
+ then convert_between_temperature_units(2162, 'C', 'K')
+ when ['silver', 'F']
+ then convert_between_temperature_units(2162, 'C', 'F')
+ when ['copper', 'C']
+ then 2567
+ when ['copper', 'K']
+ then convert_between_temperature_units(2567, 'C', 'K')
+ when ['copper', 'F']
+ then convert_between_temperature_units(2567, 'C', 'F')
+ end
+end
+
+puts convert_between_temperature_units(22, 'K', 'F')
+puts melting_point_of_substance('gold', 'K')
+puts boiling_point_of_substance('silver', 'C')