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

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

Към профила на Моника Герова

Резултати

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

Код

MELTING_POINT = {
'water' => 0,
'ethanol' => -114,
'gold' => 1_064,
'silver' => 961.8,
'copper' => 1_085
}
BOILING_POINT = {
'water' => 100,
'ethanol' => 78.37,
'gold' => 2_700,
'silver' => 2_162,
'copper' => 2_567
}
def convert_between_temperature_units(degree, current_type, new_type)
if current_type == new_type
degree
else
convert_to_c_from = { 'K' => degree - 273.15, 'F' => (degree - 32) / 1.8, 'C' => degree }
convert_to = {
'C' => convert_to_c_from[current_type],
'F' => convert_to_c_from[current_type] * 1.8 + 32,
'K' => convert_to_c_from[current_type] + 273.15
}
convert_to[new_type]
end
end
def melting_point_of_substance(substance, unit)
convert_between_temperature_units(MELTING_POINT[substance], 'C', unit)
end
def boiling_point_of_substance(substance, unit)
convert_between_temperature_units(BOILING_POINT[substance], 'C', unit)
end

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

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

Finished in 0.00784 seconds
17 examples, 0 failures

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

Моника обнови решението на 13.10.2016 19:56 (преди над 7 години)

+def convert_between_temperature_units(degree, current_type, new_type)
+ if current_type == new_type
+ degree
+ else
+ convert_k_to_c = ->(deg) { deg - 273.15 }
+ convert_f_to_c = ->(deg) { (deg - 32) / 1.8 }
+
+ convert_to_c_from = { 'C' => convert_k_to_c.call(degree), 'F' => convert_f_to_c.call(degree) }
+ convert_to_k_from = { 'C' => degree + 273.15, 'F' => convert_k_to_c.call(degree) + 273.15 }
+ convert_to_f_from = { 'K' => convert_k_to_c.call(degree) * 1.8 + 32, 'C' => degree * 1.8 + 32 }

Стигнала си страшно близо до прозрението :) Само още едно побутване ти трябва, затова ще ти го дам:

Не ти трябва да изброяваш всички възможни варианти. Трябва ти само да разделиш сметката на две стъпки - всичко да минава през една мерна единица. Тогава кода става от N * N варианта, към N + N варианта. Тоест не ти трябва K -> F ако имаш K -> C и C -> F.

Раздели тази функция на две други и тук само ги извикай :)

+
+ case new_type
+ when 'C'
+ convert_to_c_from[current_type]
+ when 'F'
+ convert_to_f_from[current_type]
+ else
+ convert_to_k_from[current_type]
+ end
+ end
+end
+
+def melting_point_of_substance(substance, unit)
+ melting_point = { 'water' => 0, 'ethanol' => -114, 'gold' => 1_064, 'silver' => 961.8, 'copper' => 1_085 }

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

+
+ convert_between_temperature_units(melting_point[substance], 'C', unit)
+end
+
+def boiling_point_of_substance(substance, unit)
+ boiling_point = { 'water' => 100, 'ethanol' => 78.37, 'gold' => 2_700, 'silver' => 2_162, 'copper' => 2_567 }
+
+ convert_between_temperature_units(boiling_point[substance], 'C', unit)
+end

Моника обнови решението на 16.10.2016 11:30 (преди над 7 години)

+MELTING_POINT = {
+ 'water' => 0,
+ 'ethanol' => -114,
+ 'gold' => 1_064,
+ 'silver' => 961.8,
+ 'copper' => 1_085
+}
+
+BOILING_POINT = {
+ 'water' => 100,
+ 'ethanol' => 78.37,
+ 'gold' => 2_700,
+ 'silver' => 2_162,
+ 'copper' => 2_567
+}
+
def convert_between_temperature_units(degree, current_type, new_type)
if current_type == new_type
degree
else
- convert_k_to_c = ->(deg) { deg - 273.15 }
- convert_f_to_c = ->(deg) { (deg - 32) / 1.8 }
+ convert_to_c_from = { "K" => degree - 273.15, "F" => (degree - 32) / 1.8 }
- convert_to_c_from = { 'C' => convert_k_to_c.call(degree), 'F' => convert_f_to_c.call(degree) }
- convert_to_k_from = { 'C' => degree + 273.15, 'F' => convert_k_to_c.call(degree) + 273.15 }
- convert_to_f_from = { 'K' => convert_k_to_c.call(degree) * 1.8 + 32, 'C' => degree * 1.8 + 32 }
+ degree = current_type == 'C' ? degree : convert_to_c_from[current_type]
- case new_type
- when 'C'
- convert_to_c_from[current_type]
- when 'F'
- convert_to_f_from[current_type]
- else
- convert_to_k_from[current_type]
- end
+ convert_to = {
+ "C" => degree,
+ "F" => degree * 1.8 + 32,
+ "K" => degree + 273.15
+ }
+
+ convert_to[new_type]
end
end
def melting_point_of_substance(substance, unit)
- melting_point = { 'water' => 0, 'ethanol' => -114, 'gold' => 1_064, 'silver' => 961.8, 'copper' => 1_085 }
-
- convert_between_temperature_units(melting_point[substance], 'C', unit)
+ convert_between_temperature_units(MELTING_POINT[substance], 'C', unit)
end
def boiling_point_of_substance(substance, unit)
- boiling_point = { 'water' => 100, 'ethanol' => 78.37, 'gold' => 2_700, 'silver' => 2_162, 'copper' => 2_567 }
-
+ convert_between_temperature_units(BOILING_POINT[substance], 'C', unit)
- convert_between_temperature_units(boiling_point[substance], 'C', unit)
+end
-end

Моника обнови решението на 16.10.2016 11:47 (преди над 7 години)

MELTING_POINT = {
'water' => 0,
'ethanol' => -114,
'gold' => 1_064,
'silver' => 961.8,
'copper' => 1_085
}
BOILING_POINT = {
'water' => 100,
'ethanol' => 78.37,
'gold' => 2_700,
'silver' => 2_162,
'copper' => 2_567
}
def convert_between_temperature_units(degree, current_type, new_type)
if current_type == new_type
degree
else
- convert_to_c_from = { "K" => degree - 273.15, "F" => (degree - 32) / 1.8 }
+ convert_to_c_from = { 'K' => degree - 273.15, 'F' => (degree - 32) / 1.8, 'C' => degree }
- degree = current_type == 'C' ? degree : convert_to_c_from[current_type]
-
convert_to = {
- "C" => degree,
- "F" => degree * 1.8 + 32,
- "K" => degree + 273.15
+ 'C' => convert_to_c_from[current_type],
+ 'F' => convert_to_c_from[current_type] * 1.8 + 32,
+ 'K' => convert_to_c_from[current_type] + 273.15
}
convert_to[new_type]
end
end
def melting_point_of_substance(substance, unit)
convert_between_temperature_units(MELTING_POINT[substance], 'C', unit)
end
def boiling_point_of_substance(substance, unit)
convert_between_temperature_units(BOILING_POINT[substance], 'C', unit)
end