Mathematica, 72 65 61 Bytes
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
Zum Testen empfehle ich das Ersetzen Print@@@
durch ""<>#&/@
. Mathematica zeigt dann eine abgeschnittene Form mit den ersten und letzten Wörtern an, anstatt für immer 288.000 Zeilen zu drucken.
Erläuterung
Ich habe endlich eine Verwendung zum Teilen von Strings gefunden. :)
Ich war fasziniert von der Möglichkeit, Zeichenfolgen für eine Weile hinzuzufügen oder zu multiplizieren, aber die tatsächlichen Anwendungsfälle sind ziemlich begrenzt. Der Hauptpunkt ist, dass etwas wie "foo"+"bar"
oder "foo"*"bar"
(und folglich die Kurzform "foo""bar"
) in Mathematica vollständig gültig ist. Es weiß jedoch nicht wirklich, was es mit den Zeichenfolgen in arithmetischen Ausdrücken tun soll, sodass diese Dinge nicht bewertet werden. Mathematica nicht gelten im Allgemeinen jedoch anwendbar Vereinfachungen. Insbesondere werden die Zeichenfolgen in kanonischer Reihenfolge sortiert (was in Mathematica ziemlich durcheinander ist, wenn Sie mit dem Sortieren von Zeichenfolgen beginnen, die Buchstaben mit verschiedenen Groß- und Kleinschreibung, Ziffern und Nichtbuchstaben enthalten), was häufig ein Dealbreaker ist, aber hier keine Rolle spielt . Darüber hinaus "abc""abc"
soll vereinfacht werden"abc"^2
(Das ist ein Problem, wenn Sie Zeichenfolgen wiederholt haben, aber das haben wir auch nicht), und so etwas "abc"/"abc"
wird tatsächlich abgebrochen (was wir sogar nutzen werden).
Also, was versuchen wir hier zu golfen? Wir brauchen eine Liste von Vokalen und eine Liste von Konsonanten, damit wir sie füttern können Tuples
, um alle möglichen Kombinationen zu generieren. Mein erster Ansatz war die naive Lösung:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
Diese hartcodierte Liste von Konsonanten tut ein bisschen weh. Mathematica hat eine Alphabet
eingebaute Funktion, mit der ich es vermeiden könnte, wenn ich die Vokale auf kostengünstige Weise entfernen könnte. Hier wird es allerdings schwierig. Das Entfernen von Elementen ist am einfachsten, dauert Complement
jedoch länger, wenn Sie eine der folgenden Optionen verwenden:
{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}
(Beachten Sie, dass wir uns nicht mehr Characters
auf das Ganze beziehen müssen, da Alphabet[]
es eine Liste von Buchstaben gibt, keine Zeichenfolge.)
Lassen Sie uns also diese Rechenaufgabe versuchen. Wenn wir das gesamte Alphabet als Produkt aus Buchstaben anstelle einer Liste darstellen, können wir aufgrund der Abbruchregel Buchstaben durch einfache Aufteilung entfernen. Das spart eine Menge Bytes, weil wir nicht brauchen Complement
. Außerdem "a""e""i""o""u""y"
ist eigentlich ein Byte kürzer als Characters@"aeiouy"
. Also machen wir das mit:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
Wo wir das Speichern der Konsonant und Vokal - Produkte in a
und b
dargestellt. Dies funktioniert, indem eine Funktion geschrieben wird, die alle Argumente mit ##
dem Produkt der Vokale multipliziert und durch dieses dividiert. Diese Funktion wird auf die Alphabet-Liste angewendet , bei der jeder Buchstabe als separates Argument übergeben wird.
So weit so gut, aber jetzt haben wir
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
als Argument dafür Tuples
, und diese Dinge sind immer noch Produkte, keine Listen. Normalerweise ist der kürzeste Weg, dies zu beheben, List@@@
der, die Produkte wieder in Listen umzuwandeln. Leider ist das Hinzufügen dieser 7 Bytes länger als der naive Ansatz.
Es stellt sich jedoch heraus, dass Tuples
die Köpfe der inneren Listen überhaupt nicht wichtig sind. Wenn Sie tun
Tuples[{f[1, 2], f[3, 4]}]
(Ja, für eine undefinierte f
.) Sie erhalten:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
So als hättest du List
statt f
. So können wir diese Produkte direkt weitergeben Tuples
und trotzdem das richtige Ergebnis erzielen. Dies spart 5 Bytes gegenüber dem naiven Ansatz mit zwei fest codierten Zeichenfolgen.
Jetzt "a""e""i""o""u""y"
ist das noch ziemlich nervig. Aber warte, wir können auch hier ein paar Bytes sparen! Die Argumente unserer Funktion sind die einzelnen Buchstaben. Wenn wir also nur die richtigen Argumente auswählen, können wir diese anstelle der String-Literale wiederverwenden, die für drei von ihnen kürzer sind. Wir wollen Argumente #
(kurz für #1
) #5
, #9
, #15
, #21
und #25
. Wenn wir #
am Ende setzen, müssen wir auch keine hinzufügen *
, um sie zu multiplizieren, da (regex) #\d+
ein vollständiges Token ist, an das keine Nicht-Ziffern angehängt werden können. Daher #5#9#15#21#25#
sparen wir am Ende weitere 4 Bytes.