Skip to content

Instantly share code, notes, and snippets.

@mstruve
Created March 6, 2019 23:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mstruve/f44196c4f58cb38ff3e3aafbbbda69a1 to your computer and use it in GitHub Desktop.
Save mstruve/f44196c4f58cb38ff3e3aafbbbda69a1 to your computer and use it in GitHub Desktop.
Restaurant Reservation TakeHome problem
# To run: irb -r <path to file>/reservation.rb
# Load gems and install if necessary
begin
gem "highline"
gem "table_print"
rescue LoadError
system("sudo gem install highline")
Gem.clear_paths
end
require 'highline/import'
require 'table_print'
class Restaurant
attr_accessor :name, :tables
def initialize(name)
self.name = name
self.tables = create_tables
end
def make_reservation(customer_name, party_size, time)
table = find_table(party_size, time)
Reservation.new(customer_name, time, table)
puts "You have successfully created a reservation!"
rescue TableNotAvailableError
puts "Uh oh! There are no tables available. Maybe try another time."
rescue TableSizeError
puts "Im sorry, we can't handle a party your size."
end
def create_tables
# I choose to randomly create tables for a restaurant
# You could change this to create_table(size) if you
# wanted control over creating your own tables.
(1..5).map{|i| Table.new(i, rand(2..8)) }
end
def find_table(party_size, time)
raise TableSizeError if tables.map{|t| t.size}.max < party_size
available_table = tables_available(time).sort{|t1, t2| t1.size <=> t2.size}.detect{|t| t.size >= party_size}
raise TableNotAvailableError unless available_table
available_table
end
def tables_available(time)
tables.select{|t| t.available?(time)}
end
def reservations
tables.collect{|t| t.reservations}.flatten
end
class Table
attr_accessor :number, :size, :reservations
def initialize(number, size)
self.number = number
self.size = size
self.reservations = []
end
def available?(time)
reservations.none?{|r| r.time == time}
end
end
class Reservation
attr_accessor :name, :table, :time
def initialize(name, time, table)
self.name = name
self.time = time
self.table = table
reserve_table
end
def reserve_table
table.reservations << self
end
end
class TableSizeError < StandardError; end
class TableNotAvailableError < StandardError; end
end
r = Restaurant.new("Risky Business")
make_a_reservation = "Y"
puts "The restaurant Risky Business has #{r.tables.count} tables:"
tp r.tables, "number", "size"
puts "There are currently no reservations."
while make_a_reservation == "Y" do
make_a_reservation = ask "Do you want to make a reservation? (Y/N) "
next if make_a_reservation == "N"
time = ask "What time do you want to go? (ex. 7PM)"
party_size = ask("How many people?", Integer)
name = ask "What is the name for the reservation?"
r.make_reservation(name, party_size, time)
puts "Reservations for the evening"
tp r.reservations, "name", "table.number", "time"
end
puts "Have a nice day!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment