การสร้างตัวอักษรใน JavaScript


21

ฉันค่อนข้างแน่ใจว่าไม่มีวิธีที่ดีกว่าในการทำเช่นนี้ แต่คิดว่ามันไม่เจ็บที่จะถาม

a='abcdefghijklmnopqrstuvwxyz'ฉันเหนื่อยกับการพิมพ์ออกมา

ภาษาที่น่าสนใจมีRange('a'..'z')หรือคล้ายกัน

เราจะทำอะไรกับ JS ที่สั้นที่สุด?

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

ยาวกว่าตัวอักษร - แต่รับประกันได้ว่าฉันจะไม่ทำผิดพลาดที่ไหนสักแห่ง

ฉันหวังว่าจะมีวิธีที่ไม่น่าเชื่อสักหน่อยที่จะสร้าง az ในตัวละครน้อยกว่า 50 ตัว

ฉันยุ่งกับ i=97;Array(26).map(x=>String.fromChar....i++

แต่มันจะนานกว่าเสมอเมื่อฉันเข้าร่วมแล้วแบ่งอาร์เรย์ (26) เพื่อให้ใช้ได้


แก้ไข: ฉันได้รับมันลงไป

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

60 ไบต์


11
@muddyfish, LuisMendo: นี่คือหัวข้อต่อเมตา
Doorknob

1
[...Array(26)].map((q,w)=>String.fromCharCode(w+97))คือ 52 ไบต์และเพิ่มอีก 7 สำหรับ.join``
andlrc

ที่เกี่ยวข้อง: stackoverflow.com/questions/3895478/…
Digital Trauma

@ dev-null a = ''; i = 97; [... Array (26)]. map (b => a + = String.fromCharCode (i ++)) คือ 60 แต่ดูแลการเข้าร่วมว่าคุณเข้าร่วมอย่างไร ใน 7 โดยไม่ใช้เครื่องหมายจุลภาคในผลลัพธ์หรือไม่
Charlie Wynn

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

คำตอบ:


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 แล้วพิมพ์มัน? ดังนั้น az!
Charlie Wynn

อาร์กิวเมนต์เหล่านั้นคือ = '' และ i = 9 ของการเรียกใช้ฟังก์ชันแผนที่หรือไม่ ตรวจสอบ Array.prototype.map () บน mdn และดูเหมือนว่าแผนที่จะสนับสนุนข้อโต้แย้งดังกล่าว ..
Jay Somedon

@ JaySomedon เหล่านี้เป็นอาร์กิวเมนต์สำหรับการเรียกใช้ฟังก์ชันแผนที่ในทางที่ฟังก์ชั่นจาวาสคริปต์อย่างแท้จริงไม่สนใจและทิ้งพารามิเตอร์ที่พวกเขาไม่คาดหวัง ดังนั้นฉันจึงเริ่มต้นตัวแปรที่ฉันต้องการในขณะที่เพิ่มพารามิเตอร์ที่ไม่มีประโยชน์สำหรับฟังก์ชั่นที่เรียกว่า
edc65

@ JaySomedon ดูคำตอบนี้และความคิดเห็นที่เกี่ยวข้องcodegolf.stackexchange.com/a/2684/21348
edc65

@ edc65 aha ฉันเห็น! นั่นมันเรียบร้อย! ดังนั้นที่นี่เมื่อจาวาสคริปต์ประเมินข้อโต้แย้งเช่น i = 9 ในแผนที่ () มันจะสร้างตัวแปรทั่วโลกจริง ๆ แล้วฉันกำหนด 9 ให้กับสิ่งนั้น?
Jay Somedon

11

หมายเหตุ: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 ของ comprehensions

แก้ไข:ตามที่ 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"ยังคงเต้นทุกอย่างอื่น


ฉันชอบที่จะเกิดขึ้นจริง - แค่หวังว่าฉันจะได้ ES7 ในโครเมี่ยม :(
Charlie Wynn

2
@CharlieWynn ใช่มันเป็นความอัปยศที่ไม่ใช่ทุกเบราว์เซอร์ที่สนับสนุนคุณสมบัติล่าสุดทั้งหมด แต่สุดท้ายแล้ว Chrome ก็ไม่ได้สร้างในหนึ่งวัน ... ;)
ETHproductions

โซลูชันเหล่านี้ส่วนใหญ่สามารถสั้นลงได้โดยใช้. toString แทน String,. fromCharCode ดูคำตอบของฉัน
edc65

1
@CharlieWynn ฉันคิดว่า Chrome Beta รองรับ ES7 ทั้งหมดและ ES6 ทั้งหมดยกเว้นโมดูลและการเพิ่มประสิทธิภาพการโทรหาง
gcampbell

นี่คือ 42 byter ที่สามารถเรียกว่าเป็นค่าตอบแทนการทำงาน: (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
ริกฮิตช์ค็อก

7

นี่เป็นอีกวิธีการหนึ่งการแสดงออก 51 ไบต์ ES6:

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

แน่นอนว่า 50 ไบต์ในกรณีส่วนบน


สำหรับตัวพิมพ์ใหญ่: String.fromCharCode (... Array (91) .keys ()). slice (65)
jpoppe

1

36 ไบต์โดยใช้กลอุบายที่ฉันเพิ่งเรียนรู้เกี่ยวกับ (จากบทความนี้: /codegolf//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``
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.