Forum: Ruby Re: beginner Q.

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
unknown (Guest)
on 2007-07-27 03:56
(Received via mailing list)
I don't know about hh's implementation but how about

irb(main):003:0> print "foo:"; gets().split
foo:this is a test
=> ["this", "is", "a", "test"]

Also, look at highline at http://highline.rubyforge.org/
--
Johnny P

--- Original Message ---
Chris T. (Guest)
on 2007-07-27 04:14
(Received via mailing list)
On 7/26/07, removed_email_address@domain.invalid 
<removed_email_address@domain.invalid> wrote:
>
> > *ask* command, so you could do things like
> > Array_2 = ask("put in 2nd vendors prices) *and then i could
> > go on and
> > subtract the two arrays*
> >
> > Sorry if this is a totaly idiotic question :(!?
> > Much thanx for anyones help!
> > --
> > Posted via http://www.ruby-forum.com/.
> >



To clarify:
irb(main):006:0> def ask(question)
irb(main):007:1> puts "#{question}:\n"
irb(main):008:1> gets.split
irb(main):009:1> end
=> nil
irb(main):010:0> answer = ask("Enter 1st vendor's prices")
Enter 1st vendor's prices:
$1 $2 $3 $4
=> ["$1", "$2", "$3", "$4"]
irb(main):011:0> answer
=> ["$1", "$2", "$3", "$4"]
irb(main):012:0>


Although I'd have to point out that 'ask' is an awful name for a method.

Chris
Gabe B. (Guest)
on 2007-07-27 04:47
(Received via mailing list)
> Although I'd have to point out that 'ask' is an awful name for a method.

I'd say that depends entirely on context. In a context like Hackety
Hack, I think it's a perfectly good name.

-Gabriel Boyer
Erik B. (Guest)
on 2007-07-27 07:47
Gabe B. wrote:
>> Although I'd have to point out that 'ask' is an awful name for a method.
>
> I'd say that depends entirely on context. In a context like Hackety
> Hack, I think it's a perfectly good name.
>
> -Gabriel Boyer

humm ok so i tried out my *program* but at the very end i get an error..
irb(main):001:0> def ask(question)
irb(main):002:1> puts "#{question}:\n"
irb(main):003:1> gets.split
irb(main):004:1> end
=> nil
irb(main):005:0> Var_1 = ask("Enter 1st Vendors prices")
Enter 1st Vendors prices:
14.50 16.50 14
=> ["14.50", "16.50", "14"]
irb(main):006:0> Var_2 = ask("Enter 2nd vendors prices")
Enter 2nd vendors prices:
13 17.50 14
=> ["13", "17.50", "14"]
irb(main):007:0> Var_1.zip(Var_2)
=> [["14.50", "13"], ["16.50", "17.50"], ["14", "14"]]
irb(main):008:0> Var_1.zip(Var_2).map{ |pair| pair[0] - pair[1] }
NoMethodError: undefined method `-' for "14.50":String
        from (irb):8
        from (irb):8:in `map'
        from (irb):8
        from :0
irb(main):009:0>

could it because im using floats, and not intergers?
Peña, Botp (Guest)
on 2007-07-27 07:54
(Received via mailing list)
On Behalf Of Erik B.:
# humm ok so i tried out my *program* but at the very end i get
# an error..
# irb(main):001:0> def ask(question)
# irb(main):002:1> puts "#{question}:\n"
# irb(main):003:1> gets.split
# irb(main):004:1> end
# => nil
# irb(main):005:0> Var_1 = ask("Enter 1st Vendors prices")
# Enter 1st Vendors prices:
# 14.50 16.50 14
# => ["14.50", "16.50", "14"]
# irb(main):006:0> Var_2 = ask("Enter 2nd vendors prices")
# Enter 2nd vendors prices:
# 13 17.50 14
# => ["13", "17.50", "14"]
# irb(main):007:0> Var_1.zip(Var_2)
# => [["14.50", "13"], ["16.50", "17.50"], ["14", "14"]]
# irb(main):008:0> Var_1.zip(Var_2).map{ |pair| pair[0] - pair[1] }
                                                    ^^^^       ^^^^
                                          try pair[0].to_f -
pair[1].to_f
so,
irb(main):009:0> Var_1.zip(Var_2).map{ |pair| pair[0].to_f -
pair[1].to_f }
=> [1.5, -1.0, 0.0]

# NoMethodError: undefined method `-' for "14.50":String
                                   ^^^            ^^^^^^
                                there's the hint

# could it because im using floats, and not intergers?

you're using strings

kind regards -botp
Todd B. (Guest)
on 2007-07-27 08:11
(Received via mailing list)
On 7/26/07, Erik B. <removed_email_address@domain.invalid> wrote:
> irb(main):002:1> puts "#{question}:\n"
> => ["13", "17.50", "14"]
Your elements are Strings!  That's what you get back from the gets
method.  Let's change them to Floats.  But first, let's not use
starting capital letters for our variables...

irb> var_1, var_2 = Var_1, Var_2
=> [["14.50", "16.40", 14"], ["13","17.50", "14"]]
irb> [var_1, var_2].each { |array| array.map! { |elem| elem.to_f } }
=> [[14.5, 16.5, 14.0], [13.0, 17.5, 14.0]]

> irb(main):007:0> Var_1.zip(Var_2)
You don't need this ^^^^^^^^ line

irb> difference = var_1.zip(var_2).map { |pair| pair[0] - pair[1] }
=> [1.5, -1.0, 0.0]

Todd
Erik B. (Guest)
on 2007-07-27 08:16
Oh, wow ok should have thought of that, now instead of doing the whole
1.5 and -1.0 thing. It would be neat if it could just print *buy from
vendor #1" or "buy from vendor #2" *saying that you always want to buy
the cheapest, positives = vendor 2 is cheapest, negitaves, obviosly
vendor #1 is the cheapest*
Peña, Botp (Guest)
on 2007-07-27 08:43
(Received via mailing list)
From: Erik B. [mailto:removed_email_address@domain.invalid]
# 1.5 and -1.0 thing. It would be neat if it could just print *buy from
# vendor #1" or "buy from vendor #2" *saying that you always
# want to buy the cheapest, positives = vendor 2 is cheapest, negitaves,
# obviosly vendor #1 is the cheapest*

why don't you just compare their averages?

kind regards -botp
Erik B. (Guest)
on 2007-07-27 08:50
Peña, Botp wrote:
> From: Erik B. [mailto:removed_email_address@domain.invalid]
> # 1.5 and -1.0 thing. It would be neat if it could just print *buy from
> # vendor #1" or "buy from vendor #2" *saying that you always
> # want to buy the cheapest, positives = vendor 2 is cheapest, negitaves,
> # obviosly vendor #1 is the cheapest*
>
> why don't you just compare their averages?
>
> kind regards -botp

you mean like the avarage of all the items together from each vendor, if
so... Well im not sure how much you know about the food industry, but,
overtime if you dont find the cheapest prices, it adds up quick,
epecially when your running a big catering company like my dad :P. But i
was thinking.. couldn't i put if and elsifs for it to work???
Todd B. (Guest)
on 2007-07-27 09:33
(Received via mailing list)
On 7/26/07, Erik B. <removed_email_address@domain.invalid> wrote:
>
> you mean like the avarage of all the items together from each vendor, if
> so... Well im not sure how much you know about the food industry, but,
> overtime if you dont find the cheapest prices, it adds up quick,
> epecially when your running a big catering company like my dad :P. But i
> was thinking.. couldn't i put if and elsifs for it to work???

Also look at case-when and <=>
For example,

v1, v2 = [10, 9, 12], [8, 9, 13]
best = a.zip(b).map do |pair|
  case pair[0] <=> pair[1]
  when -1 then 'vendor a'
  when 0 then 'same'
  when 1 then 'vendor b'
  end
end

Eventually, you might want to use Hashes...
v1 = { :onions => 0.70, :carrots => 0.88 }
v2 = { :onions => 0.78, :carrots => 0.87, :celery => 0.61 }

And other cool stuff like that :)

Todd
Peña, Botp (Guest)
on 2007-07-27 12:20
(Received via mailing list)
On Behalf Of Erik B.:
# you mean like the avarage of all the items together from each
# vendor, if so...

ah, i was imagining things :) am sorry, i thought each row stands for
one item only; meaning, an item can have many prices (thru history) from
a vendor.  i assume vendors has many products and vice versa, and
products can have many prices.  In your case, i think you only get the
latest single price on each vendor, so something like

Product1
  Vendor1 -> Price
  Vendor2 -> Price
Product2
  Vendor1 ->Price
  Vendor2 ->Price
  Vendor3 ->Price
....

this is easy on database, but let's use a hash just to illustrate,

C:\family\ruby>cat -n test.rb
     1  # assume our dbpricing hash is our database
     2  dbpricing =
     3     {
     4     "product1" =>
     5        {"vendor1" => 110,
     6         "vendor2" => 100,
     7         "vendor3" => 105,
     8        },
     9     "product2" =>
    10        {"vendor1" => 115,
    11         "vendor2" => 110,
    12         "vendor3" => 105,
    13         "vendor4" => 105,
    14        },
    15     "product3" =>
    16        {"vendor1" => 90,
    17         "vendor2" => 110,
    18        },
    19     }
    20
    21  # let's print our small db
    22  # ppv stands for pricing per vendor
    23  # for each product, we print our favored price and vendor
    24  dbpricing.each do |product, ppv|
    25     puts "Product: #{product}"
    26     least_price = 1.0/0
    27     least_price_vendor = ""
    28     ppv.each do |vendor,price|
    29        puts "  #{vendor}: #{price}"
    30        if price < least_price
    31           least_price = price
    32           least_price_vendor = vendor
    33        end
    34     end
    35     puts "  --------------"
    36     puts "  Winner: #{least_price_vendor} w #{least_price}"
    37  end

now let's test

C:\family\ruby>ruby  test.rb
Product: product1
  vendor3: 105
  vendor1: 110
  vendor2: 100
  --------------
  Winner: vendor2 w 100
Product: product2
  vendor3: 105
  vendor4: 105
  vendor1: 115
  vendor2: 110
  --------------
  Winner: vendor3 w 105
Product: product3
  vendor1: 90
  vendor2: 110
  --------------
  Winner: vendor1 w 90


note, that we did not cater for ties and the vendors are not sort, so
those are left as an exercise :)

kind regards -botp
Erik B. (Guest)
on 2007-07-27 17:00
hummmmm, well it just kinda of needs to be clean like
*vendor1-vendro1-vendor2*
for prices.. also where do you enter things in the db?
Erik B. (Guest)
on 2007-07-28 00:13
Erik B. wrote:
> hummmmm, well it just kinda of needs to be clean like
> *vendor1-vendro1-vendor2*
> for prices.. also where do you enter things in the db?

Sorry, i was a bit short on my last quote, I had leave for work and
didn't really read all of your post.
The hash is nice, but it takes too long to enter each individual price,
the vendors update prices every day, so entering individual prices 3
times for each product takes longer than just highlighting like normal.
Although, im not sure how databases work.. maybe its faster than hashes.
You idea is pretty good, I would ajust it a bit to make it easier to
read. Instead of listing all the prices and things just simply put *for
example* strawberries: vendor#1. What if you saped the vendor and the
pricing in you hash? that way you could just copy ans paste the prices
into it, as long as the prices are in the correct order.
Peña, Botp (Guest)
on 2007-07-28 11:22
(Received via mailing list)
On Behalf Of Erik B.:
# Although, im not sure how databases work.. maybe its faster

if you have data. a database is the way to go. the fundamental idea is
that data and code should be separate. data should not be seen by the
programmer, only knowledge of its structure. Your program in turn, will
be structured too. You'll have to create a data entry program separate
from your report program. The data entry program will be in charged of
putting the data into the database. But anyway, in your case, just
relax, go slowly (since you'll be learning ruby also). a database is
another beast to tame and you'll be learning new things too specially on
normalization and indexes (there are many databases, you'll have to
scout it yourself, a quick list are: pstore, dbm/berkelydb, kirbybase,
sqlite, mysql, postgresql, etc.. ). i'll show you another scheme using
yaml... see below...

# than hashes. You idea is pretty good, I would ajust it a bit
# to make it easier to read. Instead of listing all the prices
# and things just  simply put *for example* strawberries: vendor#1.
# What if you saped the vendor and the pricing in you hash? that way
# you could just copy ans paste the prices into it, as long as the
# prices are in the correct order.

maybe you can show us how you want the data structured/formatted. do not
worry, as long as you can read it, it is structured.

as said, i'm going to show you another style. The data will be
structured/stored by vendor, then by product, this assumes like "I am
vendor#x, and this is my a price list of all products i'm selling". But
the report will rotate it so that you get product pricing w
corresponding vendors, wc assumes like "I am the owner. I need a list of
my products w corresponding pricing sorted for each vendor provider".
In this example, the data is stored separate on a yaml text file (just
read on yaml, it's highly documented).


C:\family\ruby>cat dbpricing.yaml
---
vendor3:
  product1: 90
  product2: 110
vendor1:
  product1: 110
  product2: 100
  product3: 105
vendor2:
  product1: 115
  product2: 110
  product3: 105
  product4: 105

C:\family\ruby>cat test2.rb

# let's load our data from our yaml database
# the yaml data is just a flat text file
# so you can edit it using any text editor
# just be mindful of the format

require 'yaml'
dbpricing = YAML.load(File.open("dbpricing.yaml"))

# then print it
# ppp stands for pricing per product

puts "------------------"
puts "Vendors Price List"
puts "------------------"
dbpricing.each do |vendor, ppp|
   puts "Vendor: #{vendor}"
   ppp.each do |product,price|
      puts "  #{product}: #{price}"
   end
end

# now, let's build another pricing db
# which is product centric
# for each product, it will list the vendors
#    selling that product and their corresponding prices
#    vendors are sorted by pricing

dbpricing2 = Hash.new{|h,k| h[k]={} }
dbpricing.each do |vendor, ppp|
   ppp.each do |product,price|
      dbpricing2[product][vendor] = price
   end
end

# then print it
# ppv stands for pricing per vendor

puts
puts "--------------"
puts "Our Price List"
puts "--------------"
dbpricing2.each do |product, ppv|
   puts "Product: #{product}"
   ppv.sort{|v1,v2| v1[1] <=> v2[1] }.each do |pair|
      puts "  #{pair[0]}: #{pair[1].to_s.rjust(4)}"
   end

end

C:\family\ruby>ruby test2.rb
------------------
Vendors Price List
------------------
Vendor: vendor3
  product1: 90
  product2: 110
Vendor: vendor1
  product1: 110
  product2: 100
  product3: 105
Vendor: vendor2
  product1: 115
  product2: 110
  product3: 105
  product4: 105

--------------
Our Price List
--------------
Product: product1
  vendor3:   90
  vendor1:  110
  vendor2:  115
Product: product2
  vendor1:  100
  vendor3:  110
  vendor2:  110
Product: product3
  vendor1:  105
  vendor2:  105
Product: product4
  vendor2:  105

C:\family\ruby>

hope that helps.
kind regards -botp
This topic is locked and can not be replied to.