Dado (en STDIN, como argumentos de línea de comando o como argumentos de función) dos cadenas distintas no vacías, encuentre y devuelva la subcadena más corta de la primera cadena que no es una subcadena de la segunda. Si no existe tal subcadena, puede devolver la cadena vacía, devolver cualquier cadena que no sea una subcadena de la cadena original o lanzar una excepción. Si regresa de una función, también puede devolver nulo (o indefinido, Ninguno, etc.) en este caso. Si varias de estas subcadenas están vinculadas por la más corta, puede devolver cualquiera de ellas.
Las cadenas pueden consistir en cualquier carácter ascii imprimible.
La entrada dada en STDIN se dará con una cadena en cada línea. A petición suya, se puede agregar una sola línea vacía al final de la entrada.
Este es el código de golf, por lo que gana el programa válido más corto.
ALGUNOS CASOS DE PRUEBA
ENTRADA:
STRING ONE
STRING TWO
SALIDA:
E
ENTRADA:
A&&C
A&$C
SALIDAS VÁLIDAS:
&&
&C
ENTRADA:
(Dos cadenas de 80 letras generadas al azar)
QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE
TODAS LAS SALIDAS VÁLIDAS:
AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV
Respuestas:
Brachylog , 23 bytes
Funciona en el antiguo transpiler de Java. Espera las dos cadenas en una lista como entrada, unifica la salida con la subcadena. Si no se encuentra ninguna subcadena, devuelve falso.
Lamentablemente, todavía no he codificado el subconjunto integrado en el nuevo transpiler de Prolog.
Explicación
fuente
Python,
11911591Casos de prueba:
Trabajando para hacerlo más corto, pero este es mi instinto cerebral. Realmente no soy un gran golfista todavía.
Gracias a @ user81655 y @NonlinearFruit por los bytes adicionales.
Editar :
Dang Probé este código:
Pensé que era unos pocos bytes más cortos. Resulta que fue 1 byte más de lo que tenía antes de la edición.
fuente
(r=range)(1,len(a)+1)
usarlor
?range
ar
en la línea anterior, en realidad agrega un byte. Buena idea, sin embargo. Probablemente haya una forma más corta de recorrer las subcadenas.range(1,len(a))
yrange(len(a)-1)
debería funcionar, ¿no? También creo que usar un carácter de tabulación para la sangría de dos espacios ahorraría un byte.range(1,len(a))
, el 4to elenco de prueba falla porque no intentará la cadena completa; solo irá a la longitud de la cadena: 1. Y conrange(len(a)-1)
, el primer caso de prueba no regresa en'cd'
lugar de solo'd'
. Sin embargo, puede haber algo allí.range(1,len(a)+1)
yrange(len(a))
.Python,
8786 bytesSi existe, devolverá la subcadena más corta más a la izquierda de todas.
Si no hay una subcadena única, se genera un IndexError .
Pruébelo en Ideone .
fuente
enumerate
para empezarj
ai+1
.j
primero, luegoi
.'ab'
por entrada'abc','aaa'
.Python, 82 bytes
Uso:
f('A&&C', 'A&$C')
-> devoluciones'&&'
Aumenta ValueError si no hay una subcadena adecuada.
Explicación:
g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
crea recursivamente un conjunto de las subcadenas deu
f=lambda s,t:min(g(s)-g(t),key=len)
toma la subcadena más corta de la diferencia del conjuntofuente
JavaScript (ES6), 79 bytes
Si la devolución
false
es aceptable, guarde 2 bytes utilizando en&&s
lugar de?s:''
.fuente
Pyth, 11 bytes
Pruébalo en línea!
fuente
JavaScript (Firefox), 80 bytes
La prueba solo funciona en Firefox. Devuelve
undefined
si no hay una subcadena.fuente
b.includes
?includes
.SyntaxError: unexpected token 'for'
Retina , 37 bytes
La salida está vacía si no se encuentra una subcadena válida
A
.Pruébalo en línea! (Ligeramente modificado para ejecutar varios casos de prueba a la vez. El formato de entrada en realidad está separado por salto de línea, pero las suites de prueba son más fáciles de escribir con un caso de prueba por línea. El marco de prueba convierte el espacio en un salto de línea antes de que comience el código real).
Explicación
Para cada posible posición inicial en
A
, coincida con la subcadena más corta que no aparece enB
. El&
es para coincidencias superpuestas, de modo que en realidad probamos todas las posiciones iniciales, incluso si una coincidencia es más larga que un personaje. Esto\G
garantiza que no omitimos ninguna posición, en particular, de esta manera tenemos que parar en el salto de línea, de modo que no obtengamos coincidencias adicionales deB
sí mismo. La razón por la que esto no arruina las cosas es bastante sutil: porque si hay una posición inicial en laA
que no podemos encontrar ninguna subcadena válida, entonces también es una falla que hará\G
que deje de verificar otras posiciones. Sin embargo, si (desde la posición inicial actual) todas las subcadenas aparecen enB
, también lo harán todas las subcadenas que comienzan más a la derecha de la posición actual, por lo que descartarlas no es un problema (y en realidad mejora el rendimiento).Debido a la
M!
configuración, todos estos partidos serán devueltos desde el escenario, unidos con saltos de línea.Esto ordena las líneas del resultado anterior por longitud. Esto se hace haciendo coincidir la línea con
.+
. Luego$
activa una forma de "ordenar por", de modo que la coincidencia se sustituye$.&
por la determinación del orden de clasificación. El$.&
mismo reemplaza el partido con su longitud. Finalmente, la#
opción le dice a Retina que ordene numéricamente (de lo contrario, trataría los números resultantes como cadenas y los ordenaría lexicográficamente).Finalmente, simplemente mantenemos solo la primera línea, usando una etapa grep con una expresión regular vacía (que siempre coincide) y un límite de
1
.fuente
Perl
8785Esta es una función anónima que devuelve la primera (por posición) de las subcadenas más cortas de las
$_[0]
que no se producen$_[1]
, oundef
si no existe dicha subcadena.Programa de prueba con cadenas tomadas de la respuesta de @ iAmMortos, probado con Perl 5.22.1:
fuente
Haskell, 72 bytes
Ejemplo de uso:
"abcd" # "dabc"
->"cd"
.Una implementación sencilla: compila todas las subcadenas
a
y conserva las que no aparecenb
.argmin
devuelve un elemento de una lista que minimiza la función dada a El segundo argumento, aquí:length
.fuente
argmin
! Parece extremadamente útil.Pyth -
96 bytesPruébelo en línea aquí .
fuente
C #, 152 bytes
fuente
Ruby, 70 bytes
Recopila todas las subcadenas de una cierta longitud de la primera cadena, y si hay una que no está en la segunda cadena, devuélvala.
fuente
Burlesque - 26 bytes
En este momento, la forma más corta que puedo encontrar es:
fuente
Japt , 14 bytes
Pruébalo en línea!
Devuelve
undefined
si no hay una subcadena válida . Esto es distinto de devolver la cadena "indefinida" , aunque la diferencia solo es visible debido al indicador -Q.Explicación:
fuente
Japt
-h
, 11 bytesIntentalo
fuente