Menghasilkan alfabet dalam JavaScript


21

Saya cukup yakin tidak ada cara yang lebih baik untuk melakukan ini tetapi saya pikir tidak ada salahnya untuk bertanya.

Saya lelah mengetik a='abcdefghijklmnopqrstuvwxyz' .

Bahasa keren miliki Range('a'..'z') atau serupa

Apa yang bisa kita dapatkan dengan JS yang sesingkat mungkin ??

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

lebih panjang dari sekedar alfabet - tetapi menjamin saya tidak mengacau di suatu tempat.

Saya berharap ada cara yang agak licik untuk menghasilkan az dalam kurang dari 50 karakter.

Saya mengacau i=97;Array(26).map(x=>String.fromChar....i++

tapi itu selalu jauh lebih lama pada saat saya bergabung kemudian membagi array (26) agar bisa digunakan


Sunting: Saya sudah turun ke

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

60 byte


11
@muddyfish, LuisMendo: Ini sesuai topik per meta.
Gagang Pintu

1
[...Array(26)].map((q,w)=>String.fromCharCode(w+97))adalah 52 byte dan tambahkan 7 lagi untuk.join``
andlrc


@ dev-null a = ''; i = 97; [... Array (26)]. map (b => a + = String.fromCharCode (i ++)) adalah 60 tetapi berhati-hati dengan bergabung bagaimana Anda bergabung dalam 7 tanpa mendapat koma dalam hasil?
Charlie Wynn

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

Jawaban:


12

Alternatif untuk String.fromCharCode

... jika Anda senang dengan huruf kecil saja.

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
Oh, sial, itu pintar. Jadi itu dimulai dengan 10, mengonversi ke basis 36 dan mencetaknya? jadi az!
Charlie Wynn

Apakah itu argumen a = '' dan i = 9 dari panggilan fungsi peta? Memeriksa Array.prototype.map () di mdn dan tidak terlihat seperti peta mendukung argumen semacam itu ..
Jay Somedon

@JaySomedon itu adalah argumen untuk panggilan fungsi peta, sedikit banyak, fungsi Javascript tidak peduli dan membuang parameter yang tidak mereka harapkan. Jadi saya menginisialisasi variabel yang saya butuhkan, sambil menambahkan parameter yang tidak berguna untuk fungsi yang disebut
edc65

@JaySomedon lihat juga jawaban ini dan komentar terkait codegolf.stackexchange.com/a/2684/21348
edc65

@ edc65 aha saya mengerti! Itu rapi! Jadi di sini, ketika javascript mengevaluasi argumen seperti i = 9 di map (), itu sebenarnya membuat variabel global yang kemudian saya tetapkan 9 untuk itu?
Jay Somedon

11

Catatan: Semua teknik ini menetapkan string alfabet ke variabel a.


Saya yakin 99% bahwa cara terpendek untuk mencapai ini dalam JavaScript adalah:

a="abcdefghijklmnopqrstuvwxyz" // 30 bytes

Tetapi ada beberapa metode menarik lainnya. Anda dapat menggunakan kompresi string:

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

Anda bisa mendapatkan string terkompresi dari atob`abcdefghijklmnopqrstuvwx`. The 'yz'harus ditambahkan secara manual karena jika Anda kompres seluruh string, sedangkan hasilnya adalah hanya 27 byte, itu akan berubah sebagai abcdefghijklmnopqrstuvwxyw==.

Saya percaya cara terpendek untuk melakukannya secara terprogram juga metode yang Anda sarankan:

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

Anda dapat melakukannya dengan fitur ES6 ( string template`` , spread operator... ) jika Anda ingin:

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

Anda bisa melakukan yang lebih baik dengan variabel alih-alih .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='')

Atau ES7 dengan pemahaman array , yang merupakan byte lain yang lebih pendek:

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

Membuat variabel sebelumnya menyimpan byte lain:

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

Juga, String.fromCharCodemenerima beberapa argumen dan secara otomatis akan bergabung dengannya. Jadi kita bisa melakukan golf setiap versi ES6 hingga 57 byte:

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

Dan ES7 satu ke 55:

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

Jika Anda ingin mempelajari lebih lanjut tentang rentang golf, lihat serangkaian kiat ini . Ada juga satu tentang pemahaman array ES7 .

EDIT: Seperti yang ditunjukkan oleh edc65, sebagian besar ini menjadi lebih pendek i.toString(36)daripada menggunakan 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

Saya percaya ini adalah yang sesingkat mungkin yang dapat disebut sebagai nilai fungsi pengembalian:

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

Ini tiga byte lebih pendek daripada secara manual mengembalikannya dari suatu fungsi:

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

Tentu saja, x=>"abcdefghijklmnopqrstuvwxyz"masih mengalahkan yang lainnya.


Saya sangat suka di mana ini akan pergi - hanya berharap saya bisa ES7 di chrome :(
Charlie Wynn

2
@CharlieWynn Ya, sayang sekali tidak semua browser mendukung semua fitur terbaru. Tetapi bagaimanapun juga, Chrome tidak dibangun dalam sehari ...;)
ETHproduksi

Sebagian besar solusi ini dapat disingkat menggunakan .toString bukan String, .fromCharCode. Lihat jawaban saya
edc65

1
@CharlieWynn Saya pikir Chrome Beta sekarang mendukung semua ES7 dan semua ES6 kecuali modul dan optimisasi panggilan ekor.
gcampbell

Berikut adalah 42-byter yang dapat disebut sebagai nilai fungsi kembali: (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
Rick Hitchcock

7

Berikut pendekatan lain, ekspresi ES6 51 byte:

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

50 byte dalam huruf besar tentu saja.


Untuk huruf besar: String.fromCharCode (... Array (91) .keys ()) slice (65)
jpoppe

1

36 byte, menggunakan trik yang baru saya pelajari (dari posting ini: /codegolf//a/176496/64538 ):

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

window.name adalah string kosong secara default.

Tentu saja, ini bahkan kurang praktis daripada solusi 38-byte karena menggunakan nama variabel yang lebih panjang.


1

Menggunakan apa yang mungkin atau tidak dapat didefinisikan pada lingkup global

39 byte untuk properti objek ke pencocokan array a-z

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

48 byte untuk yang tidak disortir Set

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

55 byte untuk diurutkan Set

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

67 byte untuk string yang diurutkan

a=[...new Set(`${Object.keys(top)}`.match(/[a-z]/g).sort())].join``
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.