गणितज्ञ, 72 65 61 बाइट्स
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
परीक्षण के लिए, मैं इसके Print@@@
साथ प्रतिस्थापित करने की सलाह देता हूं ""<>#&/@
। गणितज्ञ तब 288,000 लाइनों को प्रिंट करने के लिए हमेशा के लिए लेने के बजाय पहले कुछ और अंतिम कुछ शब्दों को दिखाते हुए एक छोटा रूप प्रदर्शित करेगा।
व्याख्या
मुझे आखिरकार स्ट्रिंग्स को विभाजित करने के लिए एक उपयोग मिला। :)
मैं कुछ समय के लिए तार जोड़ने या गुणा करने की संभावना से अंतर्ग्रही हो गया हूं, लेकिन वास्तविक उपयोग के मामले काफी सीमित हैं। मुख्य बिंदु यह है कि कुछ ऐसा ( "foo"+"bar"
या "foo"*"bar"
परिणामस्वरूप, संक्षिप्त रूप "foo""bar"
) पूरी तरह से गणितज्ञ में मान्य है। हालाँकि, यह वास्तव में पता नहीं है कि अंकगणितीय अभिव्यक्तियों में तार का क्या करना है, इसलिए ये चीजें अविकसित रह जाती हैं। गणितज्ञ आमतौर पर लागू होने वाले सरलीकरणों को लागू करता है । विशेष रूप से, स्ट्रिंग्स को कैनोनिकल ऑर्डर में सॉर्ट किया जाएगा (जो कि मैथमेटिका में काफी गड़बड़ है, एक बार जब आप विभिन्न मामलों के अक्षरों, अंकों और गैर-अक्षरों वाले स्ट्रिंग्स को सॉर्ट करना शुरू कर देते हैं), जो अक्सर एक डीलब्रेकर होता है, लेकिन यहां कोई फर्क नहीं पड़ता । इसके अलावा, "abc""abc"
को सरल बनाया जाएगा"abc"^2
(जो एक समस्या है जब आपने तार को दोहराया है, लेकिन हमारे पास ऐसा नहीं है), और ऐसा कुछ "abc"/"abc"
वास्तव में रद्द कर देगा (जिसका उपयोग हम भी करेंगे)।
ऐसे में हम यहां क्या कर रहे हैं, इसके लिए हम क्या करेंगे। हमें स्वरों की सूची और व्यंजन की एक सूची की आवश्यकता है, इसलिए हम उन्हें Tuples
सभी संभव संयोजनों को उत्पन्न करने के लिए फ़ीड कर सकते हैं । मेरा पहला तरीका भोला समाधान था:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
व्यंजन के हार्डकोड सूची में थोड़ा चोट लगी है। Mathematica में एक Alphabet
अंतर्निहित होता है, जो मुझे इससे बचने की अनुमति देता है, अगर मैं सस्ते तरीके से स्वरों को निकालने में सक्षम था। यह वह जगह है जहाँ यह मुश्किल हो जाता है। तत्वों को हटाने का सबसे सरल तरीका है Complement
, लेकिन यह लंबे समय तक समाप्त होता है, निम्न विकल्पों में से एक का उपयोग करते हुए:
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(ध्यान दें कि हमें Characters
पूरी चीज़ पर लागू होने की आवश्यकता नहीं है , क्योंकि Alphabet[]
पत्रों की एक सूची देता है, स्ट्रिंग नहीं।)
तो चलिए कोशिश करते हैं कि अंकगणित व्यवसाय। यदि हम सूची के बजाय अक्षरों के एक उत्पाद के रूप में पूरे वर्णमाला का प्रतिनिधित्व करते हैं, तो हम रद्द करने के नियम के कारण सरल विभाजन द्वारा पत्रों को निकाल सकते हैं। क्योंकि हमें ज़रूरत नहीं होगी बहुत सारे बाइट्स बचाता है Complement
। इसके अलावा, "a""e""i""o""u""y"
वास्तव में एक बाइट से कम है Characters@"aeiouy"
। तो हम इसके साथ करते हैं:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
हम कहाँ में व्यंजन और स्वर उत्पादों के भंडारण कर रहे हैं a
और b
क्रमश:। यह एक फ़ंक्शन लिखकर काम करता है, जो इसके सभी तर्कों को गुणा ##
करता है और उन्हें स्वरों के उत्पाद द्वारा विभाजित करता है। यह फ़ंक्शन वर्णमाला सूची पर लागू होता है, जो प्रत्येक पत्र को एक अलग तर्क के रूप में पारित करता है।
अब तक तो अच्छा है, लेकिन अब हमारे पास है
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
तर्क के रूप में Tuples
, और वे चीजें अभी भी उत्पाद हैं, सूचियां नहीं। आम तौर पर, इसे ठीक करने का सबसे छोटा तरीका List@@@
सामने रखा जाता है, जो उत्पादों को फिर से सूचियों में बदल देता है। दुर्भाग्य से, उन 7 बाइट्स को जोड़ना भोले दृष्टिकोण से अधिक लंबा है।
हालांकि, यह पता चला है कि Tuples
आंतरिक सूचियों के प्रमुखों के बारे में बिल्कुल भी परवाह नहीं है। यदि तुम करो
Tuples[{f[1, 2], f[3, 4]}]
(हां, एक अपरिभाषित के लिए f
।) आपको मिलेगा:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
जैसे कि आपने List
इसके बजाय इस्तेमाल किया हो f
। तो हम वास्तव में उन उत्पादों को सीधे पास कर सकते हैं Tuples
और फिर भी सही परिणाम प्राप्त कर सकते हैं। यह दो हार्डकोड स्ट्रिंग्स का उपयोग करते हुए भोले दृष्टिकोण पर 5 बाइट्स बचाता है।
अब "a""e""i""o""u""y"
भी काफी कष्टप्रद है। लेकिन रुकिए, हम यहाँ कुछ बाइट्स भी बचा सकते हैं! हमारे कार्य के तर्क व्यक्तिगत पत्र हैं। इसलिए अगर हम सिर्फ सही तर्क देते हैं, तो हम उन स्ट्रिंग शाब्दिकों के बजाय पुन: उपयोग कर सकते हैं, जो उनमें से तीन के लिए छोटा है। हम चाहते हैं कि तर्क #
(के लिए कम #1
), #5
, #9
, #15
, #21
और #25
। यदि हम #
अंत में रखते हैं, तो हमें *
उन्हें एक साथ जोड़ने के लिए कोई भी जोड़ने की आवश्यकता नहीं है , क्योंकि (regex) #\d+
एक पूर्ण टोकन है, जिसके लिए कोई गैर-अंक जोड़ा नहीं जा सकता है। इसलिए हम #5#9#15#21#25#
एक और 4 बाइट को बचाते हुए समाप्त होते हैं ।