La finalización de tabulación es una característica útil que completa automáticamente los comandos escritos parcialmente. Lo vas a implementar.
Por ejemplo, si los comandos disponibles fueran ['apply','apple','apple pie','eat']
, entonces a
se completarían en appl
, ya que todos los comandos que comienzan con a
también comienzan con appl
.
De entrada y salida
Debe ingresar una cadena, A y un conjunto de cadenas, B.
Debe generar el prefijo común más largo de todos los B que comienza con A.
- Si ninguna de las opciones comienza con A, entonces devuelve A
- Puede suponer que B no está vacío, y que todas las cadenas no están vacías
- No puede suponer que ninguna de las opciones comience con A, ni que el prefijo común sea más largo que A
- Puede ser sensible a mayúsculas o minúsculas.
- Solo necesita manejar ASCII imprimible
- Los elementos integrados que realizan esta tarea explícitamente están permitidos
Casos de prueba:
'a' ['apply','apple','apple pie','eat'] => 'appl'
'a' ['apple pie'] => 'apple pie'
'apple' ['eat','dine'] => 'apple'
'program' ['programa','programb'] => 'program'
'*%a(' ['*%a()-T>','*%a()-T<','@Da^n&'] => '*%a()-T'
'a' ['abs','absolute','answer'] => 'a'
'a' ['a','abs'] => 'a'
'one to' ['one to one','one to many'] => 'one to '
Tenga en cuenta el espacio final en el último caso de prueba
Este es un código de golf , ¡así que haga sus respuestas lo más breve posible!
\
o'
.'
en un ejemplo. Si uso"
para las cadenas, entonces las cadenas son diferentes a otros ejemplos.Respuestas:
JavaScript (ES6), 75 bytes
Explicación: Filtra en todos los prefijos coincidentes, luego se une con nuevas líneas y coincidencias contra una expresión regular que encuentra el prefijo común más largo de todas las líneas. Si no hay prefijos, la expresión regular devuelve una cadena vacía, en cuyo caso simplemente devolvemos la cadena original.
fuente
e.startsWith(s)
cone.match("^"+s)
un byte de Curry salvará otromatch
con ASCII imprimible arbitrario.(s,a)=>
as=>a=>
Jalea ,
1412 bytesPruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Pyth,
1413 bytesGracias a @isaacg por -1 byte
Un programa que toma la lista de cadenas, y luego la cadena, en STDIN e imprime el resultado.
Verificar todos los casos de prueba
Cómo funciona
fuente
f}zT
=>/#z
PowerShell v3 +, 112 bytes
Toma la entrada como una cadena
$a
y una matriz de cadenas$b
. Utiliza el-like
operador para extraer esos elementos de los$b
que comienza (sin distinción entre mayúsculas y minúsculas)$a
, explícitamente convertirlos como una matriz@(...)
(ya que el resultado podría ser una coincidencia como escalar, en cuyo caso la indexación falla más tarde) y almacenar esa matriz en$c
.Eso forma la
if
cláusula. Si no hay nada en$c
(es decir, nada comienza con$a
, por lo que la matriz está vacía), entonces la salida$a
con elelse
. De lo contrario ...Emitimos el primer elemento de
$c
como unachar
matriz y recorremos cada elemento, concatenando cadenas con el anterior$i
y colocando las cadenas en la tubería a través de paréntesis encapsulantes. Esos se filtran|?{...}
(laWhere-Object
cláusula) para verificar que el valor.count
de ual$c
es-eq
el.count
de las cosas$c
que son-like
la subcadena (es decir, la subcadena coincide con todo en $ c). Como estamos construyendo nuestras subcadenas en orden más corto a más largo, necesitamos la última[-1]
de las cadenas resultantes.Casos de prueba
fuente
Python 2, 122 bytes
Programa completo; toma una cadena y una lista de stdin exactamente como se indica en los ejemplos, excepto que las entradas deben estar en líneas separadas.
Verificar todos los casos de prueba
fuente
l.pop()
lugar del[-1]
?l
generalmente es unset
punto en ese punto, que no permite la indexación (estar desordenado). (Afortunadamente, ambos conjuntos y listas admitenpop()
.)Perl, 54 bytes
Incluye +2 para
-Xp
(se puede combinar con-e
) y +3 para-i
(no se puede combinar)Dé el diccionario en STDIN y la palabra después de la
-i
opción, por ejemplo:Solo el código:
fuente
Perl, 61 bytes
Incluye +2 para
-0p
Ejecute con la primera palabra seguida de las palabras del diccionario en STDIN:
tabcompletion.pl
:fuente
Python 2, 112 bytes
fuente
Haskell, 67 bytes
La función auxiliar
?
encuentra el prefijo común más largo de dos cadenas al tomar recursivamente el primer carácter siempre que sea el mismo para ambas cadenas y las cadenas no estén vacías.La función principal
%
primero mantiene solo las cadenas en la lista que comienzan con la dadas
, marcada por el prefijo común más largo cons
beings
. Para manejar que no haya competiciones válidas, se agregas
a un resultado vacío a través demax
. Luego, encuentra el prefijo común más largo de esos al plegar la función binaria?
.fuente
Python 2, 75 bytes
Gracias a @xnor por sugerir el incorporado, utilizado originalmente por @BetaDecay en esta respuesta .
Para fines de puntuación,
ÿ
se puede reemplazar con un byte DEL. Pruébalo en Ideone .fuente
D, 88 bytes
Uso:
El código simplemente elimina todos los elementos
q
que no comienzanp
, luego calcula la subsecuencia inicial común más grande de los elementos restantes.Los parámetros de plantilla nos ahorran dos repeticiones de
string
y una deauto
. El mal uso de la excepción nos permite evitar la variable temporal y condicional que de otro modo sería necesaria para manejar el caso en el que no hay elementos deq
iniciop
.fuente
Python 2,
107102 bytesPara fines de puntuación,
ÿ
se puede reemplazar con un byte DEL. Pruébalo en Ideone .¡Gracias a @xnor por guardar 5 bytes!
fuente
os.path.commonprefix
que encontró Beta Decay , puede hacer que haga el trabajo por usted.for c in ...
directamente y terminar con un error después de imprimir comoif len(set(c))>1:print r or s;_
.PHP,
167160157152 bytesPodría ahorrar 3 bytes más asignando variables con
preg_grep
ypreg_quote
, pero eh.Descompostura
fuente
PHP, 156 bytes
con mucha ayuda de Titus Gracias
PHP, 199 bytes
32 Bytes guardados por Titus con array_unique
Sé que la Solución Regex de Titus fue más corta hasta que Titus me ayudó a mejorar mi camino. Tal vez la forma que encontré es interesante para ti
fuente
$z
con$s
para arreglar elapple, [eat,dine]
caso. 2)$l=
es obsoleto; No usas esa variable. (-2) 3)$i++<$m
es más corto que++$i<=$m
. (-1) 4)substr($x,0,$i);
es más corto questr_split($x,$i)[0]
. (-3) 5) Puedes poner$r[]=$v
dentro del strlen. (-5)<2
es más corto que==1
. (-1) 7) Se podría utilizarstrstr
en el primer bucle:strstr($v,$s)==$v
. (-3)$r[]=$v;$m=max($m,strlen($v));
con$m=max($m,strlen($r[]=$v));
y soltar los curlys. Esto no toca la condición.$m
nada. Todo lo que necesita es algo que sea> = la longitud mínima de los reemplazos. El nuevo 5) Reemplazar{$r[]=$v;$m=max($m,strlen($v));}
con$r[]=$v;}
y<$m
con<strlen($r[0])
(-13)$r[]=$z=$v;
en el primer bucle y{$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}
para el segundo (-3)Retina, 60 bytes
La nueva línea final es significativa. Toma la entrada como la cadena en una línea y luego cada palabra en una línea separada (¡pero sin nueva línea final!). Funciona de manera similar a mi respuesta de JavaScript haciendo coincidir el prefijo común más largo de todas las líneas que comienzan con la cadena en la primera línea. Si no encuentra uno, simplemente borra todas las palabras.
fuente
Scala, 119 bytes
Sin golf:
Explicación:
fuente
Potencia Shell , 101 bytes
Basado en la increíble expresión regular de Nail .
Pruébalo en línea!
fuente
05AB1E , 14 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Gaia , 12 bytes
Pruébalo en línea!
Toma la entrada como B, luego A.
fuente