Meine Hausaufgabe besteht darin, einen marsianischen Aufsatz (siehe unten) mit 729 bis 810 Wörtern zu schreiben . Ihre Aufgabe ist es, ein Programm zu schreiben, das den Aufsatz generiert.
Geschichte
Um die Wende des 20. Jahrhunderts soll die Spiritistin Catherine-Elise Müller mit Marsmenschen kommuniziert haben. Während somnambulatorischer Trances schrieb sie Mars-Skripte. Die Psychologin Théodore Flourney entdeckte, dass ihre marsianischen Schriften ihrem französischen Muttersprachler sehr ähnlich waren, und dokumentierte in seinem Buch "Von Indien zum Planeten Mars" das marsianische Alphabet von Catherine.
Das Folgende basiert lose auf diesem Alphabet mit einem erweiterten Mythos.
Problembeschreibung
Die Mars-Sprache hat 21 Buchstaben, die hier neben jedem lateinischen Äquivalent angezeigt werden:
Leider gibt es für Martian kein Unicode (obwohl der Mars Teil des Universums ist), daher verwenden wir keine lateinischen Zeichen.
Während unsere Phoneme im Englischen in zwei Haupttypen (Konsonanten / Vokale) unterteilt sind, die wir den Buchstaben lose zuordnen, hat Martian drei Buchstabentypen:
- Die Vokale: aeimnou
- Die harten Konsonanten: bcdgkpt
- Die weichen Konsonanten: fhlrsvz
Darüber hinaus enthält die Mars-Sprache ein einziges Interpunktionszeichen - den Punkt.
Ein Mars-Wort besteht aus 3 bis 9 Buchstaben. Alle marsianischen Wörter haben mindestens einen Vokal, einen harten Konsonanten und einen weichen Konsonanten (in beliebiger Anordnung). Zum Beispiel fng
, cdaz
, vpi
und pascal
sind vom Mars Worte.
Ein Mars-Satz besteht aus 3 bis 9 Mars-Wörtern, die durch Leerzeichen und einen Punkt getrennt sind.
Ein Mars-Absatz besteht aus 3 bis 9 Mars-Sätzen, die durch Leerzeichen und eine neue Zeile getrennt sind.
Ein Mars-Aufsatz ist eine Sammlung von Mars-Absätzen, die keine zusammenhängenden Wortwiederholungen enthalten.
Eine Wiederholung zusammenhängender Wörter ist jedes Konstrukt SS, bei dem S eine zusammenhängende Menge von Wörtern ist. Beachten Sie, dass diese Definition Satz- und Absatzgrenzen ignoriert.
Beispiele
Bitte beachten Sie: Nach jedem Beispiel folgt eine einzelne nachgestellte Zeile (da alle Absätze in Mars mit einer neuen Zeile enden).
Nicht marsianischer Aufsatz
Lorem Ipsum Dolor sitzen amet. quis nostrud exercitation ullamco laboris.
...aus vielen Gründen. Dieses Beispiel soll einige verschiedene Regeln veranschaulichen:
- Lorem ist kein marsianisches Wort, weil es keine harten Konsonanten hat.
- amet ist kein marsianisches Wort, weil es keine weichen Konsonanten hat. (
m
ist ein Marsvokal). - quis ist kein marsianisches Wort, weil es keine harten Konsonanten hat
- quis ist kein Mars-Wort, weil q kein Mars-Buchstabe ist
- Übung ist kein Mars-Wort, weil es mehr als 9 Buchstaben hat
- Übung ist kein Mars-Wort, weil x kein Mars-Buchstabe ist
Marsaufsatz
fng cdaz vpi. Pascal brach Grund. Popplers schmecken gut.
... weil es ein Marsabsatz ist. Der marsianische Absatz enthält drei marsianische Sätze.
Nicht marsianischer Aufsatz
fng cdaz vpi. Pascal brach Grund. Freie Pascal Regeln.
... da free pascal rules.
ist kein Mars-Satz, weil weder Mars-Wörter free
noch rules
Mars-Wörter, weil sie keine harten Konsonanten haben.
Marsaufsatz
fng cdaz vpi. Pascal brach Grund. Popplers schmecken gut. cdaz vpi fng. Grundlegende Pausen Pascal. Poppler schlagen hart zu. fng cdaz vpi.
... das zwei Absätze vom Mars enthält. Der Satz fng cdaz vpi.
erscheint zweimal, aber das ist völlig in Ordnung.
Nicht marsianischer Aufsatz
Poppler schmecken fng. cdaz vpi pascal. brach fng cdaz vpi. Pascal brach Omicron-Planeten. grundlegende Angst Ziegen. vpi piv vpi.
... weil das Konstrukt fng. cdaz vpi pascal. broke fng cdaz vpi. [nl] pascal broke
eine zusammenhängende Wortwiederholung ist.
Herausforderung
Ihre Herausforderung besteht darin, eine Funktion oder ein Programm zu schreiben, das keine Eingaben akzeptiert und als Ausgabe meine Hausaufgaben erzeugt. Das heißt, Ihr Programm sollte einen marsianischen Aufsatz mit 729 bis 810 Wörtern (einschließlich) erstellen. Denken Sie daran, dass die Ausgabe Ihres Programms ein gültiger marsianischer Aufsatz sein muss, aber Sie müssen ihn nicht jedes Mal zufällig oder anders generieren. Alles, was Sie tun, um einen gültigen Mars-Aufsatz zu erstellen, zählt.
Ich habe ein C ++ - Programm geschrieben, um Aufsätze zu überprüfen , die Sie verwenden dürfen.
Das ist Code Golf. Kürzester Code in Bytes gewinnt. Standardlücken sind nicht erlaubt.
Antworten:
05AB1E ,
25242220 Bytes-2 Bytes dank Emigna (Signifikanter Refaktor, danke Mann).
Probieren Sie es online!
Es stellt sich heraus, dass die 810-Wort-Version kürzer ist als die 729-Wort-Version.
Ausgabe:
quelle
"."
kann'.
für 1 byte gespeichert werden.A7£œJðý72ô€¨'.«9ô9£»
für 20.Gelee ,
28 26 25 2423 Bytes-1 Byte dank Carusocomputing (ersetzen Sie das Wort
thimble
durchabcdefg
)TryItOnline!
Wie?
Erstellt eine Liste aller
362880
Permutationen der erstensiebenneun Buchstaben des englischen Alphabetsabcdefghi
, die alle die Eigenschaften von Mars-Wörtern haben und alle verschieden sind, und formatiert sie unter Verwendung der ersten729
Wörter zu einem Aufsatz .* Zeitraum
quelle
abcdefg
.Ruby,
86 83 8279 BytesDer Trick: Drucken Sie alle Zahlen zwischen 102000000 und 102222222 in Basis 3
quelle
Python 3,
121119 Bytesrepl.it
Wie?
Zählt ab
i=729
und erhält eine Liste der Buchstaben der i-ten Permutation'thimble'
als nächstes eindeutiges Mars-Wort (list(permutations('thimble'))[i]
).Vermeidet die
''.join(...)
Verwendung von a*expression
, um die Liste zu entpacken, während das Standardtrennzeichenprint
von einem Leerzeichen in eine leere Zeichenfolge geändert wird (sep=''
).Verwendet das
end
Argumentprint
, optional Leerzeichen, Punkte und Zeilenvorschübe mit modularer Arithmetik hinzuzufügen. Ein Punkt nach jedem neunten Wort ('.'*(i%9<1)
) und ein Zeilenvorschub nach jedem einundachtzigsten Wort, andernfalls ein Leerzeichen, das durch Indizieren in eine Zeichenfolge mit zwei Zeichen (' \n'[i%81<1]
) erzielt wird .quelle
Mathematica, 113 Bytes
Unbenannte Funktion, die einen String als Ausgabe erzeugt; Diese Zeichenfolge ist ein marsianischer Aufsatz, in dem jeder Satz drei Wörter und jeder Absatz drei Sätze enthält. (Seine deterministische Ausgabe ist unten.)
Der Kern des Algorithmus nutzt die coole mathematische Tatsache, dass die Unterschiede der Thue-Morse-Folge eine unendliche Folge der drei Symbole –1, 0 und 1 bilden, die keine zusammenhängenden Ziffernwiederholungen aufweisen.
Differences@Array[ThueMorse,730]
generiert diese Sequenz mit der Länge 729.Dann
"ark"["bus","car"][[#]]&/@
wird auf diese Sequenz angewendet; Dies wandelt jede 1 in "bus" (das erste Argument), jede –1 in "car" (das letzte Argument) und jede 0 in "ark" (den Funktionskopf) um.(p=Partition)[...,3]~p~3
unterteilt diese Folge von Wörtern in verschachtelte Listen, die jeweils aus drei Listen mit jeweils drei Wörtern bestehen. SchließlichStringRiffle[...,n=".\n",". "," "]
verkettet alle Worte zusammen, mit unterschiedlichen Separatoren auf der Listenstufe abhängig; und<>n
fügt die letzte Periode und den Zeilenumbruch hinzu.Die Ausgabe sieht sicher nicht wiederholungsfrei aus ....
Mathematica, 100 Bytes
Ein direkter Port von Jonathan Allens Jelly-Algorithmus.
quelle
Print@"fng cdaz vpi. pascal broke basic. popplers taste great."
PHP, 86 Bytes
Erzeugt einen zufälligen Aufsatz mit 729 Wörtern, der keine Wörter wiederholt.
Verwenden Sie wie:
Erläuterung:
quelle
/// 95 Bytes
(zusätzliche neue Zeile am Ende, hier nicht sichtbar)
Probieren Sie es online!
Aufsatz:
quelle
JavaScript (ES6), 130 Byte
Dieser Aufsatz enthält 774 marsianische Wörter aus einem Wörterbuch mit 308 verschiedenen Wörtern, die aus allen marsianischen Buchstaben bestehen.
Buchstaben werden nach der folgenden Formel pseudozufällig ausgewählt:
Wo
71
ist die kleinste Primzahl [1], für die mit diesem Modulo keine zusammenhängende Wortwiederholung auftritt?Code-Snippet anzeigen
[1] Ich habe nur Primzahlen getestet, als ich diesen Code geschrieben habe. Der kleinste Nicht-Hauptkandidat ist
56
.quelle
Python 3,
404270332339285266259 BytesDies ist ein Versuch, einen zufälligen marsianischen Aufsatz zu erstellen, in dem ich das marsianische Alphabet zufällig auswähle und anschließend prüfe, welche Wörter funktionieren.
Edit: -10 Bytes von Zachary T's Vorschlag zu verwenden
R=range
. -9 Bytes vom Ändern.intersection(w)
auf&set(w)
. -7 Bytes vom ÄndernA[random.randrange(21)]
aufrandom.choice(A)
.Ungolfing
quelle
import
)range(9)
einer Variablen zuweisen , und&
nicht.intersection
?range
und diese dann verwenden?