Dadas as cadeias X e Y, determine se X é uma subsequência de Y. A cadeia vazia é considerada uma subsequência de todas as cadeias. (Por exemplo, ''
e 'anna'
são subsequências de 'banana'
.)
Entrada
- X, uma sequência alfanumérica possivelmente sensível a maiúsculas e minúsculas
- Y, uma sequência alfanumérica sensível a maiúsculas e minúscula
Saída
- Verdadeiro ou falso (ou equivalente), indicando corretamente se X é uma subsequência de Y.
Exemplos de E / S
X Y output
'' 'z00' True
'z00' 'z00' True
'z00' '00z0' False
'aa' 'anna' True
'anna' 'banana' True
'Anna' 'banana' False
Critério
- O programa mais curto vence, conforme determinado pelo número de bytes do código fonte.
Programas de exemplo
- Vários programas que podem ser adaptados estão nesta postagem relacionada .
anna
é uma subsequência (mas não uma substring) debanana
. A cadeia X é uma subsequência da cadeia Y apenas se X puder ser obtido de Y excluindo zero ou mais dos elementos de Y; por exemplo, excluir ob
e o segundoa
debanana
doaçõesanna
.Respostas:
Perl 5 , 17 bytes (+1?), Programa completo
Experimente online!
Invoque com o
p
sinalizador para o interpretador perl, como emperl -pe 's//.*/g;$_=<>=~$_'
. De acordo com as regras de pontuação estabelecidas quando este desafio foi lançado originalmente , esse sinalizador custa um byte extra. Sob regras mais recentes , AFAICT, pode ser gratuito.De qualquer forma, as cadeias de entrada devem ser fornecidas em linhas separadas por nova linha no stdin. A saída (para stdout) será
1
se a primeira string de entrada for uma subcadeia da segunda, ou nada se não for.Observe que ambas as linhas de entrada devem ter uma nova linha no final, ou o programa não funcionará corretamente. Como alternativa, você pode adicionar o
l
sinalizador de linha de comando à chamada para fazer com que o perl descubra as novas linhas; dependendo das regras de pontuação em vigor, isso pode ou não custar um byte extra. Observe que o uso desse sinalizador também acrescentará uma nova linha à saída.Versão original (fragmento, 18 bytes / caracteres)
A entrada é fornecida nas variáveis
$x
e$y
, result é o valor da expressão (no contexto escalar). Observe que$x
é modificado no processo. (Sim, eu sei que usar em$_
vez de$x
me permitiria salvar quatro caracteres, mas fazer isso em um snippet que parece um pouco brega demais para mim.)Como funciona?
A primeira parte
$x=~s//.*/g
,, insere a sequência.*
entre cada caractere$x
. A segunda parte ,,$y=~$x
trata$x
como uma expressão regular e combina$y
com ela. Nas regexps Perl,.*
corresponde a zero ou mais caracteres arbitrários, enquanto todos os caracteres alfanuméricos se combinam convenientemente.fonte
Ruby, 32 caracteres
Esta solução retorna
nil
sex
não for uma subsequência dey
e um número de outra forma (ou seja, equivalentes a rubyfalse
e etrue
). Exemplos:fonte
y=~/#{[*x.chars]*".*"}/
(23 caracteres). Felicidades!y=~/#{x.split("")*".*"}/
(21 caracteres) :)y=~
enquanto mexer com esta no IRB ...Haskell,
5137.Agradecemos a Hammar pela melhoria substancial. Agora é uma função infix, mas parece não haver razão para que não deva.
Demonstração:
fonte
s x y=x<=y
. Além disso, você pode economizar um pouco mais, tornando-o um operador e usando um@
padrão-em vez de(f:l)
. Isso reduz para 37 caracteres:h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y
Python (48 caracteres)
A mesma abordagem que a resposta Ruby de Howard. Pena que o Python precise importar o pacote regex e seu "verbose"
lambda
. :-)fonte
Python, 59 caracteres
Imaginei que minha resposta seria melhor expressa em Python.
Editar: Adicionado sugestões de res.
fonte
x="a"
ey="ab"
você sairia do loop comy=="b"
e retornariafalse
?x
ey
para cima. Em minhas funçõesy
precisa ser uma subsequência dex
. Acho melhor mudá-los para evitar qualquer confusão.def s(x,y): for c in y: if x:x=x[c==x[0]:] return x==""
. Ele não é exibido corretamente em um comentário, mas acho que você pode entender o que quero dizer. (Além disso, um espaço adicional é suficiente para aumentar o nível de recuo.)''
e salvar vários caracteres escrevendox=x[c==x[0:1]:]
GolfScript (22 caracteres)
Assume que a entrada é tomada como duas variáveis predefinidas
X
eY
, embora isso seja bastante incomum no GolfScript. Folhas1
para verdadeiro ou0
falso na pilha.fonte
C (52 caracteres)
Casos de teste
fonte
s(char*x,char*y){x=!*x||*y&&s(x+(*x==*y),y+1);}
Burlesco (6 caracteres)
6 caracteres em burlesco:
R@\/~[
(supondo que xey estejam na pilha. Veja aqui em ação.)fonte
C, 23:
resultar em * x
http://ideone.com/BpITZ
fonte
PHP, 90 caracteres
fonte
if
instrução e simplificar para$x=substr($x,$y[$a++]==$x[0])
: ideone.com/Ch9vKScala 106:
fonte
CoffeeScript
1121009589Minha primeira tentativa no código de golfe ... espero não envergonhar minha família!
Edit : Acontece que Coffeescript é mais tolerante do que eu pensava com espaço em branco.
Obrigado a res e Peter Taylor por algumas dicas para torná-lo um pouco mais elegante
fonte
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]
. (Em alguns navegadores, por exemplo, Chrome, você pode ver comentário de código exibido corretamente clicando com o botão direito, em seguida, Inspect Element.)a.length
nunca será negativo; portanto, você pode salvar mais um caractere substituindoif a==0
porif a<1
. Não sei como funciona a tokenização do CoffeeScript, mas, se houverif0
dois tokens, você poderá economizar mais dois, revertendo as duas condições (ou sejaif1>a
).if1>a
não é válido, masif!a
é e é um personagem mais curto! Também percebi que podia barbear um caractere extra convertendob+1
-ob
e incrementando-o na linha anterior, tornandoif
possível o mesmo truque, pois estava lidando com uma situação de 0 / não-0.C #,
7011310790 caracteresfonte
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(...)
, mas ainda é maior que a versão atualizada do Linq. Bom uso deAny
!Mathematica
19 1727LongestCommonSequence
retorna a subsequência não contígua mais longa de duas seqüências. (Não deve ser confundido comLongestCommonSubsequence
, que retorna a subsequência contígua mais longa.A seguir, verifica se a subsequência contígua mais longa é a primeira das duas seqüências. (Portanto, você deve inserir a sequência mais curta seguida pela sequência maior.)
Exemplos
Verdadeiro Verdadeiro Verdadeiro Falso
O teste crítico é o terceiro, porque "anna" está contido de forma não contígua na "banana".
fonte
Python 3.8 (pré-lançamento) , 42 bytes
Experimente online!
Python 3.8 (pré-lançamento) , 48 bytes
Experimente online!
Python 2 , 48 bytes
Experimente online!
Copiado desta resposta de Lynn . O
>0
pode ser omitido se apenas truthy / Falsey saída é OK.Python 2 , 50 bytes
Experimente online!
Python 2 , 50 bytes
Experimente online!
fonte
C -
74 7164Isso não supera a solução de Peter Taylor, mas acho que é bem divertido
(além disso, este é um programa de trabalho completo, não apenas uma função)E não destruído:
Para testá-lo, você pode fazer algo como:
fonte
!=0
em uma condição é um pouco detalhado ... Programa versus função é algo que a pergunta precisa especificar claramente, e aqui não, então as respostas têm opções diferentes.!='\0'
é um péssimo (bom?) Hábito de escrever código que não seja de golfe. Eu deixei isso entrar nas minhas duas últimas rodadas de golfe; terei que ter mais cuidado no futuro. Quanto ao programa versus função, sim, você está absolutamente certo.Python,
66.6259.58 caracteresUma solução divertida, definitivamente um problema interessante.
fonte
Ruby
323028Isso retornará a
MatchData
instância sea
for subsequenteb
ounil
não.Versão antiga que encontra substring em vez de subsequência
Ruby 15
Usando o
String#[](str)
método que retornastr
ifstr
é uma substring deself
e!!
para retornarBoolean
se o valor retornado pode ser usado como booleano (e não precisa sertrue
orfalse
), pode ser de apenas 13 caracteres:Ele retornará
nil
sea
não for uma substring deb
.fonte
SWI-Prolog, SICStus
O predicado interno sublist / 2 do SICStus verifica se todos os itens na primeira lista também aparecem na segunda lista. Esse predicado também está disponível no SWI-Prolog através da biblioteca de compatibilidade, que pode ser carregada pela consulta
[library(dialect/sicstus/lists)].
.Exemplo de execução:
Tecnicamente, a contagem de bytes pode ser 0, uma vez que tudo o que estamos fazendo aqui é a consulta, assim como executamos um programa e fornecemos entrada para ele.
fonte
PHP, 41 bytes
imprime 1 para verdadeiro e nada para falso
Se apenas inserções da palavra 1 à palavra 2 concluídas, a contagem é zero para casos verdadeiros
levenshtein
Experimente online!
PHP, 57 bytes
imprime 1 para verdadeiro e 0 para falso
Cria um Regex
Experimente online!
fonte
.*
é desnecessário. -2 bytes: não atribuir$argv
a$a
. +24 bytes: necessidadesarray_map(preg_quote())
de caracteres especiais (Use parênteses como delimitadores para evitar segundopreg_quote
parâmetro.)preg_match
não reclamará de uma regex vazia enquanto os delimitadores estiverem lá. Combina apenas com qualquer coisa. Mas preg_quote é de apenas 22 bytes, não +24:array_map(preg_quote,str_split(...))
..*
.Braquilog , 2 bytes
Experimente online!
Como com esta resposta,
⊆
é um predicado interno que declara um relacionamento entre as variáveis de entrada e saída eᵈ
é um meta-predicado que o modifica para declarar o mesmo relacionamento entre o primeiro e o segundo elementos da variável de entrada (e unificar a variável de saída com o segundo elemento, mas como esse é um problema de decisão que não acaba importando aqui).X⊆Y
é uma afirmação de que X é uma subsequência de Y, portanto, é[X,Y]⊆ᵈ
.Esse predicado (que, é claro, gera sucesso ou falha que é impressa
true.
oufalse.
quando é executado como um programa) recebe a entrada como uma lista de duas seqüências. Se a entrada é um pouco mais flexível ...Braquilog , 1 byte
Experimente online!
Leva a string X como a variável de entrada e a string Y como a variável de saída. Saídas por sucesso ou fracasso, como antes. Se executado como um programa completo, X é fornecido como entrada e Y é fornecido como o primeiro argumento da linha de comandos.
fonte
CoffeeScript 73
Aqui está uma resposta alternativa do CoffeeScript, usando expressões regulares em vez de recursão:
Se o palheiro corresponder a um regex muito ganancioso construído a partir da agulha, ele será substituído por um fio vazio. Se o palheiro é mais curto do que começou, a agulha foi uma subsequência.
Retorna false quando
x
ey
são duas strings vazias. Pense que precisamos de um filósofo para nos dizer se uma sequência vazia é uma subsequência de si mesma!(Publicado como uma resposta separada da minha anterior, porque parece diferente o suficiente para justificá-la).
fonte
PowerShell, 38
Obviamente, qualquer solução baseada em correspondência de padrão ou regex tem graves problemas de desempenho com cadeias mais longas. Mas como a falta é o critério ...
fonte
Uma espécie de anti-solução gerando todas as subsequências de Y:
Python 93
fonte
APL (31)
O manuseio de strings é um pouco ausente no APL.
uso:
fonte
Python 132
Semelhante ao Daniero. Não é a solução mais fácil, mas foi divertido tentar. Eu sou novo no Python, então tenho certeza de que poderia reduzi-lo se soubesse um pouco mais.
fonte
Python - 72
fonte
Python (
7552)Solução recursiva simples. Golfe pela primeira vez, por isso todas as dicas sobre como reduzir isso são muito apreciadas :)
Testado com o seguinte:
Obrigado a @lirtosiast por alguns truques booleanos inteligentes.
fonte
s=lambda a,b:a==''or b>''and s(a[a[0]==b[0]:],b[1:])
PHP,
756564 bytesrecebe entrada de argumentos de linha de comando; imprime
1
para true, string vazia para false. Corra com-r
.explicação:
strpos
retornafalse
se a agulha$c
não estiver no palheiro$argv[2]
(depois da posição$p
),causando a ruptura do laço.
strpos
também retornafalse
para uma agulha vazia, interrompendo o ciclo no final de$argv[1]
.$argv[1]
é uma subsequência de$argv[2]
,$c
ficará vazio quando o loop for interrompido.strpos
precisa@
suprimir oEmpty needle
aviso.fonte
+$p
em vez de$p+1
depois disso, não há necessidade de sublinhado+1
é necessário para avançar na corda do palheiro; e o sublinhado evita a$p=-1
inicialização. Mas ... eu posso evitarfalse!==
.Swift, 27
fonte