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 .

annaes 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 elby el segundoadebananadadoanna.Respuestas:
Perl 5 , 17 bytes (+1?), Programa completo
Pruébalo en línea!
Invoque con la
pbandera 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á
1si 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
lindicador 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
$xy$y, el resultado es el valor de la expresión (en contexto escalar). Tenga en cuenta que$xse modifica en el proceso. (Sí, sé que usar en$_lugar de$xpermitirme guardar cuatro caracteres, pero hacerlo en un fragmento que me parece un poco cursi).¿Como funciona?
La primera parte,
$x=~s//.*/ginserta la cadena.*entre cada carácter en$x. La segunda parte,$y=~$xtrata$xcomo una expresión regular y coincide$ycon 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
nilsixno es una subsecuencia deyy un número de lo contrario (es decir, equivalentes de rubí afalseytrue). 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<=yPython (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?xyymás. En mis funcionesydebe 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
XyY, aunque eso es bastante inusual en GolfScript. Deja1para verdadero o0para 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
ifdeclaració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.lengthnunca será negativo, por lo que puedes guardar un personaje más reemplazándoloif a==0porif a<1. No sé cómo funciona la tokenización de CoffeeScript, pero si funcionaif0como dos tokens, podría guardar dos más invirtiendo ambas condiciones (es decirif1>a).if1>a¡no es válido, peroif!aes y es un personaje más corto! También me di cuenta de que podía afeitarse un carácter adicional convertirb+1abe incrementándolo en la línea anterior, también haciendo el mismoiftruco 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 1727LongestCommonSequencedevuelve 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
>0puede 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
!=0en 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
MatchDatainstancia siaes subsecuencia debonilno.Versión antigua que encuentra subcadena en lugar de subsecuencia
Rubí 15
Usando el
String#[](str)método que devuelvestrifstres una subcadena deselfy!!para devolverBooleansi el valor devuelto puede ser utilizable como boolean (y no necesita sertrueofalse), entonces puede ser solo 13 caracteres:Volverá
nilsiano 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$argva$a. +24 bytes: necesitaarray_map(preg_quote())caracteres especiales (use paréntesis como delimitadores para evitar el segundopreg_quoteparámetro).preg_matchno 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⊆Yes 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
xyyson 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:
{(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} 'anna' 'banana' 1 {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} 'Anna' 'banana' 0 0 {(⊂ '') ∊N ← ⍵ ↓ ⍨¨1, ⍨ = / ⊃¨⍵: ~ × ⍴⊃N⋄∇N} '' 'banana' 1fuente
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
1para verdadero, cadena vacía para falso. Corre con-r.explicación:
strposregresafalsesi la aguja$cno está en el pajar$argv[2](después de la posición$p),haciendo que el lazo se rompa.
strpostambién regresafalsepor una aguja vacía, rompiendo el lazo al final de$argv[1].$argv[1]es una subsecuencia de$argv[2],$cestará vacía cuando se rompa el bucle.strposnecesita@suprimir laEmpty needleadvertencia.fuente
+$pen lugar de$p+1después de eso no hay necesidad de subrayar+1es necesario para avanzar en la cadena del pajar; y el guión bajo evita la$p=-1inicialización. Pero ... puedo evitarlofalse!==.Swift, 27
fuente