मदद! मेरे पास ज्यादा होमवर्क है!


18

मेरा शिक्षक मेरे मार्टियन होमवर्क से नाखुश से अधिक था । मैंने सभी नियमों का पालन किया, लेकिन वह कहती है कि मैं जो उत्पादन करता था वह अस्पष्ट था ... जब उसने पहली बार देखा, तो वह बहुत संदिग्ध था। "सभी भाषाओं को जिपफ के नियम ब्ला ब्ला ब्ला का पालन करना चाहिए" ... मुझे यह भी पता नहीं था कि जिपफ का कानून क्या था!

यह पता चलता है कि जिप्फ़ का नियम बताता है कि यदि आप y अक्ष पर प्रत्येक शब्द की आवृत्ति का लघुगणक और x अक्ष पर प्रत्येक शब्द के "स्थान" का लघुगणक (सबसे सामान्य = 1, दूसरा सबसे सामान्य) - 2 लिखते हैं। तीसरा सबसे कमोन = 3, और इसी तरह), फिर प्लॉट लगभग -1 की ढलान के साथ एक रेखा दिखाएगा, 10% दे या ले।

उदाहरण के लिए, मोबि डिक के लिए यहां एक प्लॉट:

यहाँ छवि विवरण दर्ज करें

X अक्ष n n सबसे सामान्य शब्द है, y- अक्ष n सबसे सामान्य शब्द के होने की संख्या है। रेखा का ढलान लगभग -1.07 है।

अब हम वेनूटियन को कवर कर रहे हैं। शुक्र है कि वेणुशियन लैटिन वर्णमाला का उपयोग करते हैं। नियम इस प्रकार हैं:

  • प्रत्येक शब्द में कम से कम एक स्वर होना चाहिए (ए, ई, आई, ओ, यू)
  • प्रत्येक शब्द में एक पंक्ति में तीन स्वर हो सकते हैं, लेकिन एक पंक्ति में दो से अधिक व्यंजन नहीं हैं (एक व्यंजन ऐसा कोई अक्षर है जो स्वर नहीं है)।
  • 15 अक्षरों से अधिक शब्द नहीं
  • वैकल्पिक: समूह शब्द 3-30 शब्दों में लंबे, अवधि द्वारा सीमांकित

क्योंकि शिक्षक को लगता है कि मैंने अपने मार्टियन होमवर्क पर धोखा दिया है, मुझे कम से कम 30,000 शब्द लंबे (वेनूटियन में) एक निबंध लिखने का काम सौंपा गया है। वह जिप्फ़ के नियम का उपयोग करके मेरे काम की जाँच करने जा रही है, इसलिए जब एक पंक्ति फिट होती है (जैसा कि ऊपर वर्णित है) ढलान को अधिकतम -0.9 पर होना चाहिए, लेकिन -1.1 से कम नहीं है, और वह कम से कम 200 शब्दों की शब्दावली चाहती है। एक ही शब्द को लगातार 5 बार से अधिक नहीं दोहराया जाना चाहिए।

यह कोडगॉल्फ है, इसलिए बाइट्स जीत में सबसे छोटा कोड है। कृपया आउटपुट को पास्टबीन या किसी अन्य टूल पर पेस्ट करें जहां मैं इसे टेक्स्ट फाइल के रूप में डाउनलोड कर सकता हूं।


हाँ और यदि आप चाहते हैं कि आप केवल 32767 शब्द का वाक्य कर सकें। प्रतिबंध यह है कि वाक्य में शब्दों की आवृत्तियों को जिपफ के नियम का पालन करना चाहिए
जे। एंटोनियो पेरेज

1
"वीनस से" के लिए पारंपरिक विशेषण वेनेरल है, लेकिन किसी कारण से इसे लोकप्रियता में गिरावट आई है। वीनसियन का उपयोग आमतौर पर विज्ञान-फाई में किया जाता है।
पीटर टेलर

