Сайты с проблемами кодирования часто имеют уровни (например, CodeWars). В этом случае я бы посоветовал придерживаться более простых уровней немного дольше, пока вы не начнете свободно их решать.
Также проверьте решения, представленные другими: из этого можно многому научиться.
Я говорю это потому, что в вашем коде так много неправильных вещей, что кажется, что вы выиграете больше, если немного дольше охватите более простые уровни, чем просто захватите здесь решение и опубликуете его.
Некоторые комментарии к вашему коду:
- Вы инициализируете свой
newString
пробелом. Это неправильное начало. Это пространство не гарантировано, чтобы быть там. Вы должны брать только символы из ввода. Это должна быть пустая строка.
- Символ новой строки не
"/n"
, а "\n"
input.split()
преобразует строку в массив символов. Если ваша цель состояла в том, чтобы сделать возможным доступ к символам посредством индексации, то поймите, что вы можете сделать это и со строкой: input[i]
дает вам символ с этим смещением.
- Имена переменных важны. Наименование переменной
string
не очень полезно. Также не words
, когда на самом деле он содержит один символ. Так что character
будет лучшим выбором.
includes
ожидает строку в качестве аргумента, но вы передаете markers
. || "/n"
не имеет никакого дополнительного значения, потому что markers
является истинным значением, и поэтому ||
сразу же остановится (оценка короткого замыкания). И поскольку markers
является массивом, а не строкой, includes
преобразует это значение в строку через запятую. Очевидно, что эта строка очень редко встречается в вашем входе. Вам необходимо проверить каждый маркерный символ отдельно, а также проверить наличие символа новой строки.
- Тело вашего оператора
if
пусто (в вашей основной попытке). Это не может быть полезным. Возможно, вы искали continue;
, который пропустит оставшуюся часть цикла и продолжит следующую итерацию.
- Не предусмотрено пропускать символы, за которыми следует маркерный символ.
- У вас нет условий для устранения пробелов перед знаком маркера.
newString
- строка, поэтому нет необходимости вызывать newString.toString();
Пытаясь придерживаться своей идеи, ваш код исправлен:
function solution(input, markers) {
let newString = "";
for (let i = 0; i < input.length; i++) {
let character = input[i];
if (markers.includes(character)) {
// move i to just before the end of the current line
i = input.indexOf("\n", i)-1;
// Remove the white space that we already added at the end
newString = newString.trimRight();
// If no newline character at end of last line: break
if (i < 0) break;
// Skip rest of this iteration
continue;
}
newString += input[i];
}
return newString;
}
Но есть более простые способы сделать это. Например, сначала разбив ваш ввод на строки.
Вот решение, которое я выложил:
const solution = (input, markers) =>
input.split("\n").map(line =>
markers.reduce((line, marker) =>
line.split(marker, 1)[0].trimRight(), line)).join("\n");