Extract numbers from an alpha numeric string

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 Thu, Oct 4, 2012 at 5:29 PM, Joao S. [email protected] 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.

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 Thu, Oct 4, 2012 at 6:09 PM, Jan E. [email protected] 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