请求解析两段JavaScript代码:map、reduce、正则实现字母索引求和
问题解析与代码说明
题目回顾
给定一个单词,计算单词中每个大写字母在以A=0为起始的字母表中的索引之和。例如输入"HI",H对应7、I对应8,求和结果为15。
代码1解析
print(readline().split("").reduce((a,b)=>b.match(/[A-Z]/)?a+b.charCodeAt(0)-65:a,0))
逐部分拆解:
readline():Codingame平台提供的读取输入字符串的函数,获取用户输入的单词。split(""):将输入字符串拆分为单个字符组成的数组,比如"HI"会变成["H", "I"]。reduce((a,b)=>..., 0):数组的归并方法,用于累加计算。其中:0是累加器的初始值;a是累加器,保存当前的累加结果;b是当前遍历到的数组元素(单个字符);
b.match(/[A-Z]/):判断当前字符是否为大写字母,match方法匹配成功返回匹配结果,否则返回null,在逻辑判断中等同于布尔值true/false;a+b.charCodeAt(0)-65:如果是大写字母,计算其索引并累加到累加器。charCodeAt(0)返回字符的ASCII码,大写字母'A'的ASCII码是65,因此减去65后得到以A=0的索引(比如'H'的ASCII码是72,72-65=7);a:如果不是大写字母,直接返回当前累加值,不做修改;print(...):输出最终的累加结果。
代码2解析
s=0 readline().split``.map(e=>/[A-Z]/.test(e)?s+=e.charCodeAt(0)-'A'.charCodeAt(0):0) print(s)
逐部分拆解:
s=0:初始化累加变量,用于存储最终的索引和;readline().split``:和split("")`效果完全一致,将输入字符串拆分为单个字符数组,这里使用模板字符串的写法是更简洁的语法;map(e=>...):遍历数组中的每个字符e,此处利用map的遍历特性执行累加操作(虽然map本意是转换数组,但此处仅用其遍历功能);/[A-Z]/.test(e):判断当前字符是否为大写字母,test方法直接返回布尔值true/false,比match更高效;s+=e.charCodeAt(0)-'A'.charCodeAt(0):如果是大写字母,计算索引并累加。这里用'A'.charCodeAt(0)代替硬编码的65,代码可读性更强,避免记忆ASCII码值;0:如果不是大写字母,返回0(此返回值无实际作用,仅满足map的语法要求);print(s):输出最终累加的索引和。
学习资源建议
- MDN Web Docs:涵盖JavaScript所有内置API的详细说明、示例代码和使用场景,是查询
split、reduce、map等方法的权威资料; - JavaScript.info:从基础语法到进阶概念的系统性教程,对函数式编程、数组方法等知识点讲解清晰,适合理解这类简洁代码的设计思路;
- Codingame官方社区:有大量Clash of Code的题解讨论和技巧分享,能学习到更多适合竞赛场景的高效、简洁写法。
内容的提问来源于stack exchange,提问作者Beca_1923
相关产品推荐
相关产品推荐

