Ihre Aufgabe ist es, ein Programm zu schreiben, das alle fünf Buchstaben eine lesbare Liste von Wörtern mit der folgenden Struktur ausgibt:
Konsonant - Vokal - Konsonant - Vokal - Konsonant
Die Ausgabe sollte alphabetisch mit einem Wort pro Zeile sortiert und keine Wörter zweimal wiederholt werden. Es kann Klein- oder Großbuchstaben sein, aber nicht gemischt. Die Liste könnte also so beginnen und enden:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
Vokale sind a - e - i - o - u - y , die anderen 20 Buchstaben des englischen Alphabets sind Konsonanten.
Wörter müssen keine echten Wörterbuchwörter sein.
Kürzester Code gewinnt.
Hinweis: Vor ein paar Jahren bin ich auf ein Programm auf einer Universitätswebsite gestoßen, das genau das getan hat. Es stellte sich heraus, dass mein Vor- und Nachname der cvcvc-Einschränkung entsprach, und ich hatte mich selbst gegoogelt.
Antworten:
Mathematica,
726561 BytesZum 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: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, dauertComplement
jedoch länger, wenn Sie eine der folgenden Optionen verwenden:(Beachten Sie, dass wir uns nicht mehr
Characters
auf das Ganze beziehen müssen, daAlphabet[]
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 alsCharacters@"aeiouy"
. Also machen wir das mit:Wo wir das Speichern der Konsonant und Vokal - Produkte in
a
undb
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
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(Ja, für eine undefinierte
f
.) Sie erhalten:So als hättest du
List
stattf
. So können wir diese Produkte direkt weitergebenTuples
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.quelle
Tuples
Trick. Das ist völlig undokumentiert, oder? Und unerwartet angesichts dessen, wie das FormularTuples[list,n]
mit zwei Eingaben damit umgeht,list
keinenList
Kopf zu haben (zumindest für mich)!List
. Der Kopf auf jeder Ebene in den von generierten Arrays istTuples
derselbe wie der Kopf der Liste .Tuples[f[{1,2}, {3,4}]]
der Tat gibt es{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
stattdessen. Es ist nicht dokumentiert, dass der innere Kopf vollständig ignoriert wird.Perl, 47 Bytes
Zähle den Shebang als einen.
Probieren Sie es online!
quelle
say
?-M5.01
dies "frei" sein sollte.-M5.010
. Und der interessante Teil beim Golfen ist nicht zu ersetzenprint
durchsay
...-E
(und spätersay
) ein Werbegeschenk?Python 3 - 110 Bytes
Unkomplizierter Looping-Spaß :)
quelle
Ruby,
72 7152 BytesVielen Dank an Value Ink für die Grundidee, die das auf 60 Bytes reduziert hat.
quelle
grep
. Wenn Sie einen Bereich generieren, der Zeichenfolgen in Kleinbuchstaben verwendet, wird nur eine Folge von Wörtern in Kleinbuchstaben angezeigt.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
für 60 Bytes05AB1E ,
1816 Bytes05AB1E verwendet die CP-1252- Codierung.
Erläuterung
Zu Testzwecken empfehle ich, durch
žP
ein paar Konsonanten undžO
ein paar Vokale zu ersetzen .Beispiel mit 5 Konsonanten und 3 Vokalen
quelle
Python 2 ,
12010294 BytesProbieren Sie es online!
quelle
Pure Bash, 74
Einfache Klammererweiterung.
Probieren Sie es online aus .
Wenn jeder Artikel in einer eigenen Zeile stehen muss, haben wir:
Pure Bash, 84
quelle
PHP,
88868480 Byteshübsches Zeichenketteninkrement :)
6 Bytes, die von @Christoph gespeichert wurden
Durchläuft alle Zeichenfolgen von
bababa
biszyzyz
und prüft, ob sie mit dem Muster übereinstimmen. Laufen Sie mit-nr
.quelle
$a="001";$a++;
irgendwann eine implizite Umwandlung in eine Ganzzahl eingebettet haben . Das war eine sehr unbequeme Änderung.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
spart dir 1 char. Leider müssen Sie das Echo ändern, um es zu drucken&&
. Das Ersetzen\n
durch einen echten Zeilenumbruch spart einen anderen."#([^$v][$v]){2}[^$v]#"
aber ich habe es nicht getestet.([^$v][$v]){2}[^$v]
funktioniert nicht in der Schleife, während[^$v]([$v][^$v]){2}
tut. Beide arbeiten unabhängig voneinander (auch mit der Variablen).MATL , 21 Bytes
Probieren Sie es online! (aber die Ausgabe wird abgeschnitten).
quelle
11Y2'y'h2Y2yX~yyy&Z*
( Online ausprobieren! )vcvcv
Muster nichtcvcvc
wie gewünscht. Trotzdem danke!Python, 92 Bytes
Kann nicht
itertools
gewinnen lassen. Iterativ ist in Python 2 1 Byte länger.quelle
Haskell,
5451 BytesmapM func list
Bildet alle Wörter, indem die möglichen Zeichen für den Index i aus der von zurückgegebenen Liste genommen werdenfunc (list!!i)
.Edit: @xnor hat 2 Bytes zum Speichern gefunden und als ich seine Lösung ansah, habe ich eine andere gefunden.
quelle
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
Speichert ein Byte.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
odermapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Es wäre schön, die Vokale und Konsonanten nicht hart zu kodieren,mapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
schafft es aber nicht ganz.cycle
Ihre erste Variante durch eine explizite Rekursion ersetzen, wird ein zusätzliches Byte gespeichert.Brachylog , 18 Bytes
Probieren Sie es online!
Erläuterung
quelle
g
undb
, aber beim Testen,j
scheint dies, weil es sich zu weigern scheint, eine Liste von Zeichenfolgen als Eingabe zu nehmen?:ea
zeigt jedoch wirklich die Stärken von Prolog / Brachylog und ist ein Schritt, den die meisten anderen Sprachen viel schwieriger finden.g
undb
gebraucht wurden.j
scheint fehlerhaft zu sein, und dies ist wiederum auf die Schwierigkeit zurückzuführen, eine Liste von Argumenten von nur einer Liste zu unterscheiden. Ich könnte dies beheben, obwohl dies die Implementierung noch einmal komplizieren wird. Ich könnte es genauso gut einfach nicht beheben und meine Zeit darauf verwenden, das Kernproblem in einer neuen Version von Brachylog zu beheben.JavaScript (ES6),
91 bis90 ByteBearbeitungen
for
AnweisungErläuterung
Dies definiert eine 5-tiefe rekursive Funktion, die anhand der Parität der Aufruftiefe bestimmt, ob Vokale oder Konsonanten durchlaufen werden sollen. Bei jeder Iteration wird geprüft, ob eine Rekursion oder ein Ausdruck erforderlich ist, indem die Anzahl der verbleibenden Rekursionen überprüft und der Buchstabe der aktuellen Iteration bis zum Ende der 5-Zeichen-Zeichenfolge verkettet wird, die derzeit mit der Tiefe zuerst erstellt wird.
Alternative 89-Byte-Lösung mit ISO8859-1-Codierung:
Alternative 96-Byte-Lösung, die die gesamte Ausgabe als einzelne Zeichenfolge zurückgibt:
Laufen Sie auf eigenes Risiko. Verwenden Sie
f()
für die 91-Byte-Lösung einfach und für die 97-Byte-Alternativeconsole.log(f())
.quelle
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
Verwendung des Standardformulars ist leider ein Byte länger:function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
Warten Sie immer noch auf den Tag, an dem ein Generator die kürzeste Option ist ...for...of
Anweisung entfernen , um ein Byte zu speichernC
201199186184183169163 BytesMach es ein bisschen anders als mit der vorherigen grundlegenden Zählmethode:
Ungolfed:
Und etwas konventioneller geschrieben:
Grundsätzlich sind i die Zähler und s das String-Array, das alle Zeichen enthält, über die wir für jeden Zähler iterieren sollten. Der Trick ist die innere while- Schleife: Sie dient zum Inkrementieren der Zähler, beginnend mit dem ganz rechten. Wenn wir sehen, dass das nächste anzuzeigende Zeichen das Endzeichen null ist, starten wir den Zähler erneut auf null und der "Übertrag" wird an den nächsten Zähler weitergegeben.
Danke Cristoph!
quelle
char *c
Ich denke, der Platz ist unnötig.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
bringt dich auf 177. Komm schon, du kannst es noch besser machen;).i[5]={0}
statti[]={0,0,0,0,0}
spart 7 Bytes.Perl, 71 Bytes
Probieren Sie es online!
Erläuterung
Ich werde später weitere Erklärungen hinzufügen.
map{push@{1+/[aeiouy]/},$_}a..z;
Erstellt zwei Arrays:@1
Enthält die Konsonanten und@2
enthält die Vokale.glob
Beim Aufruf mit Argumenten wie werden{a,b}{c,d}
alle Permutationen der Elemente in geschweiften Klammern zurückgegeben.quelle
Befunge, 95 Bytes
Probieren Sie es online! Beachten Sie jedoch, dass die Ausgabe abgeschnitten wird.
Dies ist nur eine Schleife über den Bereich von 0 bis 287999, die den Index als gemischte Zahl 20-6-20-6-20 ausgibt, wobei die "Ziffern" der Zahl aus den Tabellen in den letzten beiden Zeilen abgerufen werden.
quelle
Perl 6 , 70 Bytes
Erklärung des interessanten Teils:
Der Code davor erzeugt nur die Liste der Vokale (
$_
) und die Liste der Konsonanten (c
), was leider sehr ausführlich ist.quelle
Python 2 ,
120 -117 BytesDanke an @WheatWizard für den Tabs-Tipp.
Probieren Sie es online!
Ich bin mir nicht sicher, ob man damit viel Golf spielen kann. Try it online schneidet bei 128 KB ab, zeigt aber genug, um eine Idee zu geben. Ein lokaler Lauf mit Debug-Code zum Zählen der Wörter ergab insgesamt 288000. Läuft in etwa 45 Sekunden, wenn jemand testen möchte.
Nicht konforme und daher nicht konkurrierende Version (druckt verschachtelte Arrays anstelle des angegebenen Formats aus) für 110 Bytes:
quelle
Perl 6, 53 Bytes
Es dauert etwas, bis die Ausgabe erfolgt. Sehr ineffizient. Macht den Job.
quelle
xeger , 49 bytes
Bei einem regulären Ausdruck generiert xeger einfach alle übereinstimmenden Zeichenfolgen. Um den Browser nicht zu beenden, werden alle 1000 Ausgaben angehalten, und Sie müssen auf klicken, um fortzufahren. Er wird jedoch irgendwann dort ankommen.
Hier ist eine 23-Byte-Version mit einem Fehler
^
behoben:Dies sind die Zeichenklassen "Alle ASCII-Kleinbuchstaben-Konsonanten"
[:c]
mity
Ausnahme^y
und "Alle ASCII-Kleinbuchstaben-Vokale"[:v:]
mity
Hinzufügung.quelle
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 Byte
Gibt ein Array von Zeichenfolgen zurück. Sehr schnelle Version für
102101 (1 Byte dank @ETHproductions) Bytes:quelle
CJam ,
32312928 Bytes2 Byte dank Martin Ender und 1 Byte dank kaine gespeichert
Probieren Sie es online! (Beachten Sie, dass der Ausgang bei TIO abgeschnitten wird.)
Erläuterung
quelle
'{,97>
um das Alphabet zu bekommen. Und dann"aeiouy"_'{,97>^
, um ein weiteres Byte zu speichern1$
.Gestapelt, nicht konkurrierend, 51 Bytes
Ziemlich einfach. Probieren Sie es hier aus!
quelle
Perl,
635954 BytesProbieren Sie mal Perl Golf.
EDIT: Sieht so aus, als hätte ich noch viel zu lernen ... :)
quelle
/$b[^$a]/&&say for"a"x5.."z"x5
, um ein paar Bytes zu sparen. Bearbeiten: und Sie können die fallen$b
und tun$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Da Ihr Regex nach 5 Zeichen sucht, können Sie dies auch tuna.."z"x5
.$a
und$b
Variablennamen wie, weil diese nicht braucht , um auch im strikten Modus deklariert werden ... :) ich auch Perl 6 verwende viel in diesen Tagen, die nicht einmal haben einen nicht-Strict - Modus.Scala,
87-86Bytesquelle
f"$c$d$e$f$g"
mit""+c+d+e+f+g
einem Byte zu speichern.R
143132 BytesDies ist mein erster Versuch, Code Golf zu spielen. Ich würde mich über Vorschläge freuen, ihn weiter zu reduzieren. Bisher ist das alles ziemlich normal R; Das einzig mögliche Problem dabei ist, dass paste0 seine Argumente auf die Länge des längsten zurückführt.
Edit: Verwendeter Zuordnungstrick von rturnbull, ersetzt
sapply(x,length)
durchlengths
.quelle
R
11198 BytesHinzugefügt
y
als Vokal und golfed aus 13 Bytes, dank @Patrick B.Wir
expand.grid
generieren alle möglichen Kombinationen vonV
undC
in einer Matrix, die wir aus der voreingestellten Variablenletters
(dem Alphabet) definieren. Wir kehren die Kombinationen um (standardmäßig dreht sich die erste Variable am schnellsten), um die alphabetische Reihenfolge sicherzustellen. Dann durchlaufen wir jede Zeile der Matrix und drucken jeden Buchstaben auf stdout. Mit diesemfill
Argumentcat
stellen wir sicher, dass jedes Wort in einer neuen Zeile beginnt.quelle
Clojure, 101 Bytes
Nicht so aufregend ...
quelle
Ruby,
6561 BytesGanz anderer Ansatz:
Neue Dinge habe ich gelernt , heute: das Array # Produkt - Funktion
quelle
C 361 Bytes
Ungolfed-Version:
Es muss einen Weg geben, dies definitiv zu verkürzen.
Erläuterung
quelle