Mein Lehrer war mit meinen Mars-Hausaufgaben mehr als unzufrieden . Ich habe alle Regeln befolgt, aber sie sagt, dass das, was ich ausgegeben habe, Kauderwelsch war. Als sie es sich zum ersten Mal ansah, war sie höchst misstrauisch. "Alle Sprachen sollten Zipfs Gesetz folgen bla bla bla" ... Ich wusste nicht einmal, was Zipfs Gesetz war!
Es stellt sich heraus, dass Zipfs Gesetz besagt, dass, wenn Sie den Logarithmus der Häufigkeit jedes Wortes auf der y-Achse und den Logarithmus der "Stelle" jedes Wortes auf der x-Achse zeichnen (am häufigsten = 1, am zweithäufigsten = 2, dritthäufigstes Kommmon = 3 usw.), dann zeigt der Plot eine Linie mit einer Steigung von ungefähr -1, geben oder nehmen Sie ungefähr 10%.
Zum Beispiel ist hier eine Handlung für Moby Dick:
Die x-Achse ist das n -häufigste Wort, die y-Achse ist die Anzahl der Vorkommen des n -häufigsten Wortes. Die Steigung der Linie beträgt ca. -1,07.
Jetzt decken wir Venutian ab. Zum Glück benutzen die Venezianer das lateinische Alphabet. Die Regeln sind wie folgt:
- Jedes Wort muss mindestens einen Vokal enthalten (a, e, i, o, u)
- In jedem Wort können bis zu drei Vokale hintereinander stehen, jedoch nicht mehr als zwei Konsonanten hintereinander (ein Konsonant ist ein Buchstabe, der kein Vokal ist).
- Keine Wörter länger als 15 Buchstaben
- Optional: Gruppieren Sie Wörter in Sätzen mit einer Länge von 3-30 Wörtern, die durch Punkte getrennt sind
Da der Lehrer der Meinung ist, dass ich meine Mars-Hausaufgaben betrogen habe, wurde ich beauftragt, einen Aufsatz zu schreiben, der mindestens 30.000 Wörter lang ist (in venezianischer Sprache). Sie wird meine Arbeit anhand des Zipfschen Gesetzes überprüfen. Wenn also eine Linie (wie oben beschrieben) eingepasst ist, muss die Steigung höchstens -0,9, aber nicht weniger als -1,1 betragen, und sie möchte einen Wortschatz von mindestens 200 Wörtern. Das gleiche Wort sollte nicht mehr als 5 Mal hintereinander wiederholt werden.
Das ist CodeGolf, also gewinnt der kürzeste Code in Bytes. Bitte fügen Sie die Ausgabe in Pastebin oder ein anderes Tool ein, wo ich sie als Textdatei herunterladen kann.
Antworten:
Mathematica, 102 Bytes
Unbenannte Funktion, die keine Eingabe annimmt und eine Zeichenfolge zurückgibt, die aus 40.320 venusianischen Wörtern mit drei Buchstaben und nachgestellten Leerzeichen besteht.
Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]
erzeugt die 216 möglichen Wörter mit drei Buchstaben, wobei nur die Buchstaben "vaeiou" verwendet werden, von denen jedes ein eigenes nachgestelltes Leerzeichen hat. Das erste dieser Wörter, "vvv", ist kein gültiges venusianisches Wort, sondernRest
wirft es weg.Dann
RandomChoice[1/Range@215->...,8!]
macht 8! = 40.320 zufällige Auswahlen aus der resultierenden 215-Wort-Liste, wobei die Häufigkeitsgewichte durch die Kehrwerte der ersten 215 Ganzzahlen (1/Range@215
) bestimmt werden. Schließlich<>""...
verkettet die Zeichenfolgen in der Ergebnisliste.Die Ausgabe ist alles andere als deterministisch; Ein Durchgang ergab diesen venusianischen Aufsatz .
Mathematica, 129 Bytes
Dieser ist deterministisch. Die Basismenge von 215 Wörtern ist dieselbe, aber jetzt wird jedes Wort genau so oft wiederholt (Wort #j wird ungefähr 7! / J-mal wiederholt), damit das zipf-Gesetz gilt. Dann werden die Wörter gleichmäßig verschachtelt, um Wiederholungen zu vermeiden. (Stellen Sie sich vor, jedes Wort wird auf einem Lineal mit gleichem Abstand von allen Kopien dieses Wortes angeordnet. Wenn alle Wörter der Reihe nach gelesen werden, wiederholt sich kein bestimmtes Wort viel, vielleicht gar nicht.) Das Ergebnis ist ein 30.117-Wort Venusianischer Aufsatz .
quelle
vva
Erscheint sechsmal hintereinander. Ich denke, es gibt möglicherweise ein größeres Problem ... sollten Sie nicht jedes Mal die Arbeit herausfordern? (Und wenn nicht, wie bestimmen Sie, wie wahrscheinlich es ist, dass sie arbeiten?)05AB1E ,
343332 BytesProbieren Sie es online!
Ich finde es ist immer noch ziemlich golffähig! Zum Beispiel
vNy<FD}
könnten die numerischen Konstanten und golfable sein.Ausgabebeispiel
Wie funktioniert es?
Es werden alle Wortkombinationen nach der Regel "Vokal + Vokal + Konsonant" generiert, wodurch 525 eindeutige gültige Wörter (mehr als 200) erstellt werden. Dann ordnet es jedem von ihnen eine Frequenz zu, die dem Gesetz entspricht,
f(x) = 4725/x
wox
ist der Rang des aktuellen Wortes, der bei 1 beginnt und bei 525 endet. Dann werden die Frequenzen normalisiert und multipliziert, so dass es mindestens 30000 Wörter gibt. Dieser Code ergibt immer 32074 Wörter, um die beteiligten Konstanten golfbar zu machen (siehe Code-Erklärung). So wird jedes Wort so oft wiederholt, wie es der Häufigkeit desselben Wortes entspricht. Schließlich werden die Wörter gemischt. Es kann jedoch nicht garantiert werden, dass ein Wort niemals fünf Mal hintereinander wiederholt wird. Daher erzeugt das Programm mehr als die benötigten 200 eindeutigen Wörter, um die Wahrscheinlichkeit zu verringern, dass ein Wort fünfmal hintereinander wiederholt wird. Bitte beachten Sie, dass dieser Code immer die gleiche Wortfolge generiert. Das einzige, was sich zwischen zwei Läufen unterscheidet, ist das Ergebnis des Mischvorgangs.Wie bewerte ich die Frequenz?
Ich habe einen einfachen Python3-Code erstellt, der den Text in der Datei "output" (aus algorithmischer Sicht ist das sinnvoll!) Und die Ausgabe in "stats.csv" aufnimmt.
Was für meinen Code immer die folgende Verteilung ergibt:
Die Steigung beträgt also -1,0138. Dieser Wert liegt jetzt weniger nahe bei -1 als die Steigung des vorherigen Codes, erfüllt jedoch weiterhin die Steigungsbeschränkungen.
quelle
Bash / Core Utils,
122110 BytesAbgerollt:
Die
for w
Schleife erzeugt 243 verschiedene Wörter.let ++x;
Inkremente setzen anfangs x nicht fest (Regeln für arithmetische Ausdrücke werden während dieser ersten Ausführungx
als 0 behandelt, und daher wird sie durch ihr Inkrement auf 1 gesetzt). Die nächste Zeile erzeugt somit aufeinanderfolgende Wörter mit einer Frequenz von 5575 / x, um die Zipf-Frequenz zu approximieren.Der nächste Schritt besteht darin, dies deterministisch zu permutieren, um die Wiederholungsanforderung zu erfüllen; Obwohl
--random-source
es sich um einen furchtbar großen Flaggennamen handelt, übertrifft die Verwendung mit shuf die Zeichenanzahl der Hand, die einen Mul-Mod-Selektor rollt.yes ae
ist eigentlich das kürzeste festgelegte "zufällige" Gerät, das ich als konform befunden habe.Dies erzeugt diesen 33729-Wort-Aufsatz [Pastebin] .
Bash / Core Utils,
9684 Bytes (nicht konkurrierend)Für einen nicht-deterministischen Ansatz hacken Sie einfach die Shuf-Flags ab:
Analyse
Die Zipf-Neigung ist so eingestellt, dass sie gerade ist. Verwenden von Excel zum Zeichnen auf logarithmischen Skalen:
Der Lehrer sollte eine zipf-Steigung von = -1.000764 bemerken.
quelle