我正在解决Coderbyte Challenge - Questions Marks 当我在浏览器中运行代码时,一切正常,但是,一旦在coderbyte网站上运行它,则会引发错误。
挑战是:
让功能QuestionsMarks(str)接受str字符串参数, 其中将包含一个数字,字母和问号, 并检查每对之间是否有3个问号 两个数字加起来等于10。如果是,则您的程序应返回 字符串true,否则应返回字符串false。如果有 不是任何两个数字加起来等于10的字符串,那么您的 程序也应返回false。
例如:如果str为“ arrb6 ??? 4xxbl5 ??? eee5”,则您的程序 应该返回true,因为之间有3个问号 6和4,在末尾5和5之间有3个问号 串。
使用下面框中的参数测试功能来测试您的代码 有不同的论点。
测试用例为:
“ arrb6 ??? 4xxbl5 ??? eee5” 是
“ aa6?9” 否
“ acc?7 ?? sss?3rr1 ?????? 5” 是
对此,我的解决方案是使用RegExp解决挑战。在浏览器中运行以下代码时,效果很好,但是Coderbyte控制台每次都会引发错误:
/tmp/009904362/main.js:11 clean = clean.match(/ d(???)d / gi); ^ SyntaxError:无效的正则表达式:/ 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");
答案 0 :(得分:2)
问题似乎来自Coderbyte,它无法解析正则表达式模式(文字或RegExp构造函数)中正确转义的字符。因此,最简单的解决方案是替换转义的序列:\d
=> [0-9]
和\?
=> [?]
(@ Saud在评论中建议)。
关于您的方法:
...检查每对的两个数字之间是否恰好有3个问号,它们加起来等于10 ...
更正后的模式/[0-9][?]{3}[0-9]/g
是什么?
它查找由三个问号分隔的数字(然后检查两个数字的总和是否为10)。即使此模式能够找到字符串中由三个问号分隔的所有数字对(不是这种情况,(*)),它也不会检查是否有数字加起来最多10个,而且不能完全由3个问号隔开!
因此,目标是查找字符串是否包含一对数字,这些数字加起来最多为10,没有 3个问号。如果存在该对,则函数返回false
。
(*):为什么/[0-9][?]{3}[0-9]/g
找不到由3个问号分隔的所有数字对?
示例: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;
}