Esta pregunta se basa en una pregunta que hice en español . Sí, pedí un algoritmo en español. :)
En España, las placas actuales tienen este patrón:
1234 XYZ
donde XYZ son tres consonantes tomadas del conjunto completo de consonantes españolas (excepto el 'Ñ', creo).
A veces, cuando viajo con mi esposa, solemos jugar un juego. Cuando vemos una placa de matrícula, tomamos sus tres consonantes e intentamos formar una palabra que contenga esas tres consonantes, que aparecen en el mismo orden que en la placa de matrícula. Ejemplos (en español):
BCD
BoCaDo (valid)
CaBezaDa (not valid)
FTL
FaTaL (valid)
FLeTar (not valid)
FTR
FleTaR (valid, wins)
caFeTeRa (valid, loses)
El ganador es el que usa la menor cantidad de caracteres, como puede ver en el último ejemplo.
El reto
Escriba el programa o función más corta que reciba una lista de palabras y un conjunto de tres consonantes y encuentre la palabra más corta en la lista que contenga las tres consonantes en el mismo orden. Para los propósitos de este juego, el caso no importa.
- La entrada para la lista de palabras (primer parámetro) será una matriz de su
string
tipo de idioma . El segundo parámetro (las tres consonantes) será otrostring
. Si es mejor para su idioma, considerestring
el último elemento de la lista completa de parámetros con las tres consonantes. La salida será otrastring
. - Las palabras en la lista de palabras no serán inventadas o palabras infinitas, serán palabras que aparecen en cualquier diccionario estándar. Si necesita un límite, suponga que ninguna palabra en la lista de palabras tendrá más de 50 caracteres.
- Si hay varias palabras con la misma longitud que podrían ser la respuesta válida, puede devolver cualquiera de ellas. Solo asegúrese de devolver una sola palabra o una cadena vacía si ninguna palabra coincide con el patrón de tres consonantes.
- Puede repetir consonantes en el grupo, por lo que las entradas válidas para las tres consonantes son ambas
FLR
yGGG
. - Las consonantes españolas son exactamente las mismas que las inglesas, con la adición de "Ñ". Las vocales son las mismas con la adición de las vocales acentuadas: "áéíóúü". No habrá otro tipo de marcas como "-" o "'".
- Puede suponer que el caso siempre será el mismo tanto en la lista de palabras como en las tres consonantes.
Si desea probar su algoritmo con una colección real de palabras en español, puede descargar un archivo (15.9 MB) de Dropbox con más de un millón de palabras.
Casos de prueba
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'
Este es el código de golf , ¡así que el programa más corto que me ayude a vencer a mi esposa siempre gana! :)
Respuestas:
05AB1E ,
108 bytesGuardado 2 bytes gracias a Leo
Pruébalo en línea!
Explicación
Hubiera utilizado
head
al final guardar un byte, pero eso generaría una lista vacía si no hay una coincidencia.fuente
3ù #keep only those of length 3
¿Por qué necesitas esto?MATL ,
3029 bytesPruébalo en línea!
Explicación
fuente
PHP , 111 bytes
Pruébalo en línea!
fuente
You can suppose the case will always be the same in both the word list and the three consonants.
- No es necesario el modificador regex. ¿Has probado enwordwrap
lugar dejoin(str_split())
?Jalea ,
12 1110 bytesUn programa completo que acepta una lista de listas de caracteres en minúscula (las palabras) y una lista de caracteres en minúscula (las letras) e imprime la primera de las palabras más cortas que contienen una subsecuencia igual a las letras (o nada si no existe) )
Pruébalo en línea!
¿Cómo?
fuente
Pyth -
2221191211 bytes-1 Gracias a Maltysen.
Toma 2 líneas como entrada. El primero es la cadena de 3 letras (minúsculas), y el segundo es una lista de palabras en minúsculas.
Pruébalo aquí
Explicación:
Antigua solución de 19 bytes:
fuente
Brachylog v2, 11 bytes
Pruébalo en línea!
Presentación de funciones. (El enlace TIO tiene un argumento de línea de comandos para ejecutar una función como si fuera un programa completo).
Explicación
Solo una traducción directa de la especificación de nuevo ...
En realidad, casi puede responder con
h⊆.&t∋
: intercambiar el orden de evaluación significa que Brachylog elegirá la respuesta más corta de forma predeterminada (como la primera restricción que ve⊆
, que tiene el "más corto" más conveniente como un desempate predeterminado), pero en ese caso, Brachylog's lamentablemente, el algoritmo de evaluación entraría en un bucle infinito si la respuesta no se encuentra realmente Entonces, casi la mitad de la respuesta está dedicada a manejar el caso de que no haya una respuesta adecuada. Incluso entonces, lalᵒ
anulación del desempate (que técnicamente es una especie, haciendo uso de∋
El desempate predeterminado de elementos preferidos más cerca del comienzo de la lista) es de solo dos bytes; los otros tres provienen de la necesidad de generar una cadena vacía específicamente cuando no se encuentra la salida, a diferencia del valor de centinela "sin soluciones" predeterminado de Brachylog (porque el final.
sería implícito si no tuviéramos que seguirlo∨
).Curiosamente, hay una característica que se implementó previamente en Brachylog que habría guardado un byte aquí. En un momento dado, se puede extraer elementos de entrada utilizando el argumento
?₁
,?₂
etc. sintaxis; eso le permitiría reorganizar el programatlᵒ∋.⊇?₁∨Ẹ
, que solo tiene 10 bytes. Desafortunadamente, la implementación que se usó en realidad no funcionó (y causó la interrupción de muchos programas que funcionaban), por lo que se revirtió. Sin embargo, puede pensar que el programa tiene una longitud "conceptual" de 10 bytes.fuente
Haskell
129 12912574 bytesCRÉDITO a @nimi
fuente
map
y elfilter
con una lista de comprensión. Como ya tieneData.List
alcance, puede usarsortOn length
y elegir la cabeza para encontrar el elemento con una longitud mínima. Finalmente, hagay
una función infija. Todo esto hacef
yk
superflua:l#w=sortOn length[p|p<-w,isInfixOf l$filter(`elem`l)p]!!0
.Data.Lists
, se puede utilizarargmin
en lugar desortOn
y salvar al!!0
:l#w=argmin length[...]
.Data.Lists
tiene muchas funciones agradablesPerl, 53 bytes
Código de 48 bytes + 5 para
-paF
.Esto aprovecha el hecho de que las listas interpoladas en el
m//
operador utilizan la$"
variable que cambia la cadena de entrada inicialpsr
a lap.*s.*r
que luego se compara para cada palabra adicional y se ordenalength
.Pruébalo en línea!
fuente
<<<
operador agrega eso para mí en la línea de comando.JavaScript (ES6),
777572 bytesToma las 3 consonantes
c
y la lista de palabrasl
en sintaxis curry(c)(l)
. Ambas entradas se esperan en el mismo caso.Casos de prueba
Mostrar fragmento de código
fuente
c=>l=>l.sort((a,b)=>a[b.length]&&1).find(w=>w.match(c.split``.join`.*`))
para 72, creoR, 101 bytes
Primera vez jugando al golf! Estoy seguro de que esto se puede condensar de alguna manera
Toma la cadena xy un vector de caracteres y de posibles entradas
Pruébalo en línea!
Editar: Mi versión era 135, ¡gracias Scrooble por el -34!
fuente
Retina , 58 bytes
Pruébalo en línea! Toma las tres consonantes en una línea y luego la lista de palabras en todas las líneas posteriores. Explicación:
O
ordena la lista¶.+
excluyendo la primera línea#
numéricamente$
tecleada por$.&
longitud. Luego se busca una coincidencia para una línea que incluye las tres consonantes en orden. Si existe una línea adecuada que la última, es decir, la más corta, dicha línea se convierte en la salida, de lo contrario la salida está vacía. El?-s:
temporalmente desactiva el efecto des`
modo que solo una línea coincida.fuente
Pip , 17 bytes
Toma la lista de palabras como argumentos de línea de comandos y las consonantes de stdin. Pruébalo en línea!
Explicación
fuente
Java 8,
132126 bytes-6 bytes gracias a @Nevay .
Explicación:
Pruébalo en línea.
fuente
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
Pruébalo en línea!
fuente
MATL ,
282726 bytesPruébalo en línea!
x
- Implícitamente tome la primera entrada (cadena con tres letras) y elimínela. Se copia en el portapapeles G, nivel 1 automáticamente (esta parte se inspiró en la respuesta de @Luis Mendo )."
- Implícitamente tome la segunda entrada (conjunto de palabras de la celda), repítala.l
- Presione 1 para usarlo más tarde1G
- Empuje la primera entrada (diga 'psr')@g
- Empuje la palabra actual como matriz3XN
-nchoosek
- Obtenga todas las combinaciones de 3 letras de la palabraXm
- Vea si el código de placa 'psr' es una de estas combinaciones. Devuelve 0 para falso y 1 para verdadero./
- Dividiendo el 1 (que empujamos antes) por este resultado. Cambia los 0 aInf
s@gn
- Obtener la longitud de la palabra actual*
- Multiplica la longitud por el resultado de la división. Devuelve la longitud tal como está cuando la palabra contiene los 3 caracteres; de lo contrario, devuelveInf
v
- concatenar verticalmente estos resultados en una sola matriz]
- lazo cerrado&X<
- obtener el índice del valor mínimo de esa matriz, es decir, el índice donde se encontró la palabra que contiene las letras y con una longitud mínima2G
- Presione la segunda entrada nuevamentew
- Vuelva a colocar el índice mínimo en la parte superior de la pila)
- Indice en una matriz de palabras con el índice mínimo, devolviendo la palabra válida con una longitud mínima(Salida implícita).
Más viejo:
fuente