--
sRi+WkWf78h09RwAja1
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
My converter converts alcoholic beverages by effect *). In addition to
the source and destination beverage it converts the used containers,
too. Google can't do this yet ;-)
Example:
$ ruby convert.rb 1 bottle of wine into glasses of beer
1 bottle (0.75l) of wine (VOL 12%) effects equal to 6.06 glasses (2.00l)
of beer (VOL 4%)
$ ruby convert.rb 1 bucket of beer into cups of martini
1 bucket (10.00l) of beer (VOL 4%) effects equal to 26.47 cups (2.65l)
of martini (VOL 17%)
Martin
*)
- Please use results with care!
- It can't turn water into wine!
On Sat, 2008-11-15 at 00:49 +0900, Matthew Moss wrote:
> - - - - - - - - - - - - - - - - - -
>
> The three rules of Ruby Quiz 2:
>
> 1. Please do not post any solutions or spoiler discussion for this
> quiz until 48 hours have passed from the time on this message.
>
> 2. Support Ruby Quiz 2 by submitting ideas as often as you can!
> Visit <http://splatbang.com/rubyquiz/>.
>
> 3. Enjoy!
>
> Suggestion: A [QUIZ] in the subject of emails about the problem
> helps everyone on Ruby Talk follow the discussion. Please reply to
> the original quiz message, if you can.
>
> - - - - - - - - - - - - - - - - - -
>
> ## Unit Conversion (#183)
>
> Google added a calculator to its search engine a while back. Enter
> "convert 50 miles to kilometers", or even just "50 mi to km", and the
> first "search" result will tell you that 50 miles is 80.4672
> kilometers. This works for units other than length. Try "33 ml to
> gal", "6 hours to minutes", and"50 stones to lbs", and you'll see that
> Google's calculator knows a lot of different units and how to convert
> between them all.
>
> Your task is to write a units converter script. The input to the
> script must be three arguments: the quantity, the source units, and
> the destination units. The first example above would be run like this:
>
> $ ruby convert.rb 50 miles kilometers
>
> Or, using abbreviations:
>
> $ ruby convert.rb 50 mi km
>
> Support as many units and categories of units (i.e. volume, length,
> weight, etc.) as you can, along with appropriate abbreviations for
> each unit.
>
--
sRi+WkWf78h09RwAja1
Content-Disposition: attachment; filename="convert.rb"
Content-Type: application/x-ruby; name="convert.rb"
Content-Transfer-Encoding: 7bit
class Convert
BOOZE 'wine' 0.12,
'beer' 0.045,
'strong-beer' 0.06,
'whiskey' 0.43,
'strohrum' 0.80,
'martini' 0.17,
'cider' 0.05,
'fruit-juice' 0.001
}
CONTAINERS
['bottle', 'bottles'] 0.75,
['boot', 'boots'] 3.0,
['cup', 'cups'] 0.1,
['liter', 'liters'] 1.0,
['bucket','buckets'] 10.0,
['pitcher', 'pitchers'] 1.77,
['ounce','ounces'] 0.0295,
['glas','glasses'] 0.33,
['bathtub', 'bathtubs'] 150.0 }
# output helpers
def v(f)
"VOL #{(f*100).to_i}%"
end
def a(f)
"%.2f" % f
end
def initialize(question)
@question uestion
parse()
end
def parse()
creg ONTAINERS.keys.flatten.join('|')
breg OOZE.keys.join('|')
reg ^(\d+)\s*(#{creg})\s*of\s*(#{breg})\s*(in|into)\s*(#{creg})\s*of\s*(#{breg})$/i
raise ArgumentError.new("Can't parse #{@question}") unless @question reg
values question.split(' ').map { |e| e.downcase.strip }
@amount alues[0].to_f * CONTAINERS.find {|k,v| k.include?(values[1])}[1].to_f # amount to convert in liter
@samount alues[0] # source amount of container
@svol OOZE.find {|k,v| k values[3] }[1] # source beverage alc
@scont alues[1] # source container
@sbooze alues[3] # source booze by name
@dvol OOZE.find {|k,v| k values[7] }[1] # destination beverage alc
@dbooze alues[7] # destination booze by name
@dcont ONTAINERS.find {|k,v| k.include?(values[5])} # Destination container - hash
@damount amount * @svol / @dvol # destination amount
end
def result
"#{@samount} #{@scont} (#{a(@amount)}l) of #{@sbooze} (#{v(@svol)}) effects equal to #{a(@damount / @dcont[1])} #{@dcont[0][1]} (#{a(@damount)}l) of #{@dbooze} (#{v(@dvol)})"
end
def self.help
"#{__FILE__} - Converts beverages by alcohol effect\n\n"+
"Example: 5 bottles of beer into cups of whiskey\n"+
" Possible containers: #{CONTAINERS.keys.map { |e| e[0]}.join(', ')}\n"+
" Possible beverages: #{BOOZE.keys.join(', ')}"
end
end
begin
puts Convert.new(ARGV.join(' ')).result
rescue ArgumentError e
puts Convert.help
end
--
sRi+WkWf78h09RwAja1--