carolineartz
10/7/2015 - 4:11 AM

for DBC Phase 0 coaching

for DBC Phase 0 coaching

# Requirements
#
# Create a new list
# Add an item with a quantity to the list
# Remove an item from the list
# Update quantities for items in your list
# Print the list (Consider how to make it look nice!)


# Pseudocode
#
# DEFINE 'new_list' which takes no arguments:
#   CREATE and RETURN an empty hash
#
# DEFINE 'add', which takes three arguments, item (a string) and quantity (a string), and list (a hash):
#   IF item is on list
#     PRINT message that item is already on list
#   ELSE
#     ADD key item to list with value qantity
#
# DEFINE 'remove', which takes two arguments, an item (string), and a list (hash):
#   IF item is on list
#     DELETE the element of list with key of item
#   ELSE
#     PRINT message that item isn't actually on the list
#
# DEFINE 'update', which takes three arguments, an item (string), a quantity (a string) and a list(hash):
#   IF item is on list
#     SET list at item's value to quantity
#   ELSE
#     PRINT message that the item isn't there to update
#
# DEFINE print_list, which takes one argument, a list (hash)
#   ITERATE over each element of list, for each item, quantity
#     PRINT item in uppercase, hyphen, quantity



# Initial solution
#
def new_list
  Hash.new
end

def add(item, quantity, list)
  if list[item]
    puts "#{item.upcase} is already on your list! Use command `update` to change the quantity."
  else
    list[item] = quantity
  end
end

def remove(item, list)
  if list[item]
    list.delete(item)
  else
     puts "Whoops! #{item.upcase} wasn't even on your list!"
  end
end

def update(item, quantity, list)
  if list[item]
    list[item] = quantity
  else
    puts "Whoops! #{item.upcase} wasn't on your list! Use `add` to add your item."
  end
end

def print(list)
  list.each do |item, quantity|
    puts "#{item.upcase} - #{quantity}"
  end
end


# Tests
my_list = new_list
p my_list == {}

add("Carrots", "10", my_list)
p my_list == {"Carrots" => "10"}
add("Carrots", "20", my_list)
p my_list == {"Carrots" => "10"}
add("Apples", "15", my_list)
p my_list == {"Carrots" => "10", "Apples" => "15"}

remove("Oranges", my_list)
p my_list == {"Carrots" => "10", "Apples" => "15"}
remove("Apples", my_list)
p my_list == {"Carrots" => "10"}

update("Carrots", "20", my_list)
p my_list == {"Carrots" => "20"}
update("Oranges", "20", my_list)
p my_list == {"Carrots" => "20"}


# Refactored solution w/ commandline input
#
def new_list
  {}
end

def add(item, quantity, list)
  return list[item] = quantity unless list[item]
  puts "#{item.upcase} is already on your list! Use command `update` to change the quantity."
end

def remove(item, list)
  list.delete(item) { |item| puts "Whoops! #{item.upcase} wasn't on your list!" }
end

def update(item, quantity, list)
  return list[item] = quantity if list[item]
  puts "Whoops! #{item.upcase} wasn't on your list! Use `add` to add your item."
end

def print(list)
  list.each { |item, quantity| puts "#{item.upcase} - #{quantity}" }
end

def help
  puts <<-helpdocs
    The following commands are available. Separate input with a single space, e.g.:
      add 10 chips

    add <number> <item>           ADD an item to your list:
    remove <item>                 REMOVE an item from your list
    update <item> <quantity>      UPDATE an item's quantity on your list

    help                          show HELP documentation
    quit                          exit the program
  helpdocs
end

def run
  puts "Hello! Lets get ready to shop!"
  list = new_list
  puts "Type 'help' to see a list of available commands."
  input = ""

  until input[0] == "quit"
    puts
    puts "What would you like to do?"
    input = gets.chomp.split(" ")
    puts

    case input[0]
    when 'add' then add(input[2], input[1], list)
    when 'remove' then remove(input[1], list)
    when 'update' then update(input[1], input[2], list)
    when 'help' then help; next
    else puts "Try again..."
    end

    puts; puts "*******************"
    puts "This is your list:"
    print(list)
    puts
  end
end

run