Моника обнови решението на 13.10.2016 19:56 (преди около 8 години)
+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