提问人:Beca_1923 提问时间:8/7/2023 更新时间:8/9/2023 访问量:45
需要有人帮我理解这两个解决方案 - map、reduce、match、regex
Need someone to help me understand these two solutions - map, reduce, match, regex
问:
描述: 我今天一直在玩 Codingames,并在代码冲突中遇到了这个问题。
问题: 给定一个单词,根据它在 ABC 中的位置输出该单词索引的总和。
例: word = “嗨” 结果 = 15
解释: H = 7 和 I = 8,总和是 15。这是因为 H 和 I 位于 alpahabet 的第 7 和第 8 个索引处,如果我们确定 A = 0;
我的解决方案:我让它使用嵌套循环,但效率不是很高。 其他解决方案1:
print(readline().split("").reduce((a,b)=>b.match(/[A-Z]/)?a+b.charCodeAt(0)-65:a,0))
其他解决方案2:
s=0
readline().split``.map(e=>/[A-Z]/.test(e)?s+=e.charCodeAt(0)-'A'.charCodeAt(0):0)
print(s)
有人可以向我解释这些代码吗?我尝试过人工智能,但我没有掌握它的窍门。我也欢迎网站等的建议,帮助我更好地理解这些代码。
谢谢!
答:
2赞
mplungjan
8/7/2023
#1
使用普通的拆分、约简和匹配加上三元:
const res = "HeLLo"
.split("")
.reduce((a,b)=>
b.match(/[A-Z]/)? // does the current letter match an uppercase?
a+b.charCodeAt(0)-65 // return accumulator plus current letter value minus A's letter value of 65
:a // otherwise return the accumulator
,0) // start with an accumulator of 0
console.log(res);
使用标记模板拆分、地图(此处不需要地图)和三元
s=0;
"HeLLo"
.split`` // split on anything
.map(e=>/[A-Z]/.test(e)? // if from A-Z
s+=e.charCodeAt(0)-'A'.charCodeAt(0) // add each charcode minus the charCode for A
:0 // otherwise 0
)
console.log(s);
当您需要 forEach 和三元时,不要使用映射,如上所述:
s=0;
const res = "HeLLo"
.split`` // split on anything
.forEach(e=> s+= /[A-Z]/.test(e) ? e.charCodeAt(0)-65 : 0)
console.log(s);
评论
['H', 'I']