Für diese Herausforderung müssen Sie das Ruby- Abbrev
Modul in möglichst wenig Code implementieren .
Herausforderung
Die Eingabe erfolgt in einer beliebigen Sprache als Array (Array, Liste, Sequenz usw.) von Zeichenfolgen. Sie können eine Funktion schreiben oder durch Kommas getrennte Wörter in STDIN akzeptieren.
Sie müssen dann den Satz eindeutiger Präfixe für diese Zeichenfolgen berechnen. Dies bedeutet, dass Sie einen Hash (oder eine Karte, ein Objekt usw.) der Abkürzungen an ihre ursprünglichen Zeichenfolgen zurückgeben müssen.
Ein "Präfix" ist eine Teilzeichenfolge der ursprünglichen Zeichenfolge, die am Anfang der Zeichenfolge beginnt. Beispielsweise ist "pref" ein Präfix des Wortes "prefix".
Ein eindeutiges Präfix kann nur ein Wort bedeuten. Wenn Ihre Eingabe beispielsweise lautet
car,cat
,ca
handelt es sich nicht um ein eindeutiges Präfix, da dies entweder "Auto" oder "Katze" bedeuten kann.Die Ausnahme von dieser Regel ist, dass ein Wort immer ein Präfix für sich selbst ist. Wenn Sie beispielsweise Eingaben wie haben
car,carpet
,car:car
müssen Sie in Ihrer Ausgabe sein.
Sie können dann den Hash / map / object / etc zurückgeben. von Ihrer Funktion aus (oder tun Sie das Gleiche in Ihrer Sprache), oder drucken Sie es
key:value
paarweise in Form von an STDOUT ausf:foo,fo:foo,...
. (Die Schlüssel-Wert-Paare können auch durch Leerzeichen getrennt werden, wenn dies Ihren Code verkürzt.)
Testfälle
Input code,golf,going
Output c:code,co:code,cod:code,code:code,gol:golf,golf:golf,goi:going,goin:going,going:going
Input pie
Output p:pie,pi:pie,pie:pie
Input pie,pier,pierre
Output pie:pie,pier:pier,pierr:pierre,pierre:pierre
Input a,dog
Output a:a,d:dog,do:dog,dog:dog
Regeln
Die Eingabe enthält keine doppelten Elemente.
Ihre Ausgabe kann in beliebiger Reihenfolge erfolgen. du musst es nicht sortieren.
Sie dürfen keine eingebauten
Abbrev
Module / Funktionen / Dinge wie Ruby's verwenden.Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
key:value\nkey:value\nkey:value
...?Antworten:
APL (46)
(Ja, der APL-Zeichensatz passt in ein Byte und bietet ausreichend Platz.)
Dies ist eine Funktion, die eine Liste von Zeichenfolgen verwendet und eine 2-mal-N-Matrix zurückgibt, wobei jede Zeile ein eindeutiges Präfix und das Wort enthält, zu dem sie gehört:
Erläuterung:
∆←⍵
: Speichere das richtige Argument in∆
.{↑∘⍵¨⍳⍴⍵}¨∆
: Für jedes Element von∆
erhalten Sie die möglichen Präfixe dieses Elements:⍳⍴⍵
: bekomme eine Liste von1
bis zur Länge von⍵
↑∘⍵¨
: Holen Sie sich für jede dieser Zahlen so viele Elemente aus⍵
.∪⊃,/
: verketten Sie die Listen und nehmen Sie die eindeutigen Werte.{
...}¨
: für jedes der eindeutigen Präfixe:∆/⍨⊃¨⍵∘⍷¨∆
: Wählen Sie die Wörter aus, die mit diesem Präfix beginnen(⊂⍵),
: auch das Präfix einschließen und verketten∆/⍨2=⍴∆←
: gib die Liste nur zurück, wenn es zwei Elemente gibt (das Präfix und ein passendes Wort)↑
: verwandle die Liste der Tupel in eine Matrixquelle
Python 2.7 -
146141 BytesBeachten Sie, dass die Einrückung in den Zeilen 4 und 5 nicht 4 Leerzeichen beträgt. Dies ist ein Nebeneffekt des SE-Markdown-Interpreters. Das ist ein buchstäbliches Tabulatorzeichen, also nur ein Byte.
Dies entspricht technisch nicht den Vorgaben, aber ich werde es ändern, wenn Doorknob dies klarstellt. Es werden Zeilenumbrüche anstelle von Kommas verwendet, um die Ausgabe zu trennen. Beispielsweise:
Neu: Ich konnte 5 Zeichen loswerden, indem ich die Zeichenfolge, die ich überprüfe, einer Variablen zuordnete
e
. Das bedeutet , dass ich nur eingeben müssen ,e
anstattw[:a]
dreimal. Es bedeutet auch , speichere ich Zeichen , indem Siee=w[:a+1]
und Wechsel...range(1,len(w)+1)
zurange(len(w))
.Erläuterung:
quelle
sum(b.startswith(e) for b in l)
anstelle vonlen(filter(lambda b:b.startswith(e),l))
b.startswith(e)
aufb.find(e)==0
oder kürzenb[:a+1]==e
und<2
stattdessen die Anzahl überprüfen==1
.e=""\n for a in w:\n\te+=a
anstattfor a in range(len(w)):\n\te=w[:a+1]
10 Zeichen zuJ - 47 Zeichen
J sieht Strings nur als Vektoren von Zeichen, was bedeutet, dass beim Versuch, eine Liste von Strings zu erstellen, tatsächlich eine Tabelle von Zeichen erstellt wird, sodass die Enden mit Leerzeichen aufgefüllt werden. Js Lösung hierfür heißt " Box" . Daher verwendet diese Funktion eine Box-Liste von Zeichenfolgen als Argument, um die Länge zu erhalten.
Außerdem fehlt J ein Hash-Typ, so dass er einer zweispaltigen Tabelle von Elementen am nächsten kommt, beispielsweise Strings in Boxen. Wenn das nicht akzeptabel ist und ich standardmäßig das Schlüsselwertformular verwenden muss, kann ich die Ausgabe in dieses Formular mit insgesamt 67 Zeichen umformatieren :
Erklärung durch Explosion:
Beispiele:
quelle
Haskell
9687Ungolfed-Version:
Beispiel:
Ich habe die
inits
Funktion verwendet, die alle Präfixe einer Liste / Zeichenfolge findet. Zählt es als Betrug?quelle
concatMap
durch(=<<)
, was im Prelude steht. Speichert 10 Zeichen.concatMap
aber ich kann nicht mehr als 9 Zeichen speichern.>>=\
als ein einziges Lexem. Entschuldigung ...Python 3 (97)
Wir iterieren über Präfixe jedes Wortes in der Eingabe und drucken das entsprechende Präfix / Wort-Paar, wenn es entweder genau einmal vorkommt oder zu einem ganzen Wort gehört. Wir nutzen das Kurzschlussverhalten von
or
(undprint
dessen Funktion), um nur dann zu drucken, wenn eine dieser Bedingungen erfüllt ist.Das
while
Schleife schneidet das letzte Zeichen wiederholt ab, um kürzere und kürzere Präfixe zu erstellen, die enden, wenn die leere Zeichenfolge verbleibt. Dies ist das einzige Mal, dass wir irgendetwas indizieren oder aufteilen.Wir zählen die Vorkommen des Präfixes
e
in der Eingabe, indem wir die ursprüngliche durch Kommas getrennte EingabezeichenfolgeS
nach Teilzeichenfolgen durchsuchen','+e
. Wir stellen der Eingabezeichenfolge vorab ein Komma voran. Dieser Zusatz bewirkt ein zusätzliches leeres Zeichenkettenelement, wenn wirsplit
, das jedoch keine Auswirkung hat, da es keine nicht leeren Teilzeichenfolgen enthält.Um zu überprüfen, ob die Teilzeichenfolge
e
das ganze Wort istw
, vergleichen wir sie mit dem Zeichenfolgenvergleichsoperator. Dies wird lexikografisch verglichen, sodass kürzere Präfixe kleiner sind. Der Doppelvergleich schlägt fehl, wenn entwedere==w
oderS.count(c+e)<2
.Wenn das Drucken von Ausgaben im Formular
e,w
zulässig wäre, würde ich ein Zeichen durch Schreiben speicherne+c+w
stattdessen .Gutschrift an undergroundmonorail, aus deren Antwort ich meine gesamte Codestruktur ableitete.
quelle
(e<w)*S.count(c+e)>1
kann golfen werdene<w<w*S.count(c+e)
, um 2 Zeichen zu speichern.Ruby, 114
Ungolfed:
quelle
k4 (70)
nicht besonders golfen; Ich bin sicher, es könnte kürzer sein
ziemlich ähnlich dem J impl. oben denke ich - sammelt im Grunde nur alle (richtigen) Präfixe, entfernt die Wörter aus den Präfixen wieder (um den
"car"
/"carpet"
case zu behandeln), gruppiert sie in Äquivalenzklassen, wählt die Klassen mit nur einem Element aus, reduziert sie von Listen auf Zeichenfolgen und fügt in der Map Zeichenfolgen zu sich selbst hinzu.einige Testfälle
Beachten Sie, dass in
k
/q
eine Zeichenfolge eine Liste von Zeichen ist. Daher muss eine Zeichenfolge, die nur ein einzelnes Zeichen enthält, mit der unären,
Funktion als solche gekennzeichnet werden . & mmwrt eine Liste von Zeichenketten, die nur eine einzige Zeichenkette enthaltenDiese verwenden
q
dieshow
Funktion, die für einige Datenstrukturen eine integrierte Formatierung aufweist, um die Ergebnisse besser lesbar zu machen:quelle
JavaScript - 212
Anfängliches Golf.
Eingang:
code,golf,going
Ausgabe:
["c:code", "co:code", "cod:code", "code:code", "gol:golf", "golf:golf", "goi:going", "goin:going", "going:going"]
quelle
Perl,
9377Mit Zeilenumbrüchen und Einrückung zur besseren Lesbarkeit:
Ein bisschen zu spät und zu lang, aber ich bin froh, dass es endlich unter 100 ist. Die Funktion gibt eine Liste zurück, die einer Hash-Variablen zugewiesen werden kann:
und
Tatsächlich ist die zurückgegebene Liste noch nicht gefiltert - die Hash-Konstruktion ist zum Zeitpunkt ihrer Zuweisung abgeschlossen, dh außerhalb der Funktion. WENN es nicht sauber / fair genug ist, addieren Sie 3, um den Inhalt der Funktion zu zählen, und setzen Sie ihn in geschweifte Klammern
+
.quelle
F: 44 Bytes
ANMERKUNGEN
Q-Sprache hat einen inneren Kern, der intern als K4 bezeichnet wird (in dieser Antwort und einer anderen vorherigen Antwort auf diese Frage verwendet).
Laden Sie zum Testen des Codes den Interpreter herunter (kx.com, kostenlos für nicht kommerzielle Zwecke, Unterstützung für Windows, Linux, Mac).
Interpreter lässt zwei Syntax zu:
ausführlicher (lesbarere Namen, eindeutige Namen für moands und diads, mehr Bibliotheken, ...). Laden Sie die Quelldatei mit der Erweiterung q oder mit einem interaktiven Interpreter
kompakt (funktionaler innerer Kern, Ein-Buchstaben-Operatoren, gleicher Buchstabe für beide Verwendungszwecke Monade / Diade, ...). Laden Sie die Quelldatei mit der Erweiterung k oder den interaktiven Interpreter im Modus k (schreiben Sie \ an der Eingabeaufforderung). Code muss in diesem Modus getestet werden
Der Code definiert ein Lambda (anonyme Funktion). Um der Funktion einen Namen zu geben, benötigen wir das Präfix name: (ex f: {..}), also 46 Bytes
PRÜFUNG
(angenommene benannte Funktion: Ersetzen Sie ansonsten den Code durch f)
Gibt ein Wörterbuch zurück (Syntaxschlüssel! Werte). Tasten sind eine Liste von Symbolen (`symb`symb ..) und Werte eine Liste von Symbollisten. Wenn wir die Sentente am interaktiven Interpreter ausführen, haben wir eine bequemere Darstellung (jeder Schlüssel und zugeordnete Werte in einer anderen Zeile)
ERLÄUTERUNG
x
ist das implizite Argument zum Lambda$x
Symbolliste in Stringliste konvertieren(-1_)\
Durchläuft jedes Element der Symbolliste(Liest wie für jede Zeichenfolge berechnet Präfixe (beim Essen Iteration löscht das letzte Zeichen der Zeichenfolge (-1_), bis leere Zeichenfolge)
$
wird wieder in eine Symbolliste umgewandelt (Liste aller Präfixe)p:
und weist zu p,/
raze all (verkettet und erstellt eine einstufige Struktur)=
classify -> ordnet jedem eindeutigen Präfix die entsprechenden Wörter zu#:'
berechnet die Länge (Anzahl der Wörter, die jedem Präfix zugeordnet sind)1=
true, wenn length = 1 (eindeutig), andernfalls false&
Wobei -> Index der wahren Elementep in\:
Bestimmt für alle Präfixe, ob sie ein eindeutiges Präfix haben(..)'
gilt (..) für jeden Wert rechts (eindeutiges Präfix)?0,&:
-> eindeutige 0 verkettet wo (um Wörter als Präfix von sich selbst zu bewältigen)p@
Indizes in Symbole umwandelnx!..
Konstruiere ein Wörterbuch mit x (Wörtern) als Schlüssel und .. als WertenGelesen als:
Erstellt ein Wörterbuch und gibt es mit den Wörtern als Schlüssel und Werten zurück.
... Werte von Indizes an unterschiedlichen Positionen 0 (alle Wörter) und mit eindeutigem Präfix
... eindeutig berechnet als Präfixe, die nur bei einem Wort vorkommen (Wortliste, die jedem Symbol zugeordnet ist, hat die Länge eins)
... Listen, die sich aus der Klassifizierung aller eindeutigen Symbole mit den entsprechenden Wörtern ergeben
... Präfixe, die durch Wiederholen des letzten Zeichens jedes Wortes berechnet werden
quelle
PHP 7.0, 67 Bytes (nach der Challenge)
Nimmt Eingaben von Befehlszeilenargumenten entgegen. druckt ein Komma nach; renn mit
-nr
.Fügen Sie für neueres PHP ein Byte hinzu: Ersetzen
&a
durch""<
.Verwenden Sie für älteres PHP diese 70 Bytes:
PHP, 70 Bytes
quelle
Brachylog , 23 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als Liste über die Eingabevariable und generiert eine Liste von
[key, value]
Paaren über die Ausgabevariable. Jede Eingabezeichenfolge, die kein Präfix einer anderen Eingabezeichenfolge ist, wird zweimal als Präfix von sich selbst generiert, obwohl der Header von TIO dies verbirgt, indem er verwendetᵘ
, um die vollständige Liste zu erhalten, anstattᶠ
.quelle
{}ᵘ
, es sei denn, es gibt eine kürzere Möglichkeit, um entweder auszuschließen, dass ein Formular ein Präfix für sich selbst ist, oder jedes erforderliche Ausgabepaar ohne die zusätzliche Regel zu generieren∋gj
.Perl 5
-a
, 76 BytesProbieren Sie es online!
quelle
APL (Dyalog Classic) , 38 Byte
danke Erik the Outgolfer, der mich daran erinnert hat, eine Einzelbyte-Zeichenkodierung zu verwenden
Probieren Sie es online!
quelle
Python (127)
Also konnte ich @undergroundmonorail nicht kommentieren, aber ich dachte, dass ein Wörterbuchansatz besser wäre? Ich bin mir sicher, dass es mit einigem Listen- / Wörterbuchverständnis auch enorm reduziert werden könnte, aber es kann nicht funktionieren, wenn man aus dem Diktat herausspringt.
Der Ausdruck gibt das Wörterbuch ungeordnet aus.
EDIT: Ahh ich habe das Auto verpasst: Auto / Auto: Teppich Kriterien. Vielleicht eine Längenprüfung?
quelle
Groovy - 212 Zeichen
Golf gespielt:
Beispielausgabe:
Ungolfed:
quelle
JavaScript (Node.js) , 88 Byte
Probieren Sie es online!
quelle
Zsh , 95 Bytes
Probieren Sie es online!
Die einzige Möglichkeit, ein assoziatives Array in Bash / Zsh "zurückzugeben", besteht darin, es ohne das
local
Schlüsselwort zu deklarieren und dann im übergeordneten Bereich darauf zuzugreifen. Dies würde ein Byte sparen. I / O über Variablen ist jedoch im Allgemeinen verpönt, sodass wir stattdessen die Array-Definition drucken.quelle
Rubin , 84 Bytes
Ich habe gerade bemerkt, dass es bereits eine Ruby-Lösung gibt. Dies verbessert im Wesentlichen die alte Lösung, indem Präfixe intelligenter ausgewählt werden (ohne dass jedes Wort am Ende als "Präfix" hinzugefügt werden muss) und Präfixe gezählt werden, um die Eindeutigkeit zu überprüfen, bevor sie zum Hash hinzugefügt werden, anstatt den Wert mit zu überschreiben ein Dummy, wenn es ein Duplikat gibt und dann den Eintrag löscht.
Probieren Sie es online!
quelle