Pretty cool what I can do.
Last active
August 29, 2015 14:05
-
-
Save richardjortega/1c04e571cd1d9a9ef176 to your computer and use it in GitHub Desktop.
Time Code Exercise
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class TimeMethods | |
# [H]H:MM {AM|PM} -> 9:13 AM | |
def add_time(time, minutes) | |
validate_minutes(minutes) | |
parsed_time = parse_time(time) | |
minutes_added = parsed_time[:minutes] + minutes | |
parsed_time[:minutes] = minutes_added % 60 | |
parsed_time[:hour] += 1 if minutes_added > 60 | |
if parsed_time[:hour] == 12 | |
periods = ['AM', 'PM'] | |
periods.delete(parsed_time[:period]) | |
parsed_time[:period] = periods.first | |
end | |
puts format_time(*parsed_time.values_at(:hour, :minutes, :period)) | |
end | |
private | |
def parse_time time | |
period = time.slice!(-2..-1) | |
hour, minutes = time.strip.split(':') | |
total_minutes = (hour.to_i * 60) + minutes.to_i | |
parsed_time = { | |
hour: hour.to_i, | |
minutes: minutes.to_i, | |
period: period, | |
total_minutes: total_minutes | |
} | |
end | |
def format_time(hour, minutes, period) | |
"#{hour}:#{format_minutes(minutes)} #{period.upcase}" | |
end | |
def format_minutes minutes | |
minutes.to_s.length == 1 ? "0#{minutes}" : minutes | |
end | |
def validate_minutes minutes | |
# Wouldn't do this in real world, but wanted to limit total time spent | |
if minutes < 0 | |
raise 'Cannot deduct time, please enter a positive integer.' | |
elsif minutes > 60 | |
raise 'Cannot add more than 60 minutes, because internet.' | |
end | |
end | |
end | |
TimeMethods.new.add_time("9:13 AM", 10) # Expected: 9:23 AM | |
TimeMethods.new.add_time("11:53 AM", 25) # Expected: 12:18 PM | |
TimeMethods.new.add_time("9:13 AM", 60) # Expected: 10:13 AM | |
## For testing validations | |
# TimeMethods.new.add_time("9:13 AM", -10) # Expected: raise error | |
# TimeMethods.new.add_time("9:13 AM", 120) # Expected: raise error | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment