Hi All.
I'm doing a program in which you have to enter a series of numbers like
this: 1-3-4-11-15-8, I extract the numbers, and then transfer to a hash,
the program does is that given 2 arrays with shirt numbers, and the
names of a soccer team, should I create a hash associating both arrays.
for example if I enter 1-3-4-11, the program should return:
1 => p1
3 => p3
4 => p4
11 => p11
try removing the dashs of string, but when I pass as argument a number
greater than nine, I just passed the first number:
1 => p1
3 => p2
10 => p1
11 => p1
I mean?, here is the code:
###############################################
tshirts=["1","2","3","4","5","6","7","8","9","10","11"]
players=["p1","p2","p3","p4","p5","p6","p7","p8","p9","p10","p11"]
h={
1=>"p1",
2=>"p2",
3=>"p3",
4=>"p4",
5=>"p5",
6=>"p6",
7=>"p7",
8=>"p8",
9=>"p9",
10=>"p10",
11=>"p11"
}
h.each{|k,v|puts "#{k} => #{v}"}
def output(str,h)
s={}
for i in 0..str.length
h.each{|k,v|
if k == str[i].to_i
#puts "#{k} ==> #{v}"
s[i]="#{v}"
print s[i].inspect
#print "-"
end
}
end
end
print "Enter numbers of players (ej: 1-3-11-7-15-22-4-7): "
str=gets.chomp.to_s
for i in 0..str.length-1
if str[i]=="-"
str[i]=""
end
end
#puts str
output(str,h)
###################################################################
I accept any suggestion.
Thanks.
on 2012-10-04 17:29
on 2012-10-04 18:02
On Thu, Oct 4, 2012 at 5:29 PM, Joao Silva <lists@ruby-forum.com> wrote: > 3 => p3 > > 4=>"p4", > > end > for i in 0..str.length-1 > > I accept any suggestion. I think you are making things too complicated. If you have a mapping for numbers => names: h = {1 => "p1", ...} by the way, if the rule is so simple you can build it dynamically: 1.9.2p290 :009 > h = (1..10).inject({}) {|hash, el| hash[el] = "p#{el}";hash} => {1=>"p1", 2=>"p2", 3=>"p3", 4=>"p4", 5=>"p5", 6=>"p6", 7=>"p7", 8=>"p8", 9=>"p9", 10=>"p10"} Then you just need to split the string and convert the strings to numbers: # read the input removing the \n 1.9.2p290 :003 > input = gets.chomp 1-2-3-4 => "1-2-3-4" # split on the "-" 1.9.2p290 :004 > numbers = input.split("-") => ["1", "2", "3", "4"] # translate to real numbers 1.9.2p290 :005 > numbers.map! {|element| element.to_i} => [1, 2, 3, 4] # for each number, look it up in the hash to get the name 1.9.2p290 :010 > numbers.each {|number| puts "#{number} => #{h[number]}"} 1 => p1 2 => p2 3 => p3 4 => p4 => [1, 2, 3, 4] Jesus.
on 2012-10-04 18:09
Hi,
when you iterate over single characters, then of course you only get
numbers with one digit. And when you remove the separators, you also
make the numbers indistinguishable. For example, "2-2" has the same
output as "22".
So this cannot work. You either have to split the string at the "-" or
look for numbers with a regex:
input = '1-3-11-7-4-7'
players = input.split('-').map {|num| h[num.to_i]}
p players
or
input = '1-3-11-7-4-7'
players = input.scan(/\d+/).map {|num| h[num.to_i]}
p players
I didn't exactly understand what you want, so this is just an array of
the selected values of the "h" hash.
But I agree with Jesús that you're making things far too complicated.
Forget those "for-in" loops. This is not Java. Ruby has far more
advances methods.
on 2012-10-07 09:38
On Thu, Oct 4, 2012 at 6:09 PM, Jan E. <lists@ruby-forum.com> wrote: > players = input.scan(/\d+/).map {|num| h[num.to_i]} > p players > > I didn't exactly understand what you want, so this is just an array of > the selected values of the "h" hash. I think OP wants to map numbers to names. Since keys in this case are numbers and they are in a relatively small range we can also use an Array instead a Hash. But first with a Hash: h defined as above irb(main):014:0> input = '1-3-11-7-4-7' => "1-3-11-7-4-7" irb(main):016:0> input.scan(/\d+/).map {|n| h[n.to_i]} => ["p1", "p3", "p11", "p7", "p4", "p7"] irb(main):017:0> input.scan(/\d+/).map {|n| h[Integer(n)]} => ["p1", "p3", "p11", "p7", "p4", "p7"] now with an Array irb(main):019:0> h=%w{p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11} => ["p0", "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8", "p9", "p10", "p11"] irb(main):020:0> input.scan(/\d+/).map {|n| h[Integer(n)]} => ["p1", "p3", "p11", "p7", "p4", "p7"] Kind regards robert
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.