WeIrD StRiNg CaSe codewars
Появилась проблема при решении данной задачи на codewars c#. Суть задачи заключается в принятии строки и возвращении той же строки со всеми четными индексированными символами в каждом слове в верхнем регистре и всеми нечетными в нижнем регистре. К примеру:
1)Input: "This"
Output:"ThIs"
2)Input: "This is a test"
Output: "ThIs Is A TeSt"
Код проходит все базовые тесты, но как только дело доходит до доп. тестов он резко начинает будто сходить с ума и поднимать всё, что попадётся на его пути , пример:
№1
Input: "Ecmkjc y fjbhxtfd yavhpb c i abh ftg"
Ожидается:"EcMkJc Y FjBhXtFd YaVhPb C I AbH FtG"
Вывод кода: "ECMKJC Y FjBHXTFD YaVhPB C I AbH FTG"
№2
Input: "Wauf qa lakuz z ooehf pg yb fds ydf rz qye"
Ожидается:"WaUf Qa LaKuZ Z OoEhF Pg Yb FdS YdF Rz QyE"
Ragemod моего кода:"WaUf Qa LaKUZ Z OOEHF Pg Yb FdS YdF RZ QYE"
Сам код(проверял даже на бумаге, честно говоря ошибки не нашёл):
using System;
public class Kata
{
public static string ToWeirdCase(string s)
{
char[] arr = s.ToCharArray();
for (int i = 0; i < s.Length; i += 2)
{
if (arr[i] != ' ')
{
arr[i] = char.ToUpper(arr[i]);
}
else
{
i -= 1;
}
}
return new string(arr); ;
}
}
Ответы (3 шт):
Спасибо всем за комментарии и советы, @tym32167 ваш способ рабочий(огромное спасибо), я опубликую собственное решение (до которого мне помогла додуматься 3-я чашка кофе), которое чуть больше будет понятно новичку, нежели тернарный оператор, да простят меня Стив Макконнелл "Совершенный код" и Боб Мартин "Чистый код"
public class Kata
{
public static string ToWeirdCase(string s)
{
char[] arr = s.ToCharArray();
for (int i = 0; i < s.Length; i += 2)
{
if (arr[i] != ' ')
{
if (s.Length - i == 1)
{
arr[i] = char.ToUpper(arr[i]);
}
else
{
arr[i] = char.ToUpper(arr[i]);
arr[i + 1] = char.ToLower(arr[i + 1]);
}
}
else
{
i -= 1;
}
}
return new string(arr); ;
}
}
Слишком много мудрите. Вот простой и понятный вариант
public static string ToWeirdCase(string s)
{
char[] arr = s.ToCharArray();
for (int i = 0; i < s.Length; i++)
{
if (i % 2 == 0)
arr[i] = char.ToUpper(arr[i]);
else
arr[i] = char.ToLower(arr[i]);
}
return new string(arr); ;
}
Если каждое слово начинать с большой буквы, можно изобразить алгоритм, где каждое слово обрабатывается отдельно, например
public static string ToWeirdCase(string s)
{
char[] arr = s.ToCharArray();
int index = 0;
while (index < arr.Length)
{
// пропускаем всё, что не буквы
while (index < arr.Length && !char.IsLetter(arr[index]))
index++;
// обработка слова
int counter = 0;
while (index < arr.Length && char.IsLetter(arr[index]))
{
if (counter % 2 == 0)
arr[index] = char.ToUpper(arr[index]);
else
arr[index] = char.ToLower(arr[index]);
index++;
counter++;
}
}
return new string(arr);
}
В копилку, моя версия с использованием StringBuilder.
public static string ToWeirdCase(string s)
{
StringBuilder sb = new StringBuilder();
bool state = true;
foreach (char c in s)
{
if (char.IsLetter(c))
{
sb.Append(state ? char.ToUpper(c) : char.ToLower(c));
state = !state;
}
else
{
sb.Append(c);
state = true;
}
}
return sb.ToString();
}