जावास्क्रिप्ट में वर्णमाला उत्पन्न करना


21

मुझे पूरा यकीन है कि ऐसा करने का एक बेहतर तरीका नहीं है, लेकिन लगा कि यह पूछने के लिए चोट नहीं पहुंचा सकता है।

मैं टाइप करके थक गया हूं a='abcdefghijklmnopqrstuvwxyz'

शांत भाषाओं में Range('a'..'z')या समान है

हम जेएस के साथ क्या कर सकते हैं कि जितना संभव हो उतना छोटा है ??

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

केवल वर्णमाला की तुलना में लंबा है - लेकिन मैं कहीं भी पेंच नहीं करता है गारंटी देता है।

मैं उम्मीद कर रहा हूँ कि कम से कम 50 वर्णों में az का उत्पादन करने के लिए एक कठिन बिट-शिफ्टी तरीका है।

मैंने साथ खिलवाड़ किया i=97;Array(26).map(x=>String.fromChar....i++

लेकिन जब मैंने ज्वाइन किया तब तक यह हमेशा लंबा था, तब उपयोग करने के लिए सरणी (26) को विभाजित करें


संपादित करें: मैंने इसे प्राप्त कर लिया है

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

60 बाइट्स


11
@ मुंडीफिश, लुइसमेन्डो: यह प्रति विषय पर मेटा है।
दरवाज़े

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

जवाबों:


12

स्ट्रिंग के लिए वैकल्पिक। 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 में परिवर्तित हो रहा है और इसे प्रिंट कर रहा है? तो अज!
चार्ली व्यान

क्या वे एक = '' और i = 9 मानचित्र फ़ंक्शन कॉल के तर्क हैं? Ard.prototyp.map () mdn पर चेक किया गया और ऐसा नहीं लगता कि मानचित्र ऐसे तर्कों का समर्थन करता है ..
Jay Somedon

@JaySomedon वे मैप फंक्शन कॉल के लिए तर्क कर रहे हैं, एक तरह से, जावास्क्रिप्ट फ़ंक्शंस टिपिकल रूप से परवाह नहीं करते हैं और उन मापदंडों को छोड़ देते हैं जिनकी वे अपेक्षा नहीं करते हैं। इसलिए मुझे एक चर की आवश्यकता है, जिसे एक पैरामीटर को जोड़ना है, जो कि फ़ंक्शन के लिए कोई उपयोग नहीं है
edc65

@JaySomedon इस उत्तर और संबंधित टिप्पणियों को भी देखें कोडगॉल्फ.स्टैकएक्सचेंज.com
a/

@ edc65 अहा मैं देख रहा हूँ! काफी अच्छा है! तो यहाँ, जब javascript, i = 9 जैसे तर्कों का मूल्यांकन करता है मानचित्र () में, यह वास्तव में एक वैश्विक चर बनाता है जो मैं तब 9 को असाइन करता हूँ?
जे सोमदोन

11

नोट: ये सभी तकनीकें वर्णमाला स्ट्रिंग को वेरिएबल में असाइन करती हैं a


मैं 99% निश्चित हूं कि जावास्क्रिप्ट में इसे प्राप्त करने का सबसे छोटा तरीका वास्तव में है:

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 कई तर्कों को स्वीकार करता है और स्वचालित रूप से उनके साथ जुड़ जाएगा। इसलिए हम प्रत्येक ईएस 6 संस्करण को 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"अभी भी सब कुछ धड़कता है।


मुझे वास्तव में पसंद है कि यह कहाँ जा रहा है - काश मैं क्रोम में ES7 पा सकता :(
चार्ली व्यान

2
@CharlieWynn हां, यह शर्म की बात है कि सभी ब्राउज़र सभी नवीनतम सुविधाओं का समर्थन नहीं करते हैं। लेकिन आखिरकार, क्रोम एक दिन में नहीं बनाया गया था ...;)
ETHproductions

इनमें से अधिकांश समाधान का उपयोग करके छोटा किया जा सकता है। स्ट्रिंग के बजाय .StString, .fromCharCode। मेरा उत्तर देखें
edc65

1
@CharlieWynn मुझे लगता है कि क्रोम बीटा अब मॉड्यूल और टेल कॉल ऑप्टिमाइज़ेशन को छोड़कर ES7 और सभी ES6 का समर्थन करता है।
gcampbell

यहाँ एक 42-बटर है जिसे फंक्शन रिटर्न वैल्यू कहा जा सकता है: (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
रिक हिचकॉक

7

यहाँ एक और दृष्टिकोण, एक 51 बाइट ES6 अभिव्यक्ति है:

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

पाठ्यक्रम के ऊपरी मामले में 50 बाइट्स।


ऊपरी स्थिति के लिए: String.fromCharCode (... ऐरे (91) .keys ())। स्लाइस (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``
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.