मैं अनुमान लगा रहा हूं कि zipf वितरण के बाद शब्दों की एक सूची का निर्माण करना और इसे फेरबदल करना एक अनुक्रम के उत्पादन की एक उच्च संभावना होगी जो लगातार शब्द के जोड़े के साथ भी zipf वितरण का अनुसरण कर रहा है। इसके अलावा, सूची में पर्याप्त भिन्न शब्दों के साथ एक ही शब्द को एक पंक्ति में 5 बार से अधिक दोहराए जाने की संभावना वास्तव में छोटी होगी। मामले में मैंने इस दृष्टिकोण की कोशिश की और एक वैध निबंध का उत्पादन करने में कामयाब रहा, क्या इसे स्वीकार किया जाएगा?
सिंह

आपका अनुमान वाजिब है, हालाँकि ढलान -0.35 होगा
जे। एंटोनियो पेरेज़

यह अभी भी एक सीधी रेखा की तरह दिखेगा; यह सिर्फ ढलान भी महान होगा
जे। एंटोनियो पेरेज़

जवाबों:


3

गणितज्ञ, 102 बाइट्स

""<>RandomChoice[1/Range@215->Rest@Flatten@Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}],8!]

कोई इनपुट नहीं ले रहा है और पीछे की ओर रिक्त स्थान के साथ 40,320 तीन अक्षरों वाले वीनसियन शब्दों से युक्त एक स्ट्रिंग लौटा रहा है।

Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]केवल पत्र "vaeiou" का उपयोग करके 216 तीन-अक्षर शब्द संभव बनाता है, प्रत्येक का अपना अनुगामी स्थान होता है। इन शब्दों में से पहला, "vvv", मान्य वीनसियन नहीं है, लेकिन Restइसे दूर फेंकता है।

फिर RandomChoice[1/Range@215->...,8!]8 बनाता है! परिणामस्वरूप 215-शब्द सूची से 40,320 यादृच्छिक विकल्प, पहले 215 पूर्णांकों ( 1/Range@215) के पारस्परिक भार द्वारा निर्धारित आवृत्ति भार के साथ । अंत <>""...में, परिणामी सूची में तारों को समेटता है।

आउटपुट नियतात्मक से बहुत दूर है; एक रन ने इस वीनसियन निबंध को जन्म दिया ।

गणितज्ञ, 129 बाइट्स

#2&@@@Sort[Join@@Table[{i,Rest@Flatten@Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]~Part~j},{j,215},{i,0,1,j/7!}]]<>""

यह एक नियतांक है। 215 शब्दों का आधार सेट समान है, लेकिन अब प्रत्येक शब्द को सटीक रूप से बार-बार दोहराया जाता है (शब्द #j को लगभग 7 /! बार दोहराया जाता है) ज़िप के नियम को धारण करने के लिए मजबूर करने के लिए। फिर शब्दों को पुनरावृत्ति से बचने के लिए समान रूप से व्याख्या की जाती है। (कल्पना करें कि प्रत्येक शब्द एक शासक पर रखा गया है, उस शब्द की सभी प्रतियों के साथ समान रूप से स्थान दिया गया है; जब सभी शब्द क्रम में पढ़े जाते हैं, तो कोई विशेष शब्द अधिक नहीं दोहराएगा, शायद बिल्कुल भी नहीं।) परिणाम 30,117-शब्द है। वीनसियन निबंध


8 नहीं बनाता है! छद्म यादृच्छिक विकल्प का मतलब है कि आप एक ही शब्द के 6 लगातार दोहराव के साथ हवा कर सकते हैं?
डेनिस

हाँ, सिद्धांत रूप में।
ग्रेग मार्टिन

@GregMartin वास्तव में ... आप जिस निबंध से जुड़े हैं वह गैर-अनुपालन है; vvaलगातार छह बार दिखाई देता है। मुझे लगता है कि संभवतः एक बड़ा मुद्दा है ... लेकिन हर बार जवाब काम को चुनौती नहीं देनी चाहिए? (और यदि नहीं, तो आप कैसे काम करने की संभावना की रेखा खींचते हैं?)
एच वाल्टर्स

यह एक उचित आलोचना है, और मुझे यह देखने में दिलचस्पी है कि यह कैसे खेलता है।
ग्रेग मार्टिन

2

05AB1E ,34 33 32 बाइट्स

525DL/9*vNy<FD}})žMDâžNâJè3ô.rðý

