Diese Frage basiert auf einer Frage, die ich in spanischer Sprache gestellt habe . Ja, ich habe nach einem Algorithmus in spanischer Sprache gefragt. :)
In Spanien haben aktuelle Kennzeichen dieses Muster:
1234 XYZ
Wobei XYZ drei Konsonanten sind, die aus der Gesamtheit der spanischen Konsonanten stammen (mit Ausnahme des 'Ñ', denke ich).
Wenn ich mit meiner Frau unterwegs bin, spielen wir manchmal ein Spiel. Wenn wir ein Nummernschild sehen, nehmen wir seine drei Konsonanten und versuchen, ein Wort zu bilden, das diese drei Konsonanten enthält und in derselben Reihenfolge wie das Nummernschild erscheint. Beispiele (auf Spanisch):
BCD
BoCaDo (valid)
CaBezaDa (not valid)
FTL
FaTaL (valid)
FLeTar (not valid)
FTR
FleTaR (valid, wins)
caFeTeRa (valid, loses)
Der Gewinner ist derjenige, der die geringste Anzahl von Zeichen verwendet, wie Sie im letzten Beispiel sehen können.
Die Herausforderung
Schreiben Sie das kürzeste Programm oder die kürzeste Funktion, die eine Liste von Wörtern und einen Satz von drei Konsonanten erhält, und finden Sie das kürzeste Wort in der Liste, das die drei Konsonanten in derselben Reihenfolge enthält. Für die Zwecke dieses Spiels spielt der Fall keine Rolle.
- Die Eingabe für die Wortliste (erster Parameter) ist ein Array Ihres
string
Sprachtyps. Der zweite Parameter (die drei Konsonanten) ist ein andererstring
. Wenn es für Ihre Sprache besser ist, betrachten Siestring
mit den drei Konsonanten den letzten Punkt der gesamten Parameterliste. Die Ausgabe wird eine andere seinstring
. - Die Wörter in der Wortliste sind keine erfundenen oder unendlichen Wörter, sondern Wörter, die in einem Standardwörterbuch vorkommen. Wenn Sie eine Beschränkung benötigen, nehmen Sie an, dass kein Wort in der Wortliste länger als 50 Zeichen ist.
- Wenn es mehrere Wörter mit derselben Länge gibt, die die gültige Antwort sein könnten, können Sie eines davon zurückgeben. Stellen Sie einfach sicher, dass Sie nur ein Wort oder eine leere Zeichenfolge zurückgeben, wenn kein Wort mit dem Muster von drei Konsonanten übereinstimmt.
- Sie können Konsonanten in der Gruppe wiederholen, sodass gültige Eingaben für die drei Konsonanten beide
FLR
und sindGGG
. - Die spanischen Konsonanten sind genau die gleichen wie die englischen, mit dem Zusatz "Ñ". Die Vokale sind die gleichen wie bei den betonten Vokalen: "áéíóúü". Es wird keine andere Art von Zeichen wie "-" oder "'" geben.
- Sie können davon ausgehen, dass der Fall sowohl in der Wortliste als auch in den drei Konsonanten immer derselbe ist.
Wenn Sie Ihren Algorithmus mit einer echten Sammlung spanischer Wörter testen möchten, können Sie eine Datei (15,9 MB) mit mehr als einer Million Wörtern von Dropbox herunterladen .
Testfälle
Input: 'psr', {'hola' 'repasar' 'pasarais' 'de' 'caída' 'pequeñísimo' 'agüeros'}
Output: 'repasar'
Input: 'dsd', {'dedos' 'deseado' 'desde' 'sedado'}
Output: 'desde'
Input: 'hst', {'hastío' 'chest'}
Output: 'chest'
Das ist Code-Golf , also kann das kürzeste Programm, das mir hilft, meine Frau immer zu schlagen, gewinnen! :)
Antworten:
05AB1E ,
108 Bytes2 Bytes dank Leo gespart
Probieren Sie es online!
Erläuterung
Ich hätte
head
am Ende verwendet, um ein Byte zu speichern, aber das würde eine leere Liste ausgeben, wenn es keine Übereinstimmung gibt.quelle
3ù #keep only those of length 3
warum brauchst du dasMATL ,
3029 BytesProbieren Sie es online!
Erläuterung
quelle
PHP , 111 Bytes
Probieren Sie es online!
quelle
You can suppose the case will always be the same in both the word list and the three consonants.
- Der Regex-Modifikator ist nicht erforderlich. Hast du eswordwrap
stattdessen versuchtjoin(str_split())
?Jelly ,
12 1110 BytesEin vollständiges Programm, das eine Liste von Listen mit Kleinbuchstaben (die Wörter) und eine Liste mit Kleinbuchstaben (die Buchstaben) akzeptiert und das erste der kürzesten Wörter druckt, die eine Teilfolge enthalten, die den Buchstaben entspricht (oder nichts, wenn es keine gibt) ).
Probieren Sie es online!
Wie?
quelle
Pyth -
2221191211 Bytes-1 Danke an Maltysen.
Nimmt 2 Zeilen als Eingabe. Die erste Zeichenfolge besteht aus drei Buchstaben (Kleinbuchstaben) und die zweite aus einer Liste von Wörtern in Kleinbuchstaben.
Probieren Sie es hier aus
Erläuterung:
Alte 19-Byte-Lösung:
quelle
Brachylog v2, 11 Bytes
Probieren Sie es online!
Funktionsübergabe. (Der TIO-Link verfügt über ein Befehlszeilenargument, mit dem eine Funktion ausgeführt werden kann, als wäre sie ein vollständiges Programm.)
Erläuterung
Nur noch eine direkte Übersetzung der Spezifikation…
Sie können tatsächlich fast antworten mit
h⊆.&t∋
- das Vertauschen der Auswertungsreihenfolge bedeutet, dass Brachylog standardmäßig die kürzeste Antwort auswählt (als erste Einschränkung wird angezeigt⊆
, die die recht bequeme "kürzeste" als Standard-Tiebreak aufweist) - aber in diesem Fall die von Brachylog Der Auswertealgorithmus würde leider in eine Endlosschleife geraten, wenn die Antwort nicht tatsächlich gefunden wird. Fast die Hälfte der Antworten widmet sich der Behandlung des Falls, dass keine angemessene Antwort vorliegt. Auch dann kann derlᵒ
Tiebreak außer Kraft gesetzt werden (was technisch eine Art ist, von dem Gebrauch zu machen)∋
Der Standardtiebreak für die Bevorzugung von Elementen, die sich näher am Anfang der Liste befinden, beträgt nur zwei Bytes. Die anderen drei resultieren aus der Notwendigkeit, eine leere Zeichenfolge auszugeben, insbesondere wenn die Ausgabe nicht gefunden wird, im Gegensatz zu Brachylogs Standard-Sentinel-Wert "no solutions" (da das Finale.
implizit wäre, wenn wir ihm nicht folgen müssten∨
).Interessanterweise gibt es eine Funktion, die zuvor in Brachylog implementiert wurde und hier ein Byte gespeichert hätte. An einem Punkt, können Sie Elemente aus dem Eingabeargument extrahieren verwenden
?₁
,?₂
etc. Syntax; Damit können Sie das Programm neu anordnentlᵒ∋.⊇?₁∨Ẹ
, was nur 10 Bytes entspricht. Leider funktionierte die verwendete Implementierung nicht wirklich (und führte dazu, dass viele ansonsten funktionierende Programme nicht mehr funktionierten), sodass sie zurückgesetzt wurde. Sie können sich das Programm jedoch als "konzeptionell" mit einer Länge von 10 Byte vorstellen.quelle
Haskell
12912574 BytesKREDIT an @nimi
quelle
map
und dasfilter
mit einem Listenverständnis ersetzen . Wie Sie bereitsData.List
im Umfang haben, können SiesortOn length
den Kopf verwenden und auswählen, um das Element mit minimaler Länge zu finden. Zum Schluss machen Siey
eine Infix-Funktion. All dies machtf
undk
überflüssig:l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
.Data.Lists
, können Sieargmin
stattsortOn
den und sparen!!0
:l#w=argmin length[...]
.Data.Lists
hat viele nette funktionenPerl, 53 Bytes
48 Byte Code + 5 für
-paF
.Dies nutzt die Tatsache , dass die Listen in den interpoliert
m//
Bediener den nutzen$"
Variable , die die anfängliche Eingabezeichenfolge aus der Veränderungpsr
zup.*s.*r
dem dann für jedes weiteres Wort abgestimmt und wird sortiert auflength
.Probieren Sie es online!
quelle
<<<
Operator das für mich in der Befehlszeile hinzufügt!JavaScript (ES6),
777572 ByteNimmt die 3 Konsonanten
c
und die Liste der Wörterl
in der Currying-Syntax(c)(l)
. Beide Eingänge werden im selben Fall erwartet.Testfälle
Code-Snippet anzeigen
quelle
c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))
für 72 denke ichR 101 Bytes
Zum ersten Mal Golf spielen! Ich bin sicher, das kann irgendwie verdichtet werden
Nimmt den String x und einen Zeichenvektor y von möglichen Eingaben
Probieren Sie es online!
Edit: Meine Version war 135, danke Scrooble für die -34!
quelle
Netzhaut , 58 Bytes
Probieren Sie es online! Nimmt die drei Konsonanten in eine Zeile und dann die Wortliste in alle nachfolgenden Zeilen. Erläuterung:
O
Sortiert die Liste mit¶.+
Ausnahme der ersten Zeile, die nach Länge#
numerisch$
codiert ist$.&
. Dann wird nach einer Übereinstimmung für eine Zeile gesucht, die die drei Konsonanten in der angegebenen Reihenfolge enthält. Wenn eine geeignete Zeile als die letzte, dh kürzeste vorhanden ist, wird diese Zeile zur Ausgabe, andernfalls ist die Ausgabe leer. Das?-s:
schaltet den Effekt vorübergehend aus,s`
so dass nur eine Zeile übereinstimmt.quelle
Pip , 17 Bytes
Nimmt die Wortliste als Kommandozeilenargumente und die Konsonanten von stdin. Probieren Sie es online!
Erläuterung
quelle
Java 8,
132126 Bytes-6 Bytes dank @Nevay .
Erläuterung:
Probieren Sie es online aus.
quelle
s->a->{String r="";for(String x:a)r=(x.length()<r.length()|r.isEmpty())&x.matches(r.format(".*%s.*%s.*%s.*",s))?x:r;return r;}
Python, 77 Bytes
Probieren Sie es online!
quelle
MATL ,
282726 BytesProbieren Sie es online!
x
- Nehmen Sie implizit die erste Eingabe (Zeichenfolge mit drei Buchstaben) und löschen Sie sie. Wird automatisch in Zwischenablage G, Ebene 1, kopiert (dieser Teil wurde von der Antwort von @Luis Mendo inspiriert )."
- Nehmen Sie implizit eine zweite Eingabe (Zellenarray von Wörtern) und durchlaufen Sie sie.l
- 1 drücken, um später verwendet zu werden1G
- Drücken Sie die erste Eingabe (sagen Sie 'psr')@g
- Drücken Sie das aktuelle Wort als Array3XN
-nchoosek
- Holen Sie sich alle Kombinationen von 3 Buchstaben aus dem WortXm
- Prüfen Sie, ob der Kennzeichencode 'psr' eine dieser Kombinationen ist. Gibt 0 für falsch und 1 für wahr zurück./
- Dividieren Sie die 1 (die wir zuvor gedrückt haben) durch dieses Ergebnis. Ändert die 0 inInf
s@gn
- Liefert die Länge des aktuellen Wortes*
- Multiplizieren Sie die Länge mit dem Divisionsergebnis. Gibt die Länge zurück, wie sie ist, wenn das Wort die 3 Zeichen enthält, andernfalls wird zurückgegebenInf
v
- Vertikale Verkettung dieser Ergebnisse zu einem einzigen Array]
- geschlossener Kreis&X<
- Ermitteln Sie den Index des Mindestwerts aus diesem Array, dh den Index, in dem das Wort mit den Buchstaben und der Mindestlänge gefunden wurde2G
- Drücken Sie den zweiten Eingang erneutw
- Bringen Sie den min-Index wieder auf den Stapel)
- Index in ein Array von Wörtern mit dem minimalen Index, wobei das gültige Wort mit der minimalen Länge zurückgegeben wird(Implizite Ausgabe.)
Älter:
quelle