On Sat, May 31, 2008 at 2:27 AM, Matthew Moss <matthew.moss / gmail.com> wrote:
> ## Price Ranges
>
> _Quiz description by James Edward Gray II_
>
> You have a list of price ranges from different vendors like:
>
>    Company A:  $1,000 - $3,000
>    Company B:  $6,000 - $10,000
>    Company C:  $500 - $2,500
>
> Given such a list and the desired price range a shopper wishes to pay,
> return the companies the shopper should examine. For example, if the
> shopper's price range was:
>
>    Low:   $2,500
>    High:  $5,000
>
> the companies returned would be:
>
>    Company A
>    Company C
>
> The shopper should also be allowed to provide just a low or just a high
> value instead of both, should they prefer to do so.

Here's my solution. I use codeforpeople's main, so the program accepts
a --help that explains the params. I expected a file in CSV format for
the company data:

company1, low, high
company2, low, high

and the shopper's low and high are passed as options to the program:

require 'main'
require 'fastercsv'

Main {
	argument('file')
	
	option('low', 'l') {
		argument_required
		cast :int
		default 0
	}
	
	option('high', 'g') {
		argument_required
		cast :int
	}

	def run
		file = params[:file].value
		low = params[:low].value
		have_high = params[:high].given?
		high = params[:high].value if have_high
		values = []
		FasterCSV.foreach file do |line|
			cmp_values = [line[0]]
			cmp_values << line[1].to_i
			cmp_values << line[2].to_i
			values << cmp_values
		end
		
		unless have_high
			companies = values.select {|x| x[2] >= low}
		else
			companies = values.reject {|x| (x[1]  > high) || (x[2] < low)}
		end
		companies.map! {|x| x[0]}
		puts companies
	end	
}

For example for this company_data.csv file:

company1, 1000, 3000
company2, 6000, 10000
company3, 500, 2500

these are some runs:

$ ruby quiz164.rb company_data.csv
company1
company2
company3

$ ruby quiz164.rb company_data.csv -l 4000
company2

$ ruby quiz164.rb company_data.csv -l 4000 -g 5000

$ ruby quiz164.rb company_data.csv -g 1500
company1
company3

$ ruby quiz164.rb company_data.csv -g 750
company3

$ ruby quiz164.rb --help
NAME
  quiz164.rb

SYNOPSIS
  quiz164.rb file [options]+

PARAMETERS
  file (1 -> file)
  --low=low, -l (0 ~> int(low=0))
  --high=high, -g (0 ~> int(high))
  --help, -h


Thanks for the quiz.

Jesus.