Geben Sie bei Eingabe einer Liste von Wörtern und deren Abkürzungen das Muster aus, nach dem die Abkürzungen gebildet werden können.
Nehmen wir die Beispieleingabe von
potato ptao
puzzle pzze
als Beispiel (dh die Abkürzung für potato
ist ptao
und die Abkürzung für puzzle
ist pzze
).
Betrachten Sie alle möglichen Möglichkeiten, um ptao
von zu erhalten potato
. Eine Möglichkeit besteht darin, den ersten, dritten, vierten und sechsten Buchstaben zu verwenden, auf den wir uns beziehen werden
1346
. Aber da t
und o
mehrfach im Wort erscheinen, gibt es mehrere andere Möglichkeiten zur Erzeugung ptao
von potato
: 1546
, 1342
, und 1542
.
Beachten Sie in ähnlicher Weise, dass mit jedem von pzze
generiert puzzle
werden kann1336
,
1346
, 1436
, 1446
. Das einzige Muster, das diese beiden Abkürzungen gemeinsam haben, ist 1346
: Daher muss dies die Ausgabe für diese Eingabe sein. Wenn mehrere mögliche Muster möglich sind, können Sie eines, einige oder alle (mindestens eines) ausgeben.
Sie können davon ausgehen, dass:
Eingabewörter und Abkürzungen enthalten nur Kleinbuchstaben.
Die Eingabe enthält mindestens ein Wort- / Abkürzungspaar.
Es ist möglich, dass jede Abkürzung aus ihrem entsprechenden Wort gebildet wird.
Es wird immer mindestens ein Muster geben, das jede Abkürzung bildet.
Die maximale Länge jedes Wortes beträgt 9 Zeichen.
Die Eingabe kann wie folgt erfolgen:
2-dimensionales Array / Liste / Array von Tupeln / etc.
[[word, abbr], [word, abbr], ...]
flaches 1-dimensionales Array / Liste
[word, abbr, word, abbr, ...]
Einzelne Zeichenfolge, die durch ein einzelnes Zeichen begrenzt wird, das kein Kleinbuchstabe ist
"word abbr word abbr"
Hash / Assoziatives Array / etc.
{word => abbr, word => abbr, ...}
In jeder dieser Eingabemöglichkeiten können Sie auch die Reihenfolge von Wort / Abkürzung tauschen (beschreiben Sie das Eingabeformat in Ihrem Beitrag vollständig).
Die Ausgabe kann als einzelne Zahl, als durch Nicht-Ziffern begrenzte Zeichenfolge oder als Array / Liste / Tupel / usw. erfolgen. von Zahlen.
Da dies Code-Golf ist , wird der kürzeste Code in Bytes gewinnen.
Testfälle (denken Sie daran, dass Sie nur ≥ 1 Ergebnisse ausgeben müssen, wenn mehrere Muster funktionieren):
In Out
--------------------------------------------------------
potato ptao puzzle pzze | 1346
aabbcc abc fddeef def | 246
prgrmming prgmg puzzles pzzlz | 14353
aaaaa a bbbb b ccc c dd d e e | 1
aaaaa a bbbb b ccc c | 1, 2, 3
abcxyz zbcyax | 623514
abcxyz acbbacbcbacbbac | 132213232132213
potato ptao | 1346, 1546, 1342, 1542
a aaaaa | 11111
Antworten:
Pyth, 19 Bytes
Probieren Sie es hier aus!
Erstellt eine Liste im folgenden Format:
Alternative 17-Byte-Lösung, die das Ergebnis als Liste von nullbasierten Indizes ausgibt, die in eine 1-Element-Liste eingeschlossen sind:
Erläuterung
Beispiel:
[["potato", "ptao"],["puzzle", "pzze"]]
Zuerst ordnen wir jedes Zeichen in der Abkürzung einer Liste der Indizes aller Vorkommen in dem Wort zu, das ergibt
[[[0], [2, 4], [3], [1, 5]], [[0], [2, 3], [2, 3], [5]]]
Dann transponieren wir diese Liste, die uns gibt
[[[0], [0]], [[2, 4], [2, 3]], [[3], [2, 3]], [[1, 5], [5]]]
Somit sind die Indizes jedes Zeichens jeder Abkürzung in einer Liste zusammengefasst.
Dann müssen wir in allen Listen nur einen gemeinsamen Index finden, der ergibt:
[[0], [2], [3], [5]]
Dies ist die Ausgabe meiner alternativen 17-Byte-Lösung oben. Dies wird dann in umgewandelt
[1,3,4,6]
.Code-Aufschlüsselung
quelle
dm
Recht vor dem löschen@
?MATL , 29 Bytes
Die Eingabe ist ein 2D-Array im folgenden Format:
Probieren Sie es online! ( Der verknüpfte Code enthält einige Änderungen aufgrund von Änderungen in der Sprache seit dem Posten dieser Antwort. )
Der Code erforderte einige umständliche (und langwierige!) Tricks
find
(f
) erzeugten Vektoren in Abhängigkeit von der Eingabeform ändert. Dies sind AnweisungenX:wX:
: Erzwinge, dass beide Ausgaben Spaltenvektoren sind.min
(X>
) -Funktion "Erste Nicht-Singleton-Dimension bearbeiten" . Hierbei handelt es sich um folgende Anweisungentv
: Eine Kopie von sich selbst zusammenfassen, um mindestens zwei Zeilen zu gewährleisten);quelle
Perl,
464542 BytesBeinhaltet +1 für
-p
Geben Sie STDIN als aufeinanderfolgende Wörter ein, z
Beenden Sie STDIN mit
^D
oder^Z
oder was auch immer auf Ihrem System benötigt wirdabbrev.pl
:Erläuterung
Betrachten Sie diese Eingabe (konzeptionelles Layout, nicht die tatsächliche Eingabemethode für dieses Programm):
Das Programm erstellt Zeichenfolgen, die die vertikalen Spalten der vollständigen Zeichenfolgen darstellen, die in einer Spalten-ID indiziert sind
usw. Dies gilt auch für die Abkürzungen, jedoch unter Verwendung einer anderen ID
Die Wörter werden implizit einzeln mit der
-p
Option verarbeitet. Dies#.# ...code.. #eg
Spaltenfolgen werden unter Verwendung wiederholter Verkettungen erstellt, während jedes Wort durchlaufen wird. Daher benötigt jede Spalte eine wiederholbare ID. Ich verwende minus die Spaltennummer, gefolgt von der Zeilennummer modulo 2. Die Spaltennummer kann so konstruiert werden,--$_
dass sie als das aktuelle Wort beginnt, das aufgrund der Verwendung von nura-z
garantiert als 0 in einem numerischen Kontext ausgewertet wird. Also verstehe ich-1, -2, -3, ...
. Ich hätte es wirklich gerne benutzt1, 2, 3, ...
, aber mit$_++
würde Perl Magic String Increment anstelle eines normalen numerischen Zählers ausgelöst. Ich tue verwenden möchten$_
und nicht irgendeine andere Variable, weil ich jede andere Variable in jeder Schleife, die zu viele Bytes benötigt, auf Null initialisieren müsste.Die Zeilennummer Modulo 2 soll sicherstellen, dass die IDs für das vollständige Wort und die IDs für die Abkürzung nicht in Konflikt geraten. Beachten Sie, dass ich nicht das vollständige Wort und die Abkürzung für eine Zeichenfolge verwenden kann, um eine Spaltennummer über der kombinierten Zeichenfolge zu haben, da die vollständigen Wörter nicht alle dieselbe Länge haben und die Spalten mit den abgekürzten Wörtern nicht in einer Reihe stehen. Ich kann das abgekürzte Wort auch nicht an die erste Stelle setzen (sie haben alle die gleiche Länge), da die Anzahl der ersten Spalte der vollständigen Wörter 1 sein muss.
Ich missbrauche den globalen Namensraum von Perl durch einen nicht strengen Verweis, um die Spaltenfolgen wie folgt zu konstruieren:
Als Nächstes ordne ich jede Spaltenzeichenfolge der ersten Spaltennummer zu, in der die Zeichenfolge jemals vorkommt (die oben bereits angegebene Zuordnung), indem ich den globalen Perl-Namespace erneut missbrauche (beachte jedoch, dass die Namen nicht kollidieren können, damit sich die globalen Zeichenfolgen nicht gegenseitig stören):
Ich muss negieren,
$_
weil ich, wie oben erklärt, die Spalten als zähle-1, -2, -3, ...
. Das||=
stellen Sie sicher , nur das erste Auftreten einer bestimmten Spalte erhält eine neue Spaltennummer, andernfalls wird die vorherige Spaltennummer wird beibehalten und als Wert zurückgegeben. Dies geschieht insbesondere für jedes abgekürzte Wort, da die Spezifikation garantiert, dass eine Spalte mit den vollständigen Wörtern vorhanden ist, die zuvor angezeigt wurden. Daher wird im allerletzten abgekürzten Wort jeder Buchstabe durch die Spaltennummer im vollständigen Wort ersetzt, die der Spalte für alle abgekürzten Wörter entspricht. Das Ergebnis der allerletzten Auswechslung ist also das gewünschte Endergebnis. Drucken Sie also genau dann, wenn wir am Ende der Eingabe stehen:Durch die Zuweisung des Spaltenindex werden auch Einträge für unvollständige Spalten erstellt, da die Spalte noch nicht vollständig aufgebaut ist oder einige Wörter kürzer sind und nicht die volle Spaltenlänge erreichen. Dies ist kein Problem, da die Spalten, die in jedem abgekürzten Wort benötigt werden, garantiert eine entsprechende Spalte aus den vollständigen Wörtern haben, die die maximal mögliche Länge (die Anzahl der aktuell gesehenen Paare) hat, so dass diese zusätzlichen Einträge niemals falsche Übereinstimmungen verursachen.
quelle
Haskell, 74 Bytes
Das Eingabeformat ist eine Liste von Zeichenfolgenpaaren, z.
So funktioniert es:
mapM
(wiesequence . map
) verwandelt zuerst jedes Paar(w,a)
in eine Liste von' ':
Indexlisten der Buchstaben in der Abkürzung ( fixiert Haskells nativen 0-basierten Index auf 1-basiert), z. B.("potato", "ptao") -> [[1],[3,5],[4],[2,6]]
und dann in eine Liste aller Kombinationen davon, in denen Das Element an der Positioni
wird aus deri
Unterliste gezogen, z[[1,3,4,2],[1,3,4,6],[1,5,4,2],[1,5,4,6]]
.foldl1 intersect
Findet den Schnittpunkt all dieser Listen von Listen.quelle
ES6, 92 Bytes
Akzeptiert Eingaben als Array von Wörtern und als Array von Abkürzungen. Gibt ein Array von 1-basierten Indizes zurück (was mich 2 Bytes Dammit kostet). Bei mehreren Lösungen werden die höchsten Indizes zurückgegeben.
quelle
Python 3, 210 Bytes
Keine eindrucksvolle Antwort auf die Topscores, aber dies ist wirklich eine der verrücktesten Listen, die ich je mit Python gemacht habe. Der Ansatz ist recht einfach.
Die Funktion erwartet die Eingabe immer als String-2-D-Array wie:
[[word, abbr],...]
und gibt eine Liste von Ganzzahlen zurück.Ps: Eine ausführliche Erklärung folgt in Kürze
PS2: Weitere Golfvorschläge sind willkommen!
quelle