Das spanische Nummernschildspiel


26

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 stringSprachtyps. Der zweite Parameter (die drei Konsonanten) ist ein anderer string. Wenn es für Ihre Sprache besser ist, betrachten Sie stringmit den drei Konsonanten den letzten Punkt der gesamten Parameterliste. Die Ausgabe wird eine andere sein string.
  • 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 FLRund sind GGG.
  • 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 , also kann das kürzeste Programm, das mir hilft, meine Frau immer zu schlagen, gewinnen! :)


Wie lang sind die Wörter in der Wortliste garantiert?
Neil

2
Auf tatsächlichen Kennzeichen ist der Buchstabe Q ebenfalls nicht zulässig. und W ist, obwohl kein richtiger spanischer Brief
Luis Mendo

2
Dürfen wir annehmen, dass die Wörter in der Liste und die drei Buchstaben alle in einem Fall sind?
Jonathan Allan

1
@ LuisMendo W ist seit 1969 ein spanischer Brief .
walen

1
@walen Deshalb habe ich "richtig" gesagt :-) Es gibt es auf Spanisch, aber es fühlt sich fremd an
Luis Mendo

Antworten:


7

05AB1E , 10 8 Bytes

2 Bytes dank Leo gespart

ʒæså}éR`

Probieren Sie es online!

Erläuterung

ʒ         # filter list, keep only members for which the following is true
  så      # input is in the
 æ        # powerset of the current word
    }     # end filter
     é    # sort by length
      R   # reverse
       `  # push separately (shortest on top)

Ich hätte headam Ende verwendet, um ein Byte zu speichern, aber das würde eine leere Liste ausgeben, wenn es keine Übereinstimmung gibt.


3
3ù #keep only those of length 3warum brauchst du das
Leo

1
@Leo: Ich nicht, das war dumm von mir. Danke :)
Emigna

6

MATL , 30 29 Bytes

xtog!s2$S"1G!'.*'Yc!@gwXXn?@.

Probieren Sie es online!

Erläuterung

x         % Implicitly take first input (string with three letters). Delete.
          % Gets copied into clipboard G, level 1
t         % Implicitly take second input (cell array of strings defining the
          % words). Duplicate
o         % Convert to numeric array of code points. This gives a matrix where
          % each string is on a row, right-padded with zeros
g         % Convert to logical: nonzeros become 1
!s        % Sum of each row. This gives the length of each word
2$S       % Two-input sort: this sorts the array of strings according to their
          % lengths in increasing order
"         % For each word in the sorted array
  1G      %   Push first input, say 'xyz'
  !       %   Transpose into a column vector of chars
  '.*'Yc  %   Concatenate this string on each row
  !       %   Transpose. This gives a char array which, when linearized in
          %   column-major order, corresponds to 'x.*y.*z.*'
  @g      %   Push corrent word
  w       %   Swap
  XX      %   Regexp matching. Gives a cell array with substrings that match
          %   the pattern 'x.*y.*z.*'
  n       %   Number of matchings
  ?       %   If non-zero
    @     %     Push cell array with current word, to be displayed as output
    .     %     Break loop
          %   Implicit end (if)
          % Implicit end (for)
          % Implicitly display stack

6

PHP , 111 Bytes

$y=array_map(str_split,preg_grep("#".chunk_split($_GET[1],1,".*")."#",$_GET[0]));sort($y);echo join($y[0]??[]);

Probieren Sie es online!


2
Das Nummernschild sollte eine Zeichenfolge sein, kein Array. Den Modifikator brauchst du aber nicht.
Titus

@ Titus behoben !!
Jörg Hülsermann

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 es wordwrapstattdessen versucht join(str_split())?
Titus

@ Titus gute Idee
Jörg Hülsermann

5

Jelly ,  12 11  10 Bytes

ŒPċðÐfLÞḣ1

Ein 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?

ŒPċðÐfLÞḣ1 - Main link: words; characters
   ðÐf     - filter keep words for which this is truthy:
ŒP         -   the power-set (all sub-sequences of the word in question)
  ċ        -   count (how many times the list of characters appears)
           - ...note 0 is falsey while 1, 2, 3, ... are truthy
       Þ   - sort by:
      L    -  length
        ḣ1 - head to index 1 (would use Ḣ but it yields 0 for empty lists)
           - implicit print (smashes together the list of lists (of length 1))

1
Wenn ich Ihre Erklärung richtig verstehe, würde dies ein Wort wie "borracho" für eine Folge von Konsonanten von "brc" ablehnen, da "brc" keine Unterzeichenfolge von "brrc" ist
Leo

@Leo ah, ja guter Fang, ich denke, dass es scheitern würde ...
Jonathan Allan

@Leo - nun, es ist behoben (Checks "existieren in" für den gesamten Power-Set jedes Wortes), aber es kann sein, dass es nicht voll besetzt ist ...
Jonathan Allan

5

Pyth - 22 21 19 12 11 Bytes

h+f/yTQlDEk

-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:

h+f/yTQlDEk
       lDE   # Sort word list by length
  f          # Filter elements T of the word list...
    yT       # by taking the powerset...
   /  Q      # and checking whether the 3-letter string Q is an element of that.
 +        k  # Add empty string to the list (in case no results found)
h            # And take the first result (the shortest)

Alte 19-Byte-Lösung:

h+olNf/-T"aeiou"QEk                       

@ JonathanAllan: Behoben! Vielen Dank für den Hinweis.
Maria

1
@ JonathanAllan: Es sieht so aus, als hätte er die Frage bearbeitet, um zu verdeutlichen, dass in diesem Fall eine leere Zeichenfolge zurückgegeben werden sollte. Ich habe meine Antwort entsprechend bearbeitet.
Maria

1
Wir haben einen sort-by-Meta-Operator in D, sodass Sie olN durch lD ersetzen können
Maltysen,

5

Brachylog v2, 11 Bytes

tlᵒ∋.&h⊆.∨Ẹ

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…

tlᵒ∋.&h⊆.∨Ẹ
t            The last element of {standard input}
   ∋.        contains the return value as an element
     &       and
      h      the first element of {standard input}
       ⊆.    is a subsequence of the return value
         ∨   alternate behaviour if no solution is found:
          Ẹ  return empty string
  ᵒ          tiebreak override: favour answers that have a low
 l           length

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 der lᵒ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 anordnen tlᵒ∋.⊇?₁∨Ẹ, 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.


4

Haskell 129 125 74 Bytes

import Data.List
l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0

KREDIT an @nimi


1
Sie können das am weitesten rechts stehende mapund das filtermit einem Listenverständnis ersetzen . Wie Sie bereits Data.Listim Umfang haben, können Sie sortOn lengthden Kopf verwenden und auswählen, um das Element mit minimaler Länge zu finden. Zum Schluss machen Sie yeine Infix-Funktion. All dies macht fundk überflüssig: l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0.
Nimi

Du hast recht! Ich habe gerade angefangen zu golfen! Vielen Dank!
Davide Spataro

1
Noch eines: wenn Sie den Import auf umschalten Data.Lists , können Sie argminstatt sortOnden und sparen !!0: l#w=argmin length[...]. Data.Listshat viele nette funktionen
nimi

3

Perl, 53 Bytes

48 Byte Code + 5 für -paF.

$"=".*";($_)=sort{$a=~y///c-length$b}grep/@F/,<>

Dies nutzt die Tatsache , dass die Listen in den interpoliert m//Bediener den nutzen $"Variable , die die anfängliche Eingabezeichenfolge aus der Veränderung psrzu p.*s.*rdem dann für jedes weiteres Wort abgestimmt und wird sortiert auf length.

Probieren Sie es online!


Wenn ich "adsd" in Ihre Liste einfüge, kann Ihr Programm es nicht finden. Das erste zu findende Zeichen muss nicht das erste im Wort sein.
Charlie

@CarlosAlejo Die Eingabe benötigt einen abschließenden Zeilenumbruch, funktioniert dann einwandfrei: Online ausprobieren ! . Das hat mich jedoch überrumpelt, da der <<<Operator das für mich in der Befehlszeile hinzufügt!
Dom Hastings

3

JavaScript (ES6), 77 75 72 Byte

Nimmt die 3 Konsonanten cund die Liste der Wörter lin der Currying-Syntax (c)(l). Beide Eingänge werden im selben Fall erwartet.

c=>l=>l.map(w=>x=!w.match([...c].join`.*`)||!x[w.length]&&x?x:w,x='')&&x

Testfälle


c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))für 72 denke ich
LarsW

@ LarsW In der Tat, danke! Ich habe jedoch einen anderen Ansatz gewählt, um der neuen Regel zu entsprechen: oder eine leere Zeichenfolge, wenn kein Wort mit dem Muster von drei Konsonanten übereinstimmt .
Arnauld

3

R 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

w=pryr::f((b=y[sapply(gsub(paste('[^',x,']'),'',y),function(l)regexpr(x,l))>0])[which.min(nchar(b))])

Probieren Sie es online!

Edit: Meine Version war 135, danke Scrooble für die -34!


1
Willkommen bei PPCG! Dies sieht aus wie ein Ausschnitt, in dem die Eingabe in fest codierten Variablen erfolgt. Die Antworten müssen entweder vollständige Programme oder aufrufbare Funktionen sein. Sie können sich diese (oder andere R-Antworten) für mögliche E / A-Methoden ansehen .
Martin Ender

2

Netzhaut , 58 Bytes

O#$^`¶.+
$.&
s`^((.)(.)(.).*¶(?-s:(.*\2.*\3.*\4.*)))?.*
$5

Probieren Sie es online! Nimmt die drei Konsonanten in eine Zeile und dann die Wortliste in alle nachfolgenden Zeilen. Erläuterung: OSortiert 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.


1
Ich kann mich nicht entscheiden, ob das drei Bauchnabel oder drei Brüste sind.
Charlie

@CarlosAlejo Denken Sie zufällig an Eccentrica Gallumbits?
Neil

Ich dachte an den Alien von Total Recall, aber Eccentrica könnte auch eine Option sein ... :)
Charlie

2
@CarlosAlejo Anscheinend ist Mary eine Hommage an Eccentrica Gallumbits.
Neil

1

Pip , 17 Bytes

@:qJ`.*`N_FI#_SKg

Nimmt die Wortliste als Kommandozeilenargumente und die Konsonanten von stdin. Probieren Sie es online!

Erläuterung

                   g is list of cmdline args (implicit)
              SKg  Sort g using this key function:
            #_      Length of each item (puts shortest words first)
          FI       Filter on this function:
  q                 Line of input
   J`.*`            joined on regex .* (turns "psr" into `p.*s.*r`)
        N_          Count regex matches in item (keeps only words that match)
@:                 Get first element of result (using : meta-operator to lower precedence)
                   If the list is empty, this will give nil, which results in empty output

1

Java 8, 132 126 Bytes

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;}

-6 Bytes dank @Nevay .

Erläuterung:

Probieren Sie es online aus.

s->a->{              // Method with two String-array parameters and String return-type
  String r="";       //  Result-String, starting empty
  for(String x:a)    //  Loop over the words
    r=(x.length()<r.length()
                     //   If a word is smaller than the current `r`,
      |r.isEmpty())  //   or `r` is still empty
      &x.matches(r.format(".*%s.*%s.*%s.*",s))?
                     //   And if the word is valid
       x             //    Change `r` to the current word
      :              //   Else:
       r;            //    Leave `r` the same
  return r;}         //  Return the result

1
126 Bytes: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;}
Nevay


0

MATL , 28 27 26 Bytes

x"l1G@g3XNXm/@gn*v]&X<2Gw)

Probieren 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 werden

1G - Drücken Sie die erste Eingabe (sagen Sie 'psr')

@g - Drücken Sie das aktuelle Wort als Array

3XN- nchoosek- Holen Sie sich alle Kombinationen von 3 Buchstaben aus dem Wort

Xm- 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 in Infs

@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 wurde

2G - Drücken Sie den zweiten Eingang erneut

w - 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:

x"@g1Gy3XNXm1w/wn*v]&X<2Gw)

x"@g1Gy3XNXm1w/wn*v]2Gw2$S1)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.