525DL                            Yield [1, ..., 525]
     /                           Yield [525/1, ..., 525/525]
      9*                         Yield [4725/1, ..., 4725/525]. It's the number of occurences of each word. The sum of this array is greater than 30000
        v                        For each value (y = value, N = iteration counter starting from 0)
         N                       Push iteration counter
          y<FD}                  Push an array of "int(value)" times the iteration counter
               }                 End for
                )                Wrap everything in an array. At this point the array countains the sorted indices of all words that matches the frequency specs
                 žM              Push "aeiou"
                   Dâ            Cartesian product with itself (["aa", "ae", ...])
                     žN          Push the consonants
                       âJ        Cartesian product and join the values to make valid venutian words
                         è       Compute a big string with all words that correspond to the formerly computed indices
                          3ô     Since all words are concatenated, separate them into blocks of 3 letters
                            .r   Shuffle
                              ðý Join with whitespaces and implicitly display

इसे ऑनलाइन आज़माएं!

मुझे लगता है कि यह अभी भी बहुत गोल्फ है! उदाहरण के लिए संख्यात्मक स्थिरांक और vNy<FD}गोल्फ हो सकता है।

आउटपुट उदाहरण

यह कैसे काम करता है?

यह नियम "स्वर + स्वर + व्यंजन" के बाद शब्दों के सभी संयोजनों को उत्पन्न करता है, जो 525 अद्वितीय मान्य शब्दों (200 से अधिक) बनाता है। यह तब उनमें से प्रत्येक को एक आवृत्ति से जोड़ता है जो कानून को संतुष्ट करता हैf(x) = 4725/x जहांxवर्तमान शब्द की श्रेणी है, 1 से शुरू होकर 525 पर समाप्त होता है। फिर आवृत्तियों को सामान्य किया जाता है और गुणा किया जाता है इसलिए कम से कम 30000 शब्द होते हैं। इस कोड में हमेशा 32074 शब्दों को शामिल किया जाता है ताकि इसमें शामिल स्थिरांक को गोल्फ योग्य बनाया जा सके (कृपया कोड स्पष्टीकरण देखें)। इसलिए प्रत्येक शब्द को उसी शब्द की आवृत्ति के अनुरूप बार-बार दोहराया जाता है। अंत में शब्दों में फेरबदल किया जाता है। हालांकि यह गारंटी नहीं देता है कि एक शब्द को लगातार पांच बार दोहराया नहीं जाता है। इसलिए कार्यक्रम एक पंक्ति में पांच बार दोहराए गए शब्द की संभावना को कम करने के लिए आवश्यक 200 अद्वितीय शब्दों से अधिक उत्पन्न करते हैं। कृपया ध्यान दें कि यह कोड हमेशा एक ही शब्द अनुक्रम उत्पन्न करता है। केवल एक चीज जो दो रनों के बीच भिन्न होती है, वह फेरबदल ऑपरेशन का परिणाम है।

आवृत्ति का मूल्यांकन कैसे करें?

मैंने एक साधारण Python3 कोड बनाया, जो "आउटपुट" नाम के फ़ाइल में पाठ को लेता है (एल्गोरिथम बिंदु से, यह समझ में आता है!) और आउटपुट "आँकड़ों" .vsv।

from collections import Counter
from math import log10

with open("output", "r") as f:
    with open("stats.csv", "w") as stats:
        words = f.read().split()
        freqs = Counter(words)
        freqs = sorted([(i,freqs[i]) for i in freqs],key=lambda x:-x[1])

        print(len(words), "words")
        stats.write("logX;logF\n")
        for i, (key, f) in enumerate(freqs):
            stats.write(str(log10(i+1))+";"+str(log10(f))+"\n")

