Skip to content

Instantly share code, notes, and snippets.

@richardjortega
Last active August 29, 2015 14:05
Show Gist options
  • Save richardjortega/1c04e571cd1d9a9ef176 to your computer and use it in GitHub Desktop.
Save richardjortega/1c04e571cd1d9a9ef176 to your computer and use it in GitHub Desktop.
Time Code Exercise
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

This is a test for Markdown

Pretty cool what I can do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment