在JavaScript中生成字母


21

我敢肯定,没有更好的方法可以做到这一点,但认为提出这一要求不会有任何伤害。

我厌倦了打字a='abcdefghijklmnopqrstuvwxyz'

很酷的语言有Range('a'..'z')或类似

尽可能简短的JS能为我们带来什么?

for(i=97,a='';i<123;){a+=String.fromCharCode(i++)}

比字母还长-但可以保证我不会在某个地方搞砸。

我希望有一种讨厌的位移方法可以生成少于50个字符的az。

我搞砸了 i=97;Array(26).map(x=>String.fromChar....i++

但是到我加入时总是更长一些,然后将array(26)拆分为可用


编辑:我已经把它归结为

[...Array(26)].reduce(a=>a+String.fromCharCode(i++),'',i=97)

60字节


11
@ muddyfish,LuisMendo:这是每个meta 的主题
门把手

1
[...Array(26)].map((q,w)=>String.fromCharCode(w+97))是52个字节,并为.join``
-andlrc


@ dev-null a =''; i = 97; [... Array(26)]。map(b => a + = String.fromCharCode(i ++))是60但照顾了联接您如何进行联接7中没有得到逗号的结果?
查理·永利

1
@CharlieWynn[...Array(26)].map((q,w)=>String.fromCharCode(w+97)).join``
andlrc

Answers:


12

替代String.fromCharCode

...如果您对仅小写字母感到满意。

for(i=9,a='';++i<36;)a+=i.toString(36) // 38, cannot be used in an expression
[...Array(26)].map(_=>(++i).toString(36),i=9).join`` // 52 directly returnig the string desired
[...Array(26)].map(_=>a+=(++i).toString(36),a='',i=9) // 53 assign to a variable
(i=9,[for(_ of Array(26))(++i).toString(36)].join``) // 52 ES7 direct return
i=9,a='',[for(_ of Array(26))a+=(++i).toString(36)] // 51 ES7 assign to a variable

1
哦,那很聪明。因此,它从10开始,转换为以36为底并进行打印吗?真是的!
查理·永利

映射函数的那些a =''和i = 9参数是否被调用?在MDN经过Array.prototype.map(),它看起来并不像地图支持这样的论点..
杰伊Somedon

@JaySomedon这些是映射函数调用的参数,在某种程度上,Javascript函数通常不在乎并丢弃它们不需要的参数。所以我初始化了一个我需要的变量,同时添加了一个对调用的函数没有用的参数
edc65

@JaySomedon另请参阅此答案和相关评论codegolf.stackexchange.com/a/2684/21348
edc65

@ edc65啊哈,我明白了!那很整齐!因此,在这里,当javascript在map()中计算i = 9之类的参数时,它实际上创建了一个全局变量,然后我为其分配了9?
Jay Somedon

11

注意:所有这些技术都将字母字符串分配给variable a


我有99%的肯定是用JavaScript实现这一目标的最短方法是:

a="abcdefghijklmnopqrstuvwxyz" // 30 bytes

但是还有其他几种有趣的方法。您可以使用字符串压缩:

a=btoa`i·?yø!?9%?z)ª»-ºü1`+'yz' // 31 bytes; each ? represents an unprintable

您可以从获得压缩的字符串atob`abcdefghijklmnopqrstuvwx`。在'yz'必须手动添加,因为如果你在压缩整个字符串,而结果只有27个字节,它会变成为abcdefghijklmnopqrstuvwxyw==

我相信以编程方式完成此任务的最短方法也是您建议的方法:

for(i=97,a='';i<123;)a+=String.fromCharCode(i++) // 48 bytes

如果需要,可以使用ES6功能(模板字符串``散布运算符...)来实现:

a=[...Array(26)].map(_=>String.fromCharCode(i++),i=97).join`` // 61 bytes
a=[...Array(26)].map((_,i)=>String.fromCharCode(i+97)).join`` // also 61 bytes
a=[...Array(i=26)].map(_=>String.fromCharCode(++i+70)).join`` // again, 61 bytes

您可以使用变量来代替.join``

[...Array(26)].map(_=>a+=String.fromCharCode(i++),i=97,a='') // all 60 bytes
[...Array(26)].map((_,i)=>a+=String.fromCharCode(i+97),a='')
[...Array(i=26)].map(_=>a+=String.fromCharCode(++i+70),a='')

或具有数组推导功能的ES7,它又短了一个字节:

a=[for(_ of Array(i=26))String.fromCharCode(++i+70)].join`` // 59 bytes

预先创建变量会保存另一个字节:

a='',[for(_ of Array(i=26))a+=String.fromCharCode(++i+70)] // 58 bytes

另外,String.fromCharCode接受多个参数并将自动加入它们。因此,我们可以将每个ES6版本压缩到57个字节:

a=String.fromCharCode(...[...Array(26)].map(_=>i++,i=97)) // all 57 bytes
a=String.fromCharCode(...[...Array(26)].map((_,i)=>i+97))
a=String.fromCharCode(...[...Array(i=26)].map(_=>++i+70))

而ES7降到55:

a=String.fromCharCode(...[for(_ of Array(i=26))++i+70]) // 55 bytes

如果您想了解有关高尔夫球场的更多信息,请查看此技巧。关于ES7的数组理解也有一个。

编辑:正如edc65所指出的,大多数使用i.toString(36)而不是来变得更短String.fromCharCode(i)

for(i=9,a='';++i<36;)a+=i.toString(36) // 38 bytes
a=[...Array(26)].map(_=>(++i).toString(36),i=9).join`` // 54 bytes
[...Array(26)].map(_=>a+=(++i).toString(36),i=9,a='') // 53 bytes
i=9,a=[for(_ of Array(26))(++i).toString(36)].join`` // 52 bytes
i=9,a='',[for(_ of Array(26))a+=(++i).toString(36)] // 51 bytes

我相信这是最短的,可以称为函数返回值:

eval("for(i=9,a='';++i<36;)a+=i.toString(36)") // 46 bytes

它比从函数手动返回短三个字节:

x=>eval("for(i=9,a='';++i<36;)a+=i.toString(36)") // 49 bytes
x=>{for(i=9,a='';++i<36;)a+=i.toString(36);return a} // 52 bytes

当然,x=>"abcdefghijklmnopqrstuvwxyz"仍然胜过其他一切。


我真的很喜欢它的去向-只是希望我能在Chrome中使用ES7 :(
Charlie Wynn

2
@CharlieWynn是的,并不是所有的浏览器都支持所有最新功能,这是一个遗憾。但是毕竟,Chrome并不是一天建成的……;)
ETHproductions's

使用.toString而不是String,.fromCharCode可以缩短大多数解决方案。见我的答案
edc65 '16

1
@CharlieWynn我认为Chrome Beta现在支持ES7和ES6的所有组件,除了模块和尾部呼叫优化。
gcampbell 2013年

这是一个42个字节的函数,可以称为函数返回值: (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
Rick Hitchcock

7

这是另一种方法,一个51字节的ES6表达式:

String.fromCharCode(...Array(123).keys()).slice(97)

当然,大写为50个字节。


对于大写字母:String.fromCharCode(... Array(91).keys())。slice(65)
jpoppe

1

36字节,使用我刚刚学到的技巧(从这篇文章:https : //codegolf.stackexchange.com/a/176496/64538):

for(i=9;++i<36;)name+=i.toString(36)

window.name 默认情况下为空字符串。

当然,这比38字节的解决方案更不实用,因为它使用了更长的变量名。


1

使用可能会或可能不会在全局范围内定义的内容

39个字节,用于对象属性与数组匹配 a-z

a=`${Object.keys(top)}`.match(/[a-z]/g)

48字节(未排序) Set

a=new Set(`${Object.keys(top)}`.match(/[a-z]/g))

55个字节用于排序 Set

a=new Set(`${Object.keys(top)}`.match(/[a-z]/g).sort())

排序字符串为67个字节

a=[...new Set(`${Object.keys(top)}`.match(/[a-z]/g).sort())].join``
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.