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.fromCharCode
chấ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.