जो मेरे कोड के लिए हमेशा निम्न वितरण देता है: आवृत्ति कानून

तो ढलान -1.0138 है। यह मान अब पिछले कोड की ढलान से -1 के करीब है, लेकिन यह अभी भी ढलान की कमी को पूरा करता है।


आवृत्ति का मूल्यांकन करने के लिए स्क्रिप्ट के लिए धन्यवाद, ध्यान दें कि आपके पास अंत में एक अतिरिक्त `है। इसके अलावा, आप विभाजक के रूप में अर्धविराम का उपयोग क्यों करते हैं? सीएसवी आमतौर पर अल्पविराम से अलग किए गए मूल्यों के लिए खड़ा होता है;)
सिंह 15

1
हाँ तुम ठीक कह रहे हो! मैं एक पल के लिए मार्कडाउन से भ्रमित हो गया। मैंने पहले इनलाइन कोड का उपयोग किया था, तब एहसास हुआ कि कोड ब्लॉक का उपयोग करना अधिक उचित था लेकिन मैं अतिरिक्त `को हटाना भूल गया। मैं अर्धवृत्त का उपयोग csv विभाजक के रूप में करता हूं क्योंकि मैं फ्रेंच हूं और कुछ सॉफ्टवेयर्स या कंपनियों का उपयोग डॉट्स के बजाय दशमलव मूल्यों को रखने के लिए किया जाता है जैसा कि हम हस्तलिखित दशमलव मूल्यों के साथ करते हैं। यद्यपि मैं हमेशा पूर्ण भाग को भिन्न भाग से अलग करने के लिए डॉट का उपयोग करता हूं, मैं अर्धविराम का उपयोग बिना अधिक सोच के करता हूं। लेकिन हे, ssv भी महान है;)
18

0

बैश / कोर यूटिल्स, 122 110 बाइट्स

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{ let ++x;yes $w|head -$[5575/x];}|shuf --random-source=<(yes ae)

unrolled:

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{
    let ++x
    yes $w|head -$[5575/x]
}|shuf --random-source=<(yes ae)

for wपाश 243 अलग शब्द उत्पन्न करता है। let ++x;वेतन वृद्धि शुरू में x (प्रति अंकगणित के दौरान प्रति अंकगणितीय अभिव्यक्ति नियम, x0 के रूप में माना जाता है और इस प्रकार इसकी वृद्धि इसे 1 पर सेट करती है)। अगली पंक्ति इस प्रकार लगभग 5575 / x आवृत्ति के सफल शब्द उत्पन्न करती है जिप्फ़ आवृत्ति।

अगला कदम दोहराव की आवश्यकता को फिट करने के लिए इस निर्धारक को अनुमति देने के लिए है; --random-sourceएक बहुत बड़ा झंडा नाम होने के बावजूद , शफ के साथ इसका इस्तेमाल करने से हाथ की गिनती काउल-मोल चयनकर्ता की धड़कन बन जाती है। yes aeवास्तव में सबसे छोटा "यादृच्छिक" डिवाइस है जिसे मैंने अनुपालन करने के लिए पाया है।

यह इस 33729 शब्द निबंध [pastebin] उत्पन्न करता है ।

बैश / कोर बर्तन, 96 84 बाइट्स (गैर-प्रतिस्पर्धात्मक)

गैर-नियतात्मक दृष्टिकोण के लिए, बस सूफ़ फ़्लैग को काटें:

for w in {b,c,d}{a,e,i}{f,g,h}{o,u,a}{j,k,l};{ let ++x;yes $w|head -$[5575/x];}|shuf

विश्लेषण

जिपफ ढलान को सीधा किया जाता है। लघुगणकीय तराजू पर प्लॉट करने के लिए एक्सेल का उपयोग करना:

शिक्षक को = -1.000764 के एक जिपफ ढलान पर ध्यान देना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.