Первые несколько вопросов:
- Что такое гласная? В вашем примере у вас есть
y
. В моих глазах y
не гласный. А как насчет умлаутов?
- Только строчными буквами или также заглавными буквами?
В моем примере вы можете принять константу VOWELS
к своему определению.
Я думаю, что проще всего было сосчитать гласные с String#count
.
Ниже приведен пример с тремя вариантами a-c.
Вы написали о двух гласных, а не о двух разных гласных. Мои решения a + b работают только для двух гласных, даже одного и того же. Вариант с работает только в том случае, если в слове есть хотя бы два разных гласных.
VOWELS = 'aeiouyAEIOUY'
%w{
test
teste
testa
}.each{|word|
puts 'a: ' + word if word.count(VOWELS) > 1
puts 'b: ' + word if /[#{VOWELS}].*?[#{VOWELS}]/ =~ word
puts 'c: ' + word if word.scan(/[#{VOWELS}]/).uniq.count > 1
}
Я сделал тест. Решение count
является самым быстрым.
require 'benchmark'
N = 10_000 #Number of Test loops
VOWELS = 'aeiouyAEIOUY'
TESTDATA = %w{
test
teste
testa
}
Benchmark.bmbm(10) {|b|
b.report('count') { N.times { TESTDATA.each{|word| word.count(VOWELS) > 1} } }
b.report('regex') { N.times { TESTDATA.each{|word| /[#{VOWELS}].*?[#{VOWELS}]/ =~ word} } }
b.report('scab') { N.times { TESTDATA.each{|word| word =~ /[#{VOWELS}].*?[#{VOWELS}]/ } } }
b.report('scan/uniq') { N.times { TESTDATA.each{|word| word.scan(/[#{VOWELS}]/).uniq.count > 1 } } }
} #Benchmark
Результат:
Rehearsal ---------------------------------------------
count 0.031000 0.000000 0.031000 ( 0.031250)
regex 0.562000 0.000000 0.562000 ( 0.562500)
scab 0.516000 0.000000 0.516000 ( 0.515625)
scan/uniq 0.437000 0.000000 0.437000 ( 0.437500)
------------------------------------ total: 1.546000sec
user system total real
count 0.031000 0.000000 0.031000 ( 0.031250)
regex 0.500000 0.000000 0.500000 ( 0.515625)
scab 0.500000 0.000000 0.500000 ( 0.500000)
scan/uniq 0.422000 0.000000 0.422000 ( 0.437500)