我看了一眼谜题输入,感到非常害怕。
然后我读了第 1 部分我必须做的事情并暂时放松了:
我可以使用简单的正则表达式来做到这一点!
我必须记住转义括号,然后我得到了这个有效的正则表达式:
/mul\((\d*),(\d*)\)/g
现在我需要对每场比赛进行适当的提取和数学计算
这是完整的工作代码:
let total = [...input.matchAll(/mul\((\d*),(\d*)\)/g)].reduce( (total, match) => { total += match .slice(1, 3) .map(Number) .reduce((a, b) => a * b); return total; }, 0 );
它为示例输入生成正确的答案。
尝试我的拼图输入会生成...
正确答案!!!
深呼吸............
............第 2 部分
我认为由于输入充满了不同的单词,因此它将添加各种新规则来解释。
幸运的是,只有两个新单词充当有效 mul 语句的开始和结束。
现在感觉就像是通过索引每个 do() 和 dont() 并搜索要解析的 mul 语句的正确部分来隔离每个有效语句的练习。
我想使用正则表达式来匹配所有出现的 do() 和 don():
/don't\(\)|do\(\)/g
这样,我应该沿着输入字符串的路径有交替的检查点。
如果是这样,我可以提取 do() 和 dont() 检查点之间的子字符串,并检查 muls。
让我确认示例和完整输入。
这是我隔离标志及其索引的算法:
let flags = [...input.matchAll(/don't\(\)|do\(\)/g)].map((el) => { return [el[0], el.index]; });
确认:
这变得有点复杂了。
自从事情开始启用以来,我必须从索引 0 开始抓取,直到第一个 don()。所以,我需要找到它的索引。并检查该子字符串。
从那时起,我可以跳过所有后续的 don(),并寻找下一个 do()。
以此作为我的新起始索引,我需要找到下一个 don()。那是我的新终点。检查该子字符串。
然后重复:查找下一个 do(),查找下一个 don(),检查子字符串。
这感觉就像一个 while 循环。
当我编写算法时我会知道更多。
很多条件来处理缺乏模式的“做-不该做”的发生顺序:
/mul\((\d*),(\d*)\)/g
令我惊喜的是,它为示例输入生成了正确的答案。
处理我的拼图输入后会生成什么?
...
正确答案!!!
在检查之前,我添加了一个控制台日志记录语句来确认要检查的子字符串的每个开始和结束索引。
我将它们与数组中标志的顺序进行了比较。
一切看起来都不错,所以我提交了。
并得到了正确答案!
多么令人愉快和有益的感觉!
又是一个早起的一天。又一颗来之不易的两颗金星。
进入第四天!
以上是仔细考虑一下的详细内容。更多信息请关注PHP中文网其他相关文章!