HackerRank Ruby – Methods – Keyword Arguments problem solution YASH PAL, 31 July 2024 In this HackerRank Ruby – Methods – Keyword Arguments problem solution Ruby allows you to (partially) mitigate this problem by passing a Hash as an argument or one of the arguments. For example, you have a method that takes a URI to download a file and another argument containing a Hash of other named options (proxy, timeout, active-connections etc.,) def fetch_file(uri, options) if options.has_key?(:proxy) # do something end end The main problem with this technique, however, is that you cannot easily set default value for arguments (Read more). Since this construct is highly useful, Ruby 2 introduced keyword arguments which allows you to write – def foo(x, str: “foo”, num: 424242) [x, str, num] end foo(13) #=> [13, ‘foo’, 424242] foo(13, str: ‘bar’) #=> [13, ‘bar’, 424242] Also, introducing the double splat (**) which similar to it’s counterpart collects all the extra named keywords as a hash parameter. def foo(str: “foo”, num: 424242, **options) [str, num, options] end foo #=> [‘foo’, 424242, {}] foo(check: true) # => [‘foo’, 424242, {check: true}] In this challenge, your task is to write a method convert_temp that helps in temperature conversion. The method will receive a number as an input (temperature), a named parameter input_scale (scale for input temperature), and an optional parameter output_scale (output temperature scale, defaults to Celsius) and return the converted temperature. It should perform interconversion between Celsius, Fahrenheit and Kelvin scale. For example, > convert_temp(0, input_scale: ‘celsius’, output_scale: ‘kelvin’) => 273.15 > convert_temp(0, input_scale: ‘celsius’, output_scale: ‘fahrenheit’) => 32.0 Note that the input values are a lowercase version of corresponding scales. Problem solution. # Your code here def convert_temp(temp, input_scale, output_scale:'celsius') temp = temp.to_f case input_scale[:input_scale] when "celsius" case input_scale[:output_scale] when "celsius" return temp when "kelvin" return temp + 273.15 when "fahrenheit" return ((9*temp)/5)+32 end when "fahrenheit" case input_scale[:output_scale] when "fahrenheit" return temp when "celsius" return (5*(temp - 32))/9 when "kelvin" holdcel = (5*(temp - 32))/9 return holdcel + 273.15 end when "kelvin" case input_scale[:output_scale] when "kelvin" return temp when "celsius" return temp - 273.15 when "fahrenheit" holdcel = temp - 273.15 return (5*(holdcel - 32))/9 end end end Second solution. # Your code here def convert_temp(temp, input_scale:'celsius', output_scale:'celsius') if input_scale==output_scale return temp end if input_scale=='celsius' and output_scale=='kelvin' return temp + 273 end if input_scale=='celsius' and output_scale=='fahrenheit' return temp*1.8+32 end if input_scale=='fahrenheit' and output_scale=='celsius' return (temp-32)/1.8 end if input_scale=='fahrenheit' and output_scale=='kelvin' return (temp+459.67)*5.0/9 end if input_scale=='kelvin' and output_scale=='celsius' return temp-273.15 end if input_scale=='kelvin' and output_scale=='fahrenheit' return temp*9.0/5-459.67 end end coding problems ruby