Я наткнулся на странную вещь, работающую над проблемой Codewars. Вот инструкции:
Напишите функцию toWeirdCase (weirdCase в Ruby), которая принимает строку и возвращает ту же строку со всеми четными индексными символами в каждом слове в верхнем регистре и всеми нечетными индексными символами в каждом слове в нижнем регистре. Только что объясненная индексация основана на нуле, поэтому нулевой индекс четный, поэтому этот символ должен быть в верхнем регистре.
Передаваемая строка будет состоять только из букв алфавита и пробелов (' '). Пробелы будут присутствовать только в том случае, если слов несколько. Слова будут разделены одним пробелом (' '). Примеры:
weirdcase( "String" )#=> returns "StRiNg"
weirdcase( "Weird string case" );#=> returns "WeIrD StRiNg CaSe"
Вот мой код:
def weirdcase string
@case = []
# Ternary:
string.each_char { |c|
# string.index(c).even? ? @case.push(c.upcase) : @case.push(c.downcase)
c =~ /[[:alpha:]]/ ? (string.index(c).even? ? (@case.push(c.upcase)) : (@case.push(c.downcase))) : (string.index(c) + 1)
}
# If/Then:
# string.each_char { |c|
#if string.index(c).even? && c != " "
# if c =~ /[[:alpha:]]/ && string.index(c).even?
# then @case.push(c.upcase)
# else @case.push(c.downcase)
# end }
@case.join
end
p "TEST"
p weirdcase "this is a test"
p weirdcase "thisisatest"
p weirdcase " th is is a t es t"
Результаты, достижения:
"TEST"
"ThIsIsATesT"
"ThIsIsATEsT"
"tHIsIsAtest"
weirdcase
should return the correct value for multiple words
Expected: "ThIs Is A TeSt", instead got: "ThIsIsATesT"
0 Passed
1 Failed
0 Errors
Process took 171ms to complete
А вот и тесты:
describe 'weirdcase' do
#it 'should return the correct value for a single word' do
# Test.assert_equals(weirdcase('This'), 'ThIs');
# Test.assert_equals(weirdcase('is'), 'Is');
#end
it 'should return the correct value for multiple words' do
Test.assert_equals(weirdcase('This is a test'), 'ThIs Is A TeSt');
end
end
Я пытался написать этот код несколькими разными способами, но все время получаю один и тот же результат: вместо результата «Это тест» я получаю «ThIsIsATesT» или какой-то другой вариант, в котором переменная заглавная буква, кажется, терпит неудачу один раз. он доходит до слова "тест", что для меня не имеет смысла - кажется, это противоречит тому, что должны делать методы. Я также попробовал это в irb и увидел тот же результат, так что я не думаю, что это ошибка Codewars.
Я все еще относительно новичок в Ruby. Может ли кто-нибудь помочь мне найти то, что я должен упускать из виду, и/или объяснить, как этот код пришел к такому результату?
Обновлять:
Всем спасибо за дельные советы. Я изменил заголовок на что-то более описательное и переписал этот код с нуля, чтобы проиндексировать каждое слово отдельно, вместо того, чтобы рассматривать его как одну длинную строку. У меня все еще есть некоторые проблемы с этим, хотя. Вот мой новый код:
def weirdcase string
char = Array.new
puts "string: #{string}"
string.split(' ').each do |word|
word.each_char.with_index do |c, index|
if index.even?
char.push(c.upcase)
else
char.push(c.downcase)
end
end
end
puts "char: #{char}"
puts "char.join(''): #{char.join('')}"
puts "char.join('space'): #{char.join(' ')}"
end
И вот результаты:
weirdcase
should return the correct value for multiple words
string: This is a test
char: ["T", "h", "I", "s", "I", "s", "A", "T", "e", "S", "t"]
char.join(''): ThIsIsATeSt
char.join('space'): T h I s I s A T e S t
Expected: "ThIs Is A TeSt", instead got: nil
Итак, проблема, с которой я столкнулся сейчас, заключается в том, как правильно объединить слова с пробелами между ними вместо того, что вы видите выше. Я ищу способы правильного доступа к записям массива после их первоначального разделения. Но, конечно, я буду рад любым советам, которые могут быть у кого-нибудь :)