Zielsetzung
Aus Wikipedia :
Ein rekursives Akronym ist ein Akronym, das sich in dem Ausdruck, für den es steht, auf sich selbst bezieht.
Ihr Ziel ist es, zu überprüfen, ob eine Zeichenfolge ein rekursives Akronym ist.
- Das Akronym ist das erste Wort
- Bei Wörtern wird nicht zwischen Groß- und Kleinschreibung unterschieden. Sie werden durch ein einzelnes Leerzeichen getrennt.
- Die angegebene Zeichenfolge enthält weder Interpunktion noch Apostroph.
- Nur der erste Buchstabe jedes Wortes kann Teil des Akronyms sein.
Sie müssen auch die Funktionswörter angeben . Zur Vereinfachung kann jedes Wort als Funktionswort betrachtet werden.
Beispiel
f("RPM Package Manager") => { true, [] }
f("Wine is not an emulator") => { true, ["an"] }
f("GNU is not Unix") => { true, ["is"] }
f("Golf is not an acronym") => { false }
f("X is a valid acronym") => { true, ["is","a","valid","acronym"] }
Sie können ein vollständiges Programm oder eine Funktion angeben.
Die Eingabezeichenfolge kann aus STDIN oder als Funktionsargument übernommen werden.
Das Ausgabeergebnis kann wahr / falsch sein, 0/1, ja / nein ...
Die Liste der Funktionswörter (jedes Format der Liste ist gültig) muss genau dann angegeben werden, wenn dies ein rekursives Akronym ist (auch wenn die Liste leer ist). . Sie müssen die Großschreibung der Funktionswörter nicht beibehalten.
Gewinnkriterien
Dies ist ein Code-Golf , der kürzeste Code gewinnt.
Antworten:
GolfScript,
5150 ZeichenEs kann wahrscheinlich weiter Golf gespielt werden. Übernimmt die Eingabe für STDIN. Der Boolesche Wert ist 0/1.
Online testen
Erläuterung:
quelle
Regex, .NET-Version, 62 Byte
Sie können es hier testen . Wenn die Eingabe ein rekursives Akronym ist, ergibt dies eine Übereinstimmung, und die Erfassungsgruppe
w
enthält alle Funktionswörter. Wenn nicht, wird es keine Übereinstimmung geben.Dadurch wird die Groß- und Kleinschreibung der Funktionswörter beibehalten (die Groß- und Kleinschreibung wird jedoch nicht berücksichtigt ).
Leider hat der Tester nicht den gesamten Stapel von einer benannten Erfassung Gruppe angezeigt werden , aber wenn man es überall in .NET verwendet, die
w
Gruppe würde alle Funktionsworte enthält , um.Hier ist ein C # -Snippet, um dies zu beweisen:
Hier ist eine kurze Erklärung. Ich verwende die .NET- Bilanzgruppen , um
c
mit diesem Snippet einen Stapel der Akronymbuchstaben in der benannten Gruppe zu erstellenDer Trick ist, dass ich den zweiten Buchstaben oben auf dem Stapel und den letzten unten brauche. Also habe ich das alles in einen Lookbehind gesetzt, der der Position nach dem Akronym entspricht. Dies ist hilfreich, da .NET Lookbehinds von rechts nach links abgleicht und den letzten Buchstaben zuerst findet.
Sobald ich diesen Stapel habe, passe ich den Rest der Zeichenkette Wort für Wort an. Entweder beginnt das Wort mit dem Buchstaben oben auf dem Akronymstapel. In diesem Fall lösche ich diesen Brief aus dem Stapel:
Ansonsten passe ich das Wort trotzdem an und schiebe es auf den
w
Stapel, der dann alle Funktionswörter enthält:Am Ende stelle ich sicher, dass ich mit das Ende der Zeichenkette erreicht habe
$
und dass ich alle Buchstaben des Akronyms aufgebraucht habe, indem ich überprüfe, dass der Stapel leer ist:Teste es auf ideone.
quelle
Python (158, ohne Regex)
Es ist nicht so, dass ich Regex nicht mag. Es ist so, dass ich sie nicht kenne.
Oh, ich hatte auch eine ungolfed Version:
quelle
Python 2.7 -
131126 BytesErstellt eine Liste der Buchstaben im ersten Wort des Akronyms. Entfernen Sie dann für jedes Wort in der vollständigen Zeichenfolge das erste Element der Liste, die wir erstellt haben, wenn es mit dem ersten Buchstaben dieses Wortes identisch ist. Andernfalls fügen Sie dieses Wort zur Liste der Funktionswörter hinzu. Für die Ausgabe geben Sie
not a
Folgendes zurück (In Python ist jede Liste außer der leeren ListeTrue
-y und die Liste ist leer, wenn es sich um ein rekursives Akronym handelt) und die Liste ifnot a
.Vielen Dank an @ace, der mir geholfen hat, einen Fehler zu beheben / einige Bytes zu speichern.
quelle
SyntaxError: invalid syntax
am Ende derreturn
Zeile an.for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
was kürzer ist und nicht auf Registerkarten angewiesen ist. Was diereturn
Aussage betrifft, habe ich festgestellt,0if a else(1,f)
welche kürzer ist als dein Original.Python - 154 Zeichen
Erster Code Golf Versuch. Ich denke, dass Python nicht die beste Sprache dafür ist, wenn man die langen Schlüsselwörter bedenkt. Ich denke auch nicht, dass diese Funktion narrensicher ist. Es funktioniert für den OP-Eingang, aber ich bin sicher, ich könnte mir Ausnahmen ausdenken.
quelle
ECMAScript 6 (105 Byte):
Geben Sie die Funktion in die Browserkonsole von Firefox ein und rufen Sie die Funktion wie folgt auf:
quelle
The function words list ... must be given if and only if this is a recursive acronym
. Dies wird sie trotzdem alarmieren.Haskell - 287 Bytes
Nicht der kürzeste Eintrag (hey das ist Haskell, was hast du erwartet?), Aber trotzdem viel Spaß beim Schreiben.
Getestet mit
Erwartete Ausgabe
Ungolfed
quelle
JavaScript (ECMAScript 6) - 97 Zeichen
Tests:
quelle
Rebol - 133
Ungolfed:
Getestet mit:
Ausgabe:
quelle
Julia - 116 Bytes
Weniger Golf:
Am
0
Ende wird 0 ausgegeben. Andernfalls wird ein Array mit1
den folgenden Funktionswörtern ausgegeben . Beispielsweise:quelle
Brachylog , 29 Bytes
Probieren Sie es online!
Gibt die Funktionswörter über die Ausgabevariable aus, wenn die Eingabe ein rekursives Akronym ist, und schlägt fehl, wenn dies nicht der Fall ist.
Ohne die Funktionswörter ausgeben zu müssen (dies als reines Entscheidungsproblem behandeln zu müssen ), sind es nur 12 Bytes, da
∧Zt
sie für -3 fallengelassen werdenY
können, durch.
-1 ersetzt werden können und vor allem;0zpᵐz{ċ₂ˢ}ᵐZh
durch⊇
for ersetzt werden können eine satte -13:ḷṇ₁Xh.∧X⊇hᵐc
quelle
Cobra - 187
quelle
Rubin - 173
Könnte besser sein...
Aufruf der Funk:
Ausgabe :
quelle
Java - 195
Leider hat Java keine Tupel-Unterstützung eingebaut.
Dies ist also eine Klasse, die den Booleschen Wert in 'b' und die Funktionswortliste in 'x' speichert.
Hier ist die Funktion der Konstruktor der Klasse.
Prüfung
quelle
string[]
:null
bedeutet einfach falsch, leer bedeutet wahr undn
Elemente bedeuten wahr mitn
Funktionswörtern.Awk - 145
Prüfung:
quelle
Kaffeeskript - 144
Nennen Sie es zum Beispiel mit:
z "GNU is not Unix"
Das kompilierte JS:
Die Zeichenfolge wird in Wörter aufgeteilt und dann durch jedes Wort geschleift. Wenn das erste Zeichen des Wortes nicht mit dem nächsten im Akronym übereinstimmt, wird das Wort gespeichert. Ein Zähler (
g
) wird verwendet, um zu verfolgen, wie viele Wörter übersprungen wurden. Wenn die Anzahl der übersprungenen Wörter plus die Länge des Akronyms mit der Länge der Phrase übereinstimmt, stimmt diese überein. Geben Sie also 1 und die übersprungenen Wörter zurück. Wenn nicht, war es ungültig, geben Sie also 0 zurück.quelle
C # - 234
quelle
Python (108)
quelle