Mam pytanie dla początkujących. Próbuję po prostu zastąpić zmodyfikowany indeks z powrotem w oryginalnym ciągu, aby utworzyć tablicę ciągów. W kolejnym elemencie zwiększają one po kolei następny indeks. Oto co mam. Czy ktoś może mi pomóc zobaczyć, czego mi brakuje?

def wave(str)
  result = []
  index = 0
  while index < str.length
    i = str[index]
    if i == " "
      index =+ 1
    else
      upper = i.upcase
      val = str.rindex(upper) -1
      result.push("#{str[0...val]}#{str[val..-1]}")
      index += 1
    end
  end
  result
end

Próbuję uzyskać: [„Hello”, „hEllo”, „heLlo”, „helLo”, „hellO”] z ---> wave (hello)

Dziękuję Ci.

0
Eddie 2 kwiecień 2020, 13:31

3 odpowiedzi

Najlepsza odpowiedź

Twoja else część nie jest w porządku:

  1. nie musisz znajdować najbardziej odpowiedniego indeksu, ponieważ masz już index
  2. upper nigdy nie jest używany
  3. właściwy zakres jest wyłączony o jeden

Oto działający wariant:

    # ...
    else
      upper = i.upcase
      result.push("#{str[0...index]}#{upper}#{str[index+1..-1]}")
      index += 1
    end
    # ...

Możesz użyć each_char i with_index, aby twój kod jest trochę bardziej idiomatyczny:

def wave(str)
  result = []
  str.each_char.with_index do |char, index|
    next if char == " "
    result.push("#{str[0...index]}#{char.upcase}#{str[index+1..-1]}")
  end
  result
end
0
Stefan 2 kwiecień 2020, 11:24

Problem polega na tym, że deklarujesz zmienną górną, ale jej nie używasz. Spróbuj przepisać kod i tym razem go wykorzystaj. Jeśli nie jesteś pewien, co się dzieje w każdym wierszu kodu, po prostu umieść przed nim znak print .

0
VeronikaS 2 kwiecień 2020, 11:40

Inną opcją jest użycie Enumerable # map z Object # tap w ten sposób:

str = 'hello'

str.size.times.map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } }

#=> ["Hello", "hEllo", "heLlo", "helLo", "hellO"]

Musi zduplikować oryginalny ciąg, aby uniknąć zmiany samego oryginalnego ciągu, który zwróciłby ["HELLO", "HELLO", "HELLO", "HELLO", "HELLO"]

Do przeskakiwania spacji:

str.size.times.flat_map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } unless str[n] == ' ' }
0
iGian 2 kwiecień 2020, 13:23