Class: MicrowaveKeyPressEfficiency::Calculator

Inherits:
Object
  • Object
show all
Defined in:
lib/microwave_key_press_efficiency/calculator.rb

Constant Summary collapse

KEYPAD =
{
  1 => [1, 2, 3],
  2 => [4, 5, 6],
  3 => [7, 8, 9],
  4 => [nil, 0, :cook]
}

Instance Method Summary collapse

Instance Method Details

#efficiency(*keys) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/microwave_key_press_efficiency/calculator.rb', line 29

def efficiency(*keys)
  keys = keys.dup.flatten!
  score = 0
  prev_floor = nil
  prev_value_position = nil

  # this key needs to be pressed at the very end
  keys << :cook

  keys.each_with_index do |key, idx|
    KEYPAD.each_pair do |floor, values|
      if values.include?(key)
        # we want to start adding score only when this is not first iteration
        if idx > 0
          score += (prev_floor - floor).abs
          score += (prev_value_position - values.index(key)).abs
        end
        prev_floor = floor
        prev_value_position = values.index(key)
      end
    end
  end

  score
end

#keys_to_press(time) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/microwave_key_press_efficiency/calculator.rb', line 10

def keys_to_press(time)
  time_as_entered = time.to_s.split("").map(&:to_i)

  time_converted = []
  divided_time = time.divmod(60)
  if divided_time[1] == 0
    time_converted << divided_time[0] << divided_time[1] << 0
  elsif divided_time[1] < 10
    time_converted << divided_time[0] << 0 << divided_time[1]
  else
    time_converted << divided_time[0] << divided_time[1]
  end

  score1 = efficiency(time_as_entered)
  score2 = efficiency(time_converted)

  score1 > score2 ? time_converted.join.to_i : time
end