2016-07-02 2 views
1

Я хочу изменить:Как сделать строку 1-го буквенных колпачков, 2-х буквенных незакрытых, 3-х буквенных колпачков, 4-х буквенных незакрытых ...?

word = "Stackoverflow is awesome!" 

в:

"StAcKoVeRfLoW Is aWeSoMe!" 

я сделал:

result = "" 
a = word.length 
odd = (1..a).select(&:odd?) 
even = (1..a).select(&:even?) 
odd.each {|i| even.each {|b| result += word[b].to_s}} 
result # => "akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!" 
+0

Я вижу некоторые ошибки в вашем коде: 1. Вы хотите превратить некоторые символы вашей строки 'word' в символы верхнего разряда, но вы никогда не вызываете метод' String # upcase' в вашем скрипте. 2. Вы добавляете к переменной 'result' символы, которые хотите изменить, но вы забыли добавить те, которые не нуждаются в модификации. 3. В строке 'odd.each {| i | even.each {| b | result + = word [b] .to_s}} 'вы выполняете« нечетные * итерации ». Имейте в виду, что 'word'variable имеет длину' odd + even'. Надеюсь, это поможет вам найти решение! –

ответ

3
"Stackoverflow is awesome!" 
.gsub(/(.)(.)?/){$1.upcase + $2.to_s.downcase} 
# => "StAcKoVeRfLoW Is aWeSoMe!" 

"Stackoverflow is awesome!" 
.gsub(/./).with_index{|s, i| i.even? ? s.upcase : s.downcase} 
# => "StAcKoVeRfLoW Is aWeSoMe!" 

"Stackoverflow is awesome!" 
.gsub(/..?/, &:capitalize) 
# => "StAcKoVeRfLoW Is aWeSoMe!" 
+1

Удивительный! Благодаря! @sawa – Charles

1

Есть, вероятно, более умные способы сделать это, но я думаю, что это является одним из самых ясных:

text = "Stackoverflow is awesome!" 

for i in 0...text.length do 
    if i.even? 
    text[i] = text[i].upcase 
    else 
    text[i] = text[i].downcase 
    end 
end 

puts text 

# Output: 
# StAcKoVeRfLoW Is aWeSoMe! 
1
word = "Stackoverflow is awesome!" 
word.scan(/(.)(.)/).inject('') {|s,(x,y)| s << x.upcase << y.downcase} 
# => "StAcKoVeRfLoW Is aWeSoMe" 

Update

Убрана зависимость от второго матча регулярного выражения, как в ответ Саввы.

word = "Stackoverflow is awesome!" 
word.scan(/(.)(.)?/).inject('') {|s,(x,y)| s << x.upcase << y.to_s.downcase} 
+0

Почему downvote? «Пожалуйста, подумайте над добавлением комментария, если вы считаете, что этот пост можно улучшить». – SoAwesomeMan

1

Попробуйте это:

word.downcase.chars.map.with_index { |c,i| i%2==0 ? c.upcase : c }.join 
#=> "StAcKoVeRfLoW Is aWeSoMe!" 
+0

Почему вы делаете 'downcase' для всей строки? – sawa

+0

@sawa Я сделал это, поэтому значение по умолчанию имеет нижний регистр, поэтому мне не нужно иметь дело с ним в тернарном операторе. Например, в настоящее время мой код работает для 'word =" STACKOVEFLOW IS awesome! "' Из-за метода 'downcase'. –

+0

Зачем делать это по умолчанию лучше, чем делать это в тройной форме? Я не вижу намерения вашего примера в комментарии. – sawa

2

Вот несколько методов, которые еще не были упомянуты.

text = "Stackoverflow is awesome!" 

text.downcase.dup.tap { |t| (0...t.size).step(2) { |i| t[i] = t[i].upcase } } 
    #=> "StAcKoVeRfLoW Is aWeSoMe!" 

e = [:upcase, :downcase].cycle 
"Stackoverflow is awesome!".gsub(/./) { |c| c.send e.next } 
    #=> "StAcKoVeRfLoW Is aWeSoMe!" 

Обе эти работы, если text содержит смесь прописных и строчных букв.

+0

Я знал, что вы собираетесь использовать цикл. – sawa

+1

@sawa, я знал, что вы это знаете и скажете так, и подозреваете, что знаете, что я знал, что вы знали. Когда дело доходит до счетчиков, у меня нет самообладания. –

Смежные вопросы