Dadas las cadenas X e Y, determine si X es una subsecuencia de Y. La cadena vacía se considera una subsecuencia de cada cadena. (Por ejemplo, ''
y 'anna'
son subsecuencias de 'banana'
.)
Entrada
- X, una cadena alfanumérica entre mayúsculas y minúsculas posiblemente vacía
- Y, una cadena alfanumérica sensible a mayúsculas y minúsculas posiblemente vacía
Salida
- Verdadero o Falso (o equivalentes), indicando correctamente si X es una subsecuencia de Y.
Ejemplos de E / S
X Y output
'' 'z00' True
'z00' 'z00' True
'z00' '00z0' False
'aa' 'anna' True
'anna' 'banana' True
'Anna' 'banana' False
Criterios
- El programa más corto gana, según lo determinado por el número de bytes del código fuente.
Programas de ejemplo
- Varios programas que podrían adaptarse están en esta publicación relacionada .
anna
es una subsecuencia (pero no una subcadena) debanana
. La cadena X es una subsecuencia de la cadena Y solo si X se puede obtener de Y eliminando cero o más de los elementos de Y; por ejemplo, eliminando elb
y el segundoa
debanana
dadoanna
.Respuestas:
Perl 5 , 17 bytes (+1?), Programa completo
Pruébalo en línea!
Invoque con la
p
bandera al intérprete perl, como enperl -pe 's//.*/g;$_=<>=~$_'
. Según las reglas de puntuación establecidas cuando este desafío se publicó originalmente , esta bandera cuesta un byte adicional. Bajo reglas más recientes , AFAICT, puede ser gratis.De cualquier manera, las cadenas de entrada deben suministrarse en líneas separadas terminadas en nueva línea en stdin. La salida (a stdout) será
1
si la primera cadena de entrada es una subcadena de la segunda, o nada en absoluto si no lo es.Tenga en cuenta que ambas líneas de entrada deben tener una nueva línea al final, o el programa no funcionará correctamente. Alternativamente, puede agregar el
l
indicador de línea de comando a la invocación para hacer que Perl elimine las nuevas líneas; dependiendo de las reglas de puntuación vigentes, esto puede costar o no un byte adicional. Tenga en cuenta que el uso de este indicador también agregará una nueva línea a la salida.Versión original (fragmento, 18 bytes / caracteres)
La entrada se da en las variables
$x
y$y
, el resultado es el valor de la expresión (en contexto escalar). Tenga en cuenta que$x
se modifica en el proceso. (Sí, sé que usar en$_
lugar de$x
permitirme guardar cuatro caracteres, pero hacerlo en un fragmento que me parece un poco cursi).¿Como funciona?
La primera parte,
$x=~s//.*/g
inserta la cadena.*
entre cada carácter en$x
. La segunda parte,$y=~$x
trata$x
como una expresión regular y coincide$y
con ella. En expresiones regulares de Perl,.*
coincide con cero o más caracteres arbitrarios, mientras que todos los caracteres alfanuméricos coinciden convenientemente.fuente
Ruby, 32 caracteres.
Esta solución devuelve
nil
six
no es una subsecuencia dey
y un número de lo contrario (es decir, equivalentes de rubí afalse
ytrue
). Ejemplos:fuente
y=~/#{[*x.chars]*".*"}/
(23 caracteres). ¡aclamaciones!y=~/#{x.split("")*".*"}/
(21 caracteres) :)y=~
tiempo jugando con esto en irb ...Haskell
5137Gracias a Hammar por la mejora sustancial. Ahora es una función infija, pero parece que no hay ninguna razón por la cual no debería.
Demostración:
fuente
s x y=x<=y
. Además, puede ahorrar algunos más convirtiéndolo en un operador y utilizando un@
patrón en lugar de(f:l)
. Esto lo reduce a 37 caracteres:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
Python (48 caracteres)
El mismo enfoque que la respuesta de Howard Ruby. Lástima la necesidad de Python de importar el paquete regex y su "detallado"
lambda
. :-)fuente
Python, 59 caracteres
Pensé que mi respuesta se expresaría mejor en Python.
Editar: Se agregaron sugerencias de res.
fuente
x="a"
yy="ab"
saldrías del ciclo cony=="b"
y volveríasfalse
?x
yy
más. En mis funcionesy
debe ser una subsecuencia dex
. Creo que mejor los cambio para evitar cualquier confusión.def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""
. No se muestra correctamente en un comentario, pero creo que puedes ver lo que quiero decir. (Además, un espacio adicional es suficiente para aumentar el nivel de sangría.)''
y guardar varios caracteres escribiendox=x[c==x[0:1]:]
GolfScript (22 caracteres)
Asume que la entrada se toma como dos variables predefinidas
X
yY
, aunque eso es bastante inusual en GolfScript. Deja1
para verdadero o0
para falso en la pila.fuente
C (52 caracteres)
Casos de prueba
fuente
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Burlesque (6 caracteres)
6 caracteres en burlesco:
R@\/~[
(suponiendo que x e y están en la pila. Ver aquí en acción).fuente
C, 23:
resultar en * x
http://ideone.com/BpITZ
fuente
PHP, 90 caracteres
fuente
if
declaración y simplificar a$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
fuente
CoffeeScript
1121009589Mi primer intento de golf de código ... ¡espero no avergonzar a mi familia!
Editar : resulta que Coffeescript es más indulgente de lo que pensaba con espacios en blanco.
Gracias a res y Peter Taylor por algunos consejos para hacerlo un poco más elegante
fuente
z=(x,y)-> a=x.length return 1if a==0 b=y.indexOf x[0] return 0if b<0 z x[1..a],y[b+1..y.length]
. (En algunos navegadores, por ejemplo, Chrome, puede ver el código de comentario correctamente desplegado haciendo clic con el botón derecho, luego Inspeccionar Elemento).a.length
nunca será negativo, por lo que puedes guardar un personaje más reemplazándoloif a==0
porif a<1
. No sé cómo funciona la tokenización de CoffeeScript, pero si funcionaif0
como dos tokens, podría guardar dos más invirtiendo ambas condiciones (es decirif1>a
).if1>a
¡no es válido, peroif!a
es y es un personaje más corto! También me di cuenta de que podía afeitarse un carácter adicional convertirb+1
ab
e incrementándolo en la línea anterior, también haciendo el mismoif
truco posible ya que estaba tratando con un no-0 0 situación /.C #,
7011310790 caracteresfuente
static bool S(string x,string y){if(x!=""&&y=="")return false;return x==""||S(y[0]==x[0]?x.Remove(0,1):x,y.Remove(0,1));}
x==""||y!=""&&S(...)
, pero aún es más largo que la versión actualizada de Linq. Buen uso deAny
!Mathematica
19 1727LongestCommonSequence
devuelve la subsecuencia no contigua más larga de dos cadenas. (No debe confundirse conLongestCommonSubsequence
, lo que devuelve la subsecuencia contigua más larga.Lo siguiente verifica si la subsecuencia contigua más larga es la primera de las dos cadenas. (Por lo tanto, debe ingresar la cadena más corta seguida de la cadena más grande).
Ejemplos
Verdadero Verdadero Verdadero Falso
La prueba crítica es la tercera, porque "anna" está contenida de manera no contigua en "banana".
fuente
Python 3.8 (prelanzamiento) , 42 bytes
Pruébalo en línea!
Python 3.8 (prelanzamiento) , 48 bytes
Pruébalo en línea!
Python 2 , 48 bytes
Pruébalo en línea!
Copiado de esta respuesta de Lynn . Se
>0
puede omitir si solo la salida truey / falsey está bien.Python 2 , 50 bytes
Pruébalo en línea!
Python 2 , 50 bytes
Pruébalo en línea!
fuente
C -
74 7164Esto no supera la solución de Peter Taylor, pero creo que es bastante divertido
(además, este es un programa de trabajo completo, no solo una función)Y sin golfos:
Para probarlo puedes hacer algo como:
fuente
!=0
en una condición es un poco detallado ... Programa vs función es algo que la pregunta necesita especificar claramente, y aquí no lo hace, por lo que las respuestas toman diferentes opciones.!='\0'
es un mal hábito (¿bueno?) De escribir código que no sea de golf, he dejado que eso se filtre en mis últimas dos rondas de golf, tendré que ser más cuidadoso en el futuro. En cuanto al programa frente a la función, sí, tienes toda la razón.Pitón,
66625958 caracteresUna especie de solución divertida, definitivamente un buen problema.
fuente
Rubí
323028Esto devolverá la
MatchData
instancia sia
es subsecuencia deb
onil
no.Versión antigua que encuentra subcadena en lugar de subsecuencia
Rubí 15
Usando el
String#[](str)
método que devuelvestr
ifstr
es una subcadena deself
y!!
para devolverBoolean
si el valor devuelto puede ser utilizable como boolean (y no necesita sertrue
ofalse
), entonces puede ser solo 13 caracteres:Volverá
nil
sia
no es una subcadena deb
.fuente
SWI-Prolog, SICStus
El predicado incorporado sublist / 2 de SICStus verifica si todos los elementos en la primera lista también aparecen en la segunda lista. Este predicado también está disponible en SWI-Prolog a través de la biblioteca de compatibilidad, que la consulta puede cargar
[library(dialect/sicstus/lists)].
.Ejecución de muestra:
El recuento de bytes puede ser técnicamente 0, ya que todo lo que estamos haciendo aquí es realizar consultas, de forma muy similar a cómo ejecutamos un programa y le proporcionamos información.
fuente
PHP, 41 bytes
imprime 1 para verdadero y nada para falso
Si solo se hicieron inserciones de la palabra 1 a la palabra 2, el recuento es cero para los casos verdaderos
levenshtein
Pruébalo en línea!
PHP, 57 bytes
imprime 1 para verdadero y 0 para falso
Crea una expresión regular
Pruébalo en línea!
fuente
.*
es innecesario. -2 bytes: no asignar$argv
a$a
. +24 bytes: necesitaarray_map(preg_quote())
caracteres especiales (use paréntesis como delimitadores para evitar el segundopreg_quote
parámetro).preg_match
no se quejará de una expresión regular vacía mientras los delimitadores estén allí. Simplemente coincidirá con cualquier cosa. Pero preg_quote está a sólo 22 bytes, no 24:array_map(preg_quote,str_split(...))
..*
.Brachylog , 2 bytes
Pruébalo en línea!
Al igual que con esta respuesta,
⊆
es un predicado incorporado que declara una relación entre las variables de entrada y salida, yᵈ
es un meta-predicado que lo modifica para declarar esa misma relación entre el primer y el segundo elemento de la variable de entrada (y unificar la variable de salida con el segundo elemento, pero como este es un problema de decisión que no termina importando aquí).X⊆Y
es una afirmación de que X es una subsecuencia de Y, por lo tanto, también lo es[X,Y]⊆ᵈ
.Este predicado (que, por supuesto, se genera a través del éxito o el fracaso que se imprime
true.
ofalse.
cuando se ejecuta como un programa) toma la entrada como una lista de dos cadenas. Si la entrada es un poco más flexible ...Brachylog , 1 byte
Pruébalo en línea!
Toma la cadena X como la variable de entrada y la cadena Y como la variable de salida. Salidas por éxito o fracaso, como antes. Si se ejecuta como un programa completo, X se proporciona como entrada e Y se proporciona como primer argumento de línea de comando.
fuente
CoffeeScript 73
Aquí hay una respuesta alternativa de CoffeeScript, utilizando expresiones regulares en lugar de recursividad:
Si el pajar coincide con una expresión regular muy codiciosa construida a partir de la aguja, se reemplazará con una cadena vacía. Si el pajar es más corto de lo que comenzó, la aguja era una subsecuencia.
Devuelve falso cuando
x
yy
son ambas cadenas vacías. ¡Cree que necesitamos un filósofo que nos diga si una cadena vacía es una subsecuencia de sí misma!(Publicado como una respuesta separada de mi anterior porque se siente lo suficientemente diferente como para justificarlo).
fuente
PowerShell, 38
Por supuesto, cualquier solución basada en coincidencia de expresiones o patrones tiene graves problemas de rendimiento con cadenas más largas. Pero como la brevedad es el criterio ...
fuente
Una especie de anti-solución que genera todas las subsecuencias de Y:
Python 93
fuente
APL (31)
El manejo de cadenas es un poco escaso en APL.
uso:
fuente
Python 132
Similar al de Daniero. No es la solución más fácil, pero fue divertido intentarlo. Soy nuevo en Python, así que estoy seguro de que podría acortarlo si supiera un poco más.
fuente
Python - 72
fuente
Pitón (
7552)Solución recursiva simple. Golf por primera vez, por lo que cualquier consejo para reducir esto es muy apreciado :)
Probado con lo siguiente:
Gracias a @lirtosiast por algunos ingeniosos trucos booleanos.
fuente
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 bytestoma datos de los argumentos de la línea de comandos; imprime
1
para verdadero, cadena vacía para falso. Corre con-r
.explicación:
strpos
regresafalse
si la aguja$c
no está en el pajar$argv[2]
(después de la posición$p
),haciendo que el lazo se rompa.
strpos
también regresafalse
por una aguja vacía, rompiendo el lazo al final de$argv[1]
.$argv[1]
es una subsecuencia de$argv[2]
,$c
estará vacía cuando se rompa el bucle.strpos
necesita@
suprimir laEmpty needle
advertencia.fuente
+$p
en lugar de$p+1
después de eso no hay necesidad de subrayar+1
es necesario para avanzar en la cadena del pajar; y el guión bajo evita la$p=-1
inicialización. Pero ... puedo evitarlofalse!==
.Swift, 27
fuente