需要有人帮我理解这两个解决方案 - map、reduce、match、regex

Need someone to help me understand these two solutions - map, reduce, match, regex

提问人:Beca_1923 提问时间:8/7/2023 更新时间:8/9/2023 访问量:45

问:

描述: 我今天一直在玩 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)

有人可以向我解释这些代码吗?我尝试过人工智能,但我没有掌握它的窍门。我也欢迎网站等的建议,帮助我更好地理解这些代码。

谢谢!

javascript 匹配 array-map array-reduce

评论

0赞 Brewal 8/7/2023
你不明白的哪一部分?
0赞 Beca_1923 8/7/2023
我对这段代码的理解:它读取测试用例的输入,让我们说“HI”。然后,split 方法创建一个输入数组,因此它是 array = [“HI”]。然后 reduce 方法接受一个值和一个累加器 (?),如果 b 值与来自 A-Z 的字母匹配,则定义为正则表达式,它对 a+b 执行某些操作。我真的不明白这个 a+b 部分,包括那个 -65 是什么??
1赞 Jared Smith 8/7/2023
理解这一点的最简单方法是将所有这些链接调用转换为变量的赋值以保存中间值,然后 console.logging 中间变量以查看它们是什么......但根据您的评论,拆分为您提供 -65 与字符在 ASCII 表中的位置相关,以便您可以获得按字母顺序排列的索引。请记住,所有英文字符都映射到无符号的 8 位整数。['H', 'I']

答:

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);