Tạo bảng chữ cái trong JavaScript


21

Tôi khá chắc chắn rằng không có cách nào tốt hơn để làm điều này nhưng hình dung nó không thể bị tổn thương khi hỏi.

Tôi mệt mỏi vì phải gõ ra a='abcdefghijklmnopqrstuvwxyz'.

Ngôn ngữ tuyệt vời có Range('a'..'z')hoặc tương tự

Chúng ta có thể nghĩ gì với JS càng ngắn càng tốt ??

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

dài hơn chỉ là bảng chữ cái - nhưng đảm bảo tôi không làm hỏng việc ở đâu đó.

Tôi hy vọng có một cách khó chịu để tạo ra az trong ít hơn 50 ký tự.

Tôi loay hoay với i=97;Array(26).map(x=>String.fromChar....i++

nhưng nó luôn luôn dài hơn khi tôi tham gia rồi chia mảng (26) để có thể sử dụng được


Chỉnh sửa: Tôi đã nhận được nó xuống

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

60 byte


11
@muddyfish, LuisMendo: Đây là chủ đề trên mỗi meta.
tay nắm cửa

1
[...Array(26)].map((q,w)=>String.fromCharCode(w+97))là 52 byte và thêm 7 byte khác cho.join``
andlrc


@ dev-null a = ''; i = 97; [... Array (26)]. map (b => a + = String.fromCharCode (i ++)) là 60 nhưng hãy quan tâm đến việc bạn tham gia như thế nào trong 7 mà không nhận được dấu phẩy trong kết quả?
Charlie Wynn

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

Câu trả lời:


12

Thay thế cho String.fromCharCode

... Nếu bạn hài lòng với một bảng chữ cái chỉ chữ thường.

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 dang, đó là thông minh. Vì vậy, nó bắt đầu với 10, chuyển đổi sang cơ sở 36 và in nó? vậy az
Charlie Wynn

Là các đối số a = '' và i = 9 của hàm gọi bản đồ? Đã kiểm tra Array.prototype.map () trên mdn và có vẻ như bản đồ không hỗ trợ các đối số như vậy ..
Jay Somedon

@JaySomedon là những đối số cho lệnh gọi hàm bản đồ, theo một cách nào đó, các hàm Javascript về mặt thời gian không quan tâm và loại bỏ các tham số mà chúng không mong đợi. Vì vậy, tôi khởi tạo một biến tôi cần, trong khi thêm một tham số không sử dụng cho hàm được gọi
edc65

@JaySomedon cũng xem câu trả lời này và các bình luận liên quan codegolf.stackexchange.com/a/2684/21348
edc65

@ edc65 aha tôi thấy! Thật gọn gàng! Vậy ở đây, khi javascript đánh giá các đối số như i = 9 trong map (), nó thực sự tạo ra một biến toàn cục i sau đó gán 9 cho điều đó?
Jay Somedon

11

Lưu ý: Tất cả các kỹ thuật này gán chuỗi bảng chữ cái cho biến a.


Tôi chắc chắn 99% rằng cách ngắn nhất để đạt được điều này trong JavaScript thực sự là:

a="abcdefghijklmnopqrstuvwxyz" // 30 bytes

Nhưng có một số phương pháp thú vị khác. Bạn có thể sử dụng nén chuỗi:

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

Bạn có thể lấy chuỗi nén từ atob`abcdefghijklmnopqrstuvwx`. Các 'yz'phải được bổ sung bằng tay bởi vì nếu bạn nén toàn bộ chuỗi, trong khi kết quả là chỉ có 27 byte, nó sẽ bật ra như abcdefghijklmnopqrstuvwxyw==.

Tôi tin rằng cách ngắn nhất để thực hiện theo chương trình cũng là phương pháp bạn đề xuất:

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

Bạn có thể làm điều đó với các tính năng ES6 ( chuỗi mẫu`` , toán tử trải... ) nếu bạn muốn:

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

Bạn có thể làm tốt hơn với một biến thay vì .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='')

Hoặc ES7 với khả năng hiểu mảng , ngắn hơn một byte:

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

Tạo biến trước đó tiết kiệm một byte khác:

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

Ngoài ra, String.fromCharCodechấp nhận nhiều đối số và sẽ tự động tham gia chúng. Vì vậy, chúng ta có thể chơi golf mỗi phiên bản ES6 xuống còn 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))

Và ES7 giảm xuống còn 55:

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

Nếu bạn muốn tìm hiểu thêm về phạm vi chơi gôn, hãy xem bộ mẹo này . Ngoài ra còn có một về hiểu biết mảng của ES7 .

EDIT: Như edc65 đã chỉ ra, hầu hết những thứ này trở nên ngắn hơn bằng cách sử dụng i.toString(36)thay vì 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

Tôi tin rằng đây là giá trị ngắn nhất có thể được gọi là giá trị trả về của hàm:

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

Nó ngắn hơn ba byte so với trả về thủ công từ hàm:

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

Tất nhiên, x=>"abcdefghijklmnopqrstuvwxyz"vẫn đánh bại mọi thứ khác.


Tôi thực sự thích nơi này sẽ diễn ra - chỉ ước tôi có thể ES7 trong chrome :(
Charlie Wynn

2
@CharlieWynn Vâng, thật đáng tiếc khi không phải tất cả các trình duyệt đều hỗ trợ tất cả các tính năng mới nhất. Nhưng sau tất cả, Chrome đã không được xây dựng trong một ngày ...;)
Sản phẩm điện tử

Hầu hết các giải pháp này có thể được rút ngắn bằng cách sử dụng .toString thay vì String, .fromCharCode. Xem câu trả lời của tôi
edc65

1
@CharlieWynn Tôi nghĩ Chrome Beta hiện hỗ trợ tất cả ES7 và tất cả ES6 ngoại trừ các mô-đun và tối ưu hóa cuộc gọi đuôi.
gcampbell

Đây là 42 -ter có thể được gọi là giá trị trả về của hàm: (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
Rick Hitchcock

7

Đây là một cách tiếp cận khác, biểu thức ES6 51 byte:

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

Tất nhiên là 50 byte.


Đối với chữ hoa: String.fromCharCode (... Array (91) .keys ()). Lát (65)
jpoppe

1

36 byte, sử dụng một mẹo mà tôi vừa tìm hiểu (từ bài đăng này: /codegolf//a/176496/64538 ):

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

window.name là một chuỗi rỗng theo mặc định.

Tất nhiên, điều này thậm chí còn ít thực tế hơn giải pháp 38 byte vì nó sử dụng tên biến dài hơn.


1

Sử dụng những gì có thể hoặc không thể được xác định trong phạm vi toàn cầu

39 byte cho các thuộc tính đối tượng để khớp mảng a-z

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

48 byte cho một loại chưa được sắp xếp Set

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

55 byte cho một sắp xếp Set

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

67 byte cho một chuỗi được sắp xếp

a=[...new Set(`${Object.keys(top)}`.match(/[a-z]/g).sort())].join``
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.