Cette question est basée sur une question que j'ai posée en langue espagnole . Oui, j'ai demandé un algorithme en espagnol. :)
En Espagne, les plaques d'immatriculation actuelles ont ce modèle:
1234 XYZ
où XYZ sont trois consonnes tirées de l'ensemble complet des consonnes espagnoles (sauf le 'Ñ', je pense).
Parfois, lorsque je voyage avec ma femme, nous jouons à un jeu. Lorsque nous voyons une plaque d'immatriculation, nous prenons ses trois consonnes et essayons de former un mot qui contient ces trois consonnes, apparaissant dans le même ordre que dans la plaque d'immatriculation. Exemples (en espagnol):
BCD
BoCaDo (valid)
CaBezaDa (not valid)
FTL
FaTaL (valid)
FLeTar (not valid)
FTR
FleTaR (valid, wins)
caFeTeRa (valid, loses)
Le gagnant est celui qui utilise le moins de caractères, comme vous pouvez le voir dans le dernier exemple.
Le défi
Écrivez le programme ou la fonction la plus courte qui reçoit une liste de mots et un ensemble de trois consonnes et trouve le mot le plus court dans la liste qui contient les trois consonnes dans le même ordre. Aux fins de ce jeu, le cas n'a pas d'importance.
- L'entrée pour la liste de mots (premier paramètre) sera un tableau de votre
string
type de langue . Le deuxième paramètre (les trois consonnes) en sera un autrestring
. Si c'est mieux pour votre langue, considérezstring
avec les trois consonnes le dernier élément de toute la liste des paramètres. La sortie en sera une autrestring
. - Les mots de la liste de mots ne seront pas inventés ou des mots infinis, ils seront des mots qui apparaissent dans n'importe quel dictionnaire standard. Si vous avez besoin d'une limite, supposez qu'aucun mot de la liste de mots ne dépasse 50 caractères.
- S'il y a plusieurs mots de même longueur qui pourraient être la réponse valide, vous pouvez renvoyer l'un d'eux. Assurez-vous de ne renvoyer qu'un seul mot ou une chaîne vide si aucun mot ne correspond au modèle de trois consonnes.
- Vous pouvez répéter les consonnes dans le groupe, donc les entrées valides pour les trois consonnes sont à la fois
FLR
etGGG
. - Les consonnes espagnoles sont exactement les mêmes que l'anglais, avec l'ajout du "Ñ". Les voyelles sont les mêmes avec l'adition des voyelles accentuées: "áéíóúü". Il n'y aura aucun autre type de marque comme "-" ou "'".
- Vous pouvez supposer que le cas sera toujours le même dans la liste de mots et dans les trois consonnes.
Si vous souhaitez tester votre algorithme avec une véritable collection de mots espagnols, vous pouvez télécharger un fichier (15,9 Mo) depuis Dropbox avec plus d'un million de mots.
Cas de test
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'
C'est du golf de code , alors le programme le plus court qui m'aide à toujours battre ma femme gagne! :)
Réponses:
05AB1E ,
108 octetsEnregistré 2 octets grâce à Leo
Essayez-le en ligne!
Explication
J'aurais utilisé
head
à la fin l'enregistrement d'un octet mais cela produirait une liste vide s'il n'y a pas de correspondance.la source
3ù #keep only those of length 3
pourquoi avez-vous besoin de ça?MATL ,
3029 octetsEssayez-le en ligne!
Explication
la source
PHP , 111 octets
Essayez-le en ligne!
la source
You can suppose the case will always be the same in both the word list and the three consonants.
- pas besoin du modificateur regex. Avez-vous essayéwordwrap
au lieu dejoin(str_split())
?Gelée ,
12 1110 octetsUn programme complet qui accepte une liste de listes de caractères minuscules (les mots) et une liste de caractères minuscules (les lettres) et imprime le premier des mots les plus courts qui contiennent une sous-séquence égale aux lettres (ou rien s'il n'en existe pas) ).
Essayez-le en ligne!
Comment?
la source
Pyth -
2221191211 octets-1 Merci à Maltysen.
Prend 2 lignes en entrée. Le premier est la chaîne de 3 lettres (en minuscules) et le second est une liste de mots en minuscules.
Essayez-le ici
Explication:
Ancienne solution à 19 octets:
la source
Brachylog v2, 11 octets
Essayez-le en ligne!
Soumission de fonction. (Le lien TIO a un argument de ligne de commande pour exécuter une fonction comme s'il s'agissait d'un programme complet.)
Explication
Encore une traduction directe de la spécification…
Vous pouvez en fait presque répondre avec
h⊆.&t∋
- permuter l'ordre d'évaluation signifie que Brachylog choisira la réponse la plus courte par défaut (comme la première contrainte qu'il voit est⊆
, qui a le "plus court" plutôt pratique comme bris d'égalité par défaut) - mais dans ce cas, Brachylog's l'algorithme d'évaluation entrerait malheureusement dans une boucle infinie si la réponse n'est pas réellement trouvée. Ainsi, près de la moitié de la réponse est consacrée au traitement de l'absence de réponse appropriée. Même dans ce cas, lalᵒ
dérogation de départage (qui est techniquement une sorte, utilisant∋
le bris d'égalité par défaut consistant à préférer les éléments au début de la liste) n'est que de deux octets; les trois autres proviennent de la nécessité de générer une chaîne vide spécifiquement lorsque la sortie n'est pas trouvée, contrairement à la valeur sentinelle par défaut de "aucune solution" de Brachylog (car la finale.
serait implicite si nous n'avions pas à la suivre∨
).Fait intéressant, il existe une fonctionnalité qui a été précédemment implémentée dans Brachylog qui aurait enregistré un octet ici. À un moment donné, vous pouvez extraire des éléments de l'argument d'entrée à l' aide
?₁
,?₂
etc. syntaxe; cela vous permettrait de réorganiser le programme entlᵒ∋.⊇?₁∨Ẹ
, ce qui n'est que de 10 octets. Malheureusement, l'implémentation qui a été utilisée n'a pas vraiment fonctionné (et a causé la rupture de nombreux programmes qui fonctionnaient autrement), elle a donc été annulée. Vous pouvez penser au programme comme étant "conceptuellement" long de 10 octets.la source
Haskell
12912574 octetsCRÉDIT à @nimi
la source
map
et lefilter
par une liste de compréhension. Comme vous l'avez déjàData.List
dans la portée, vous pouvez utilisersortOn length
et choisir la tête pour trouver l'élément avec une longueur minimale. Enfin, créezy
une fonction infixe. Tout cela faitf
etk
superflu:l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
.Data.Lists
, vous pouvez utiliser auargmin
lieu desortOn
et enregistrez le!!0
:l#w=argmin length[...]
.Data.Lists
a de nombreuses fonctions intéressantesPerl, 53 octets
Code de 48 octets + 5 pour
-paF
.Ceci tire profit du fait que les listes interpolées dans l'
m//
opérateur utilisent la$"
variable qui modifie la chaîne d'entrée initiale à partirpsr
dep.*s.*r
laquelle est ensuite identifié pour chaque mot supplémentaire et est triée surlength
.Essayez-le en ligne!
la source
<<<
opérateur ajoute cela pour moi en ligne de commande!JavaScript (ES6),
777572 octetsPrend les 3 consonnes
c
et la liste de motsl
dans la syntaxe de curry(c)(l)
. Les deux entrées sont attendues dans le même cas.Cas de test
Afficher l'extrait de code
la source
c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))
pour 72, je penseR, 101 octets
Golf pour la première fois! Je suis sûr que cela peut être condensé en quelque sorte
Prend la chaîne x et un vecteur de caractères y des entrées possibles
Essayez-le en ligne!
Edit: Ma version était de 135, merci Scrooble pour le -34!
la source
Rétine , 58 octets
Essayez-le en ligne! Prend les trois consonnes sur une ligne puis la liste des mots sur toutes les lignes suivantes. Explication:
O
trie la liste¶.+
excluant la première ligne#
numérique$
calée par$.&
longueur. Une correspondance est alors recherchée pour une ligne qui inclut les trois consonnes dans l'ordre. S'il existe une ligne appropriée à la précédente, c'est-à-dire la plus courte, cette ligne devient la sortie, sinon la sortie est vide. Le?-s:
désactive temporairement l'effet des`
sorte qu'une seule ligne est mise en correspondance.la source
Pip , 17 octets
Prend la liste de mots comme arguments de ligne de commande et les consonnes de stdin. Essayez-le en ligne!
Explication
la source
Java 8,
132126 octets-6 octets grâce à @Nevay .
Explication:
Essayez-le en ligne.
la source
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 octets
Essayez-le en ligne!
la source
MATL ,
282726 octetsEssayez-le en ligne!
x
- Prenez implicitement la première entrée (chaîne de trois lettres) et supprimez-la. Obtient copié dans le presse-papiers G, niveau 1 automatiquement (cette partie a été inspirée par la réponse de @Luis Mendo )."
- Prenez implicitement la deuxième entrée (tableau de cellules de mots), parcourez-la.l
- Appuyez sur 1 pour être utilisé plus tard1G
- Appuyez sur la première entrée (dites «psr»)@g
- Poussez le mot actuel comme tableau3XN
-nchoosek
- Obtenez toutes les combinaisons de 3 lettres du motXm
- Vérifiez si le code de plaque d'immatriculation «psr» est l'une de ces combinaisons. Renvoie 0 pour faux et 1 pour vrai./
- Diviser le 1 (que nous avons poussé plus tôt) par ce résultat. Change les 0 enInf
s@gn
- Obtenez la longueur du mot actuel*
- Multipliez la longueur par le résultat de la division. Renvoie la longueur telle qu'elle est lorsque le mot contient les 3 caractères, sinon renvoieInf
v
- concaténer verticalement ces résultats dans un seul tableau]
- boucle fermée&X<
- obtenir l'index de la valeur minimale de ce tableau, c'est-à-dire l'index où le mot contenant les lettres et avec une longueur minimale a été trouvé2G
- Appuyez à nouveau sur la deuxième entréew
- Ramener l'index min en haut de la pile)
- Index dans un tableau de mots avec l'index min, renvoyant le mot valide avec une longueur minimale(Sortie implicite.)
Plus âgée:
la source