Michael O'Reggio
Michael O'Reggio

Reputation: 449

Ruby code for deleting the vowels in a string

I'm trying to write code in Ruby that removes all the vowels from a string:

def remvowel(string)
  i = 0
  dv_string = []
  while i < string.length
    if (string[i] != "a" || string[i] != "e" || string[i] != "i" || string[i] != "o" || string[i] != "u")
      dv_string.push(i)
      i += 1
    end
    i += 1
  end
  return dv_string.join
end

But it's not coming out right. When I run remvowel("duck"), it returns "02", as in the index positions of "dc". I'm missing something, but I don't know what.

Upvotes: 1

Views: 2477

Answers (5)

Wand Maker
Wand Maker

Reputation: 18762

Here is one more way this can be done:

s = "Hello, how are you you?"
vowels = "aeiou"
puts (s.chars - vowels.chars).join
#=> Hll, hw r y y?

Upvotes: 1

Mark Reed
Mark Reed

Reputation: 95267

That's because you're pushing i instead of string[i].

dv_string.push(i)

This is what you want:

dv_string.push(string[i])

However, that's a rather verbose and roundabout way of accomplishing the task. A somewhat more idiomatic Ruby approach would look like any of the ones ndn posted:

def remvowel(string)
  string.gsub /[aeiou]/, ''
end

or

def remvowel(string)
  string.tr 'aeiou',''
end

or

def remvowel(string)
  string.delete 'aeiou'
end

Upvotes: 4

Michael O&#39;Reggio
Michael O&#39;Reggio

Reputation: 449

Thank you everybody for your contributions. Thanks to you all (and especially you, Cary Swoveland), I not only know better ways to do this in the future, but even found an answer for my "scenic route" way of doing it!

def remvowel(string)
    i = 0
    dv_string = []

    while i < string.length
        dv_string.push(string[i])

        if (string[i] == "a" || string[i] == "e" || string[i] == "i" || string[i] == "o" || string[i] == "u")
            dv_string.delete(string[i])
        end

        i += 1
    end

    return dv_string.join
end

Granted, I'm gonna be doing the more sensible way from the responses here from now on, but mission accomplished!

Upvotes: 0

ndnenkov
ndnenkov

Reputation: 36100

You could just:

string.gsub(/[aeiou]/, '')

Or even better:

string.tr('aeiou', '')

And the best tool for deleting characters in a string is...

string.delete('aeiou')

Upvotes: 16

Andrew Williamson
Andrew Williamson

Reputation: 8661

You've got it almost right:

def remvowel(string)
    i = 0
    dv_string = []

    while i < string.length
        if (string[i] != "a" || string[i] != "e" || string[i] != "i" || string[i] != "o" || string[i] != "u")
            # Push the letter, not i
            dv_string.push(string[i])
            # Don't increment i here
        end

        i += 1
    end

    return dv_string.join
end

Your algorithm increments i twice if you encounter a consonant, so you are skipping every second letter.

Upvotes: 2

Related Questions