2016-07-02 5 views
1

Ich möchte ändern:Wie man eine Schnur macht 1. Briefkappen, 2. Brief nicht caps, 3. Briefkappen, 4. Brief noncaps ...?

word = "Stackoverflow is awesome!" 

in:

"StAcKoVeRfLoW Is aWeSoMe!" 

ich getan habe:

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

Ich sehe einige Fehler in Ihrem Code: 1. Sie möchten einige Zeichen Ihrer 'word' Zeichenfolge in upcase Zeichen, aber Sie rufen nie die Methode' String # upcase' in Ihrem Skript. 2. Sie fügen der Variablen 'result' nur die Zeichen hinzu, die Sie ändern möchten, aber Sie haben vergessen, diejenigen hinzuzufügen, die nicht geändert werden müssen. 3. In der Zeile 'odd.ach {| i | even.each {| b | result + = word [b] .to_s}} 'du führst gerade 'ungerade * Iterationen durch. Beachten Sie, dass die Wortvariable von der Länge "ungerade + gerade" ist. Hoffe das hilft dir deine Lösung zu finden! –

Antwort

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

Super! Vielen Dank! @sawa – Charles

1

Es gibt wahrscheinlich mehr clevere Möglichkeiten, dies zu tun, aber ich denke, das ist eine der am klarsten:

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" 

aktualisieren

entfernt Abhängigkeit von zweiten Regex, wie in Sawa Antwort.

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

Warum der Downvote? "Bitte denken Sie daran, einen Kommentar hinzuzufügen, wenn Sie denken, dass dieser Beitrag verbessert werden kann." – SoAwesomeMan

1

Try this:

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

Warum machst du die ganze Saite runter? – sawa

+0

@sawa Ich tat dies, also ist die Standardeinstellung kleingeschrieben, was bedeutet, dass ich im ternären Operator nicht damit umgehen muss. Zum Beispiel funktioniert mein Code momentan für 'word =" STACKOVEFLOW ist genial! "' Wegen der 'downcase' Methode. –

+0

Warum ist es besser, als das im ternären Standard zu tun? Ich sehe die Absicht Ihres Beispiels nicht im Kommentar. – sawa

2

Hier sind ein paar Methoden, die nicht erwähnt wurden.

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!" 

Beide dieser Arbeit, wenn text eine Mischung aus Groß- und Kleinbuchstaben enthält.

+0

Ich wusste, dass Sie Zyklus verwenden würden. – sawa

+1

@Sawa, ich wusste, dass du das wusstest und würdest es sagen, und vermute, dass du wusstest, dass ich wusste, dass du es weißt. Wenn es um Enumeratoren geht, habe ich keine Selbstkontrolle. –