Tor:
Erstellen Sie bei einem vorgegebenen Array von Zeichenfolgen abgekürzte Versionen jeder Zeichenfolge.
Spezifikation:
Bei dieser Herausforderung besteht eine Abkürzung aus den ersten N Zeichen einer Zeichenfolge. Für die Zeichenfolge abc
: a
, ab
, und abc
sind alle gültigen Abkürzungen, während bc
, und ac
ist es nicht.
Bei einem vorgegebenen Array von Zeichenfolgen möchten wir den kürzesten Satz von Abkürzungen finden, sodass Sie anhand der Eingabe und aller Abkürzungen bestimmen können, auf welches Element der Eingabe sich die Abkürzung bezieht.
Beispiel:
Eingang: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
Wir arbeiten uns durch die Saiten, beginnend mit der ersten.
Montag ist nur die Elementzeichenfolge mit einem
M
, daher ist die kürzestmögliche AbkürzungM
.Der Dienstag beginnt mit
T
, der Donnerstag auch. Dies bedeutet, dass wir die Zeichenfolge versuchenTU
. Da damit keine anderen Zeichenfolgen beginnen, verwenden wirTU
.Mittwoch ist
W
, Donnerstag istTh
und Freitag istF
.
Mehr Beispiele:
Input: "one,two,three,four,five,six,seven"
Output: "o,tw,th,fo,fi,si,se"
Input: "red,orange,yellow,green,blue,purple"
Output: "r,o,y,g,b,p"
Input: "a,ab,abc"
Output: Not valid! No abbreviation for `a` that doesn't apply to the other items.
Anmerkungen:
Sie geben auf jede vernünftige Weise Daten ein und aus.
Sie können davon ausgehen, dass die Eingabe immer ein gültiges Array von Zeichenfolgen ist.
Sie können davon ausgehen, dass es anders als im letzten Testfall immer eine Lösung geben wird.
Zeichenfolgen bestehen nur aus druckbarem ASCII (oder den druckbaren Zeichen in Ihrer Kodierung)
Das ist Codegolf, also gewinnen die wenigsten Bytes!
U
für Dienstag, ein Kleinbuchstabeh
für Donnerstag verwendet.Antworten:
Retina , 29 Bytes
Eingabe und Ausgabe sind durch Zeilenvorschub getrennte Listen von Zeichenfolgen.
Probieren Sie es online! (Testsuite mit Kommatrennung zur Vereinfachung.)
Erläuterung
Dies ordnet einfach alle Präfixe einem einzelnen Regex zu und druckt sie aus (
!
).m
unds
sind die üblichen Regex-Modifikatoren, um^
Zeilenanfänge und.
Zeilenvorschübe abzugleichen.quelle
Python 2 ,
87-86BytesProbieren Sie es online!
quelle
lambda a:[[b[:i]for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2][0]for b in a]
für 85 Byteslen(b)
durch4**8
speichert 2 weitere Bytes, vorausgesetzt, dass Zeichenfolgen nicht länger als 65536 Zeichen sein werdenJavaScript (ES6),
81787470 ByteNimmt Eingaben als ein Array von Zeichenfolgen.
Formatiert und kommentiert
Testfälle
Code-Snippet anzeigen
quelle
reduce
.Jelly , 14 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Haskell , 48 Bytes
Probieren Sie es online!
f
ist die Hauptfunktion, eine Liste vonString
s zu erstellen und a zurückzugebenString
. Seine Definition ist eine monadische Abkürzung fürf a=map (a#) a
.a#x
schaut sich die Zeichenkettex
und die Liste ana
und versucht, das kürzeste Präfix zu finden, in demx
es eindeutig ista
. Wenna
ein einzelnes Element vorhanden ist, verwenden Sie einfach die leere Zeichenfolge. Wenna
es sich nicht bereits um ein einzelnes Element handelt, hacken Sie das erste Zeichen von abx
, filtern und hacken Sie die Elemente,a
die mit demselben Zeichen beginnen, und wiederholen Sie den Vorgang.quelle
Mathematica, 64 Bytes
quelle
Jelly ,
1412 BytesProbieren Sie es online!
Wie es funktioniert
quelle
C ++ 11 (MinGW), 198 Bytes
Rufen Sie an mit:
Das Hinzufügen eines
void
Bezeichners vor der Funktion sollte dazu führen, dass sie auch auf anderen Compilern kompiliert wird, wodurch die Länge um 5 Byte erhöht wird.quelle
void f...
, es does't Arbeit sonst ... + 5 Bytes, leider. Funktionen, soweit ich weiß, brauchen Typspezifizierer in C ++Javascript ES6, 70 Zeichen
quelle
PHP,
131 120 119118 BytesDanke @ Jörg für
preg_grep
.Nimmt Eingaben von Befehlszeilenargumenten entgegen. druckt die Ergebnisse jeweils eine Zeile.
Laufen Sie mit
-nr
oder versuchen Sie es online .-
.+15 Bytes zum Reparieren: Ersetzen Sie die Sekunde
$argv
durcharray_slice($argv,1)
.a&
durch""<
(+1 Byte), um den Fehler zu beheben.Legen Sie
&($t.=$c)
vor&&
und ersetzen". preg_quote($t.=$c)."
mit$t
.Nervenzusammenbruch
Nicht-Regex-Version,
131130 BytesErsetzen Sie das erste und das letzte
a&
mit""<
(+2 Bytes), um PHP 7.1 zu reparieren.Nervenzusammenbruch
ganz uninteressant hinweis:
strstr($u,$t)==$u
und0===strpos($u,$t)
haben die gleiche länge und das gleiche ergebnis.quelle
0x0A
stattdessen ein echtes Newline-Zeichen ( )\n
, um ein Byte zu sparen.PHP, 127 Bytes
funktioniert nicht mit ungültigen Arrays
PHP, 132 Bytes
Online Version
151 Bytes unterstützt Sonderzeichen
PHP, 140 Bytes
quelle
preg_quote
Make nur 10 Bytes mehr hinzufügen0
. Mit können Sie aber ein Byte sparen$i=+$s=""
.count()-count()
Zeug entfernen : Eingabe ist garantiert gültig (-21 Bytes). Ich denke, ich könnte das beheben und auf 120 Bytes reduzieren.$_GET
war eine gute idee!Clojure, 118 Bytes
Dies funktioniert bei Präfixen bis zu einer Länge von,
1e2
aber die gleiche Byteanzahl kann bis zu unterstützen1e9
.i
Loops Längen von Präfixen,S
ist die Folge von Teilzeichenfolgen der Längei
. Der letztefor
ersetzt die Unterzeichenfolgen,nil
die öfter als einmal vorkommen. Die Reduzierung behält den ersten Nicht-Null-Wert für jede Zeichenfolge bei. Schade, dassor
es sich nicht um eine Funktion handelt, also musste ich sie umbrechen.Dies gibt tatsächlich Listen mit Listen von Zeichen wie
((\M) (\T \u) (\W) (\T \h) (\F))
, aber ich denke, es ist akzeptabel. Clojure ist ziemlich ausführlich mit Streichern undsubs
würdeStringIndexOutOfBoundsException
anders werfentake
.Vollständige Beispiele:
quelle
SQL (PostgreSQL 9.4-Version), 219 Byte
Nun zur längsten Antwort :) Ich glaube nicht, dass dies Java schlagen könnte. Ich werde versuchen, ein paar mehr davon abzurasieren. Ich hoffe, eine der verschachtelten Abfragen loszuwerden, aber ich mag meine Chancen nicht.
Dies setzt voraus, dass es eine Tabelle gibt, die die zu bearbeitenden Zeichenfolgen enthält. Da dies SQL ist, kann nicht garantiert werden, dass die Reihenfolge der Rückgabe mit der Tabellenreihenfolge übereinstimmt. In diesem Fall ist dies unwahrscheinlich. Wenn dies ein Problem ist, werde ich löschen.
SQL Fiddle
Erklärung
Die innerste Abfrage verwendet
generate_series
und einenLATERAL
Join, um Zeilen für die Zeichenfolge zu erstellen, die in zunehmende Längen unterteilt sind, sodass aus "Eins" "O", "Ein", "Eins" wird. Die Anzahl der Zeichen in der Rückgabe wird ebenfalls beibehalten.Dann addieren wir die Anzahl der Datensätze, die das gleiche Ergebnis haben. Zum Beispiel 'f' von vier und fünf hat 2, aber 'fo' und 'fi' haben jeweils eine. Die
OVER
Anweisung in SQL kann sehr mächtig sein.COUNT(*)
wäre der übliche weg,SUM(1)
ergibt aber das gleiche ergebnis.Dann ordnen wir die Ergebnisse für jede Eingabe basierend auf den geringsten Wiederholungen und Zeichen.
ROW_NUMBER
würde auch hier funktionieren, ist aber länger.Schließlich wählen wir die niedrigste Rangnummer für jedes Wort.
quelle
Pure Bash , 146 Bytes
Probieren Sie es online!
quelle
APL (Dyalog) , 27 Bytes
Probieren Sie es online!
{
eine anonyme Funktion, wobei ⍵ das Argument darstellt ...∘.(
eine Funktionstabelle, in der sich die Funktion befindet⊃
das erste Element von⍷
die Boolesche Liste "linkes Argument beginnt hier im rechten Argument?")
Wo die richtigen Argumente sind⍵
die Argumente(
und das linke Argument ist↑
eine Tabelle mit Zeilen bestehend aus,/
Präfixe von¨
jeder von⍵
die Argumente+/
Summe über (zählt, wie viele Argumente mit diesem Präfix übereinstimmen)↓
Tabelle in Zeilen aufteilen⍳⍨¨
Finden Sie in jedem den Ort des ersten1
eins (dh das erste Präfix, das nur ein Argument anführt)↑¨⍨
Nimmt für jede Position so viele Zeichen aus dem entsprechenden Element von⍵
das Argument}
Ende der anonymen Funktionquelle
PowerShell,
151139 ByteInteressiert, ob es einen besseren Weg gibt, dies zu tun. Musste a
foreach
(über a|%
) verwenden, um einebreak
in der verschachtelten Schleife ausführen zu können, ohne sie zu kennzeichnen.Bearbeiten: 2 Golfplätze von AdmBorkBork
quelle
-notin
anstelle von-not$x.contains($a)
und!($w...
anstelle von ein-not($w...
paar Bytes sparen, ja?APL, 26 Bytes
Erläuterung:
↓↑⍵
: Pad jede Zeichenfolge in⍵
die Länge der längsten Zeichenfolge∘.(
...)⍨
: Finden Sie für jedes mögliche Paar von Zeichenfolgen das gemeinsame Präfix:≢
: Array-Ungleichung∧
: und=
: Itemweise Gleichheit∧\
: and-scan (nur die führenden Übereinstimmungen behalten)+/¨
: summiere jeden Vektor in der Tabelle und gebe die Länge der gemeinsamen Präfixe an⌈/
: finde den Maximalwert in jeder Spalte1+
: fügen Sie eine hinzu und geben Sie die Anzahl der Zeichen an, die erforderlich sind, um jede Zeichenfolge eindeutig zu halten⍵↑¨⍨
: nimm so viele Zeichen aus jeder ZeichenkettePrüfung:
quelle
Q, 93 Bytes
Wird rekursiv gelöst, nimmt den String als Eingabe und erhält bei jeder Rekursion die ersten n Elemente jedes Strings. Wenn eines dieser Elemente nicht eindeutig ist, werden sie durch die ersten n + 1 Elemente ersetzt.
quelle