Я решал задачу Coderbyte Challenge - вопросы. Когда я запускаю свой код в браузере, все работает отлично, однако, как только я запускаю его на веб-сайте coderbyte, он выдает сообщение об ошибке.
Задача:
Попросите функцию QuestionMarks (str) взять параметр str string, который будет содержать однозначные числа, буквы и вопросительные знаки, и проверьте, есть ли ровно 3 вопросительных знака между каждой парой из двух чисел, которые составляют до 10. Если это так, то ваша программа должна вернуть строку true, иначе она должна вернуть строку false. Если в строке нет двух чисел, которые содержат до 10, тогда ваша программа также должна вернуть значение false.
Например: если str является "arrb6??? 4xxbl5??? eee5", то ваша программа должна вернуть true, потому что между 6 и 4 есть ровно 3 вопросительных знака и 3 вопросительных знака между 5 и 5 в конце строки.
Используйте функцию тестирования параметров в поле ниже, чтобы проверить свой код с разными аргументами.
Испытательные случаи:
"arrb6??? 4xxbl5??? eee5" true
"aa6? 9" false
"acc? 7?? sss? 3rr1?????? 5" true
Моим решением было использовать RegExp для решения проблемы. код ниже хорошо работает, когда я запускаю его в браузере, однако консоль Coderbyte выдает ошибку каждый раз:
/tmp/009904362/main.js:11 clean = clean.match(/d (???) d/gi); ^ СинтаксисError: Недопустимое регулярное выражение: /d (???) d/
Вот мой код -
function QuestionsMarks(str) {
//create a "clean" array containing only the numbers and question marks from str
var result;
let clean = str.match(/[0-9?]/g);
// join() the array back in to the string
clean = clean.join("");
// use match() to return an array of pairs that match the pattern d???d
clean = clean.match(/d(\?\?\?)d/gi);
//create a function sumCheck() that converts first and last char of every array string to Number and checks if the sum of digits is 10
//using forEach() run the sumcheck() on all strings in the array
clean.forEach(sumCheck);
function sumCheck(string){
if((Number(string.charAt(0)) + Number(string.charAt(string.length - 1))) == 10){
result = true;
}else{
result = false;
}
}
return result;
}
QuestionsMarks("acc?7??sss?3rr1??????5");
Проблема, похоже, исходит от Coderbyte, которая не может анализировать правильно экранированные символы в шаблонах регулярных выражений (литералы или конструктор RegExp). Поэтому самым простым решением является замена экранированных последовательностей: \d
=> [0-9]
и \?
=> [?]
(как было предложено @Saud в комментариях).
О вашем подходе:
... проверьте, есть ли ровно 3 вопросительных знака между каждой парой из двух чисел, которые составляют до 10...
Каков ваш исправленный шаблон /[0-9][?]{3}[0-9]/g
?
Он ищет цифры, разделенные тремя вопросительными знаками (и затем вы проверяете, равна ли сумма двух цифр 10). Даже если этот шаблон сможет найти все пары цифр, разделенных тремя вопросительными знаками в строке (это не так (*)), он не проверяет, есть ли цифры, которые составляют до 10, и что aren Разделяются ровно 3 вопросительными знаками!
Таким образом, цель состоит в том, чтобы найти, содержит ли строка две цифры, которые составляют до 10 без трех вопросительных знаков. Если эта пара существует, функция возвращает false
.
(*): Почему /[0-9][?]{3}[0-9]/g
не может найти все пары цифр, разделенных тремя вопросительными знаками?
Пример с: 1 × 2 × 3 × 4
Потому что вы не можете сопоставить один и тот же символ дважды. Шаблон найдет: 1???2
и 3???4
но не 2???3
так как 2
уже потребляется первым совпадением.
Возможный способ сделать это:
function QuestionsMarks(str) {
var state = { d1: 0, d2: 0, marks: 0,
init: function() { this.d1 = this.d2; this.marks = 0; },
check: function() { return this.d1 + this.d2 > 9 && this.marks != 3; }
};
var re = /[0-9?]/g;
var m;
while ( (m = re.exec(str)) !== null ) {
if ( m[0] == '?' ) {
state.marks++;
} else {
state.d2 = parseInt(m[0]);
if ( state.check() ) return false;
state.init();
}
}
return true;
}
\d
не простоd
. Попробуйтеnew RegExp("\\d(\\?\\?\\?)\\d")
/\d([?][?][?])\d/
, посмотрите, работает ли это (это уродливый хак).