Neste desafio, você recebe uma string como entrada contendo uma string de X, Y e Z, por exemplo. "XYZZ". X, Y e Z representam um caractere específico. Esse padrão é então comparado com uma segunda entrada de string. Se o padrão existir como uma substring na segunda entrada, retorne True
, caso contrário, retorne False
. Depois que um padrão é encontrado na palavra, o programa para de pesquisar e retorna True
.
Exemplos
Padrão: "XXYY"
succeed ---> True (pattern found: ccee)
success ---> False (pattern not matched)
balloon ---> True (pattern found: lloo)
Padrão: "XYXYZ"
bananas ---> True (pattern found: nanas)
banana ---> False (pattern not found)
- Nota: Esta não é a entrada real. Este é um exemplo de como o programa deve funcionar. Seu programa deve produzir
True
ouFalse
, ou outros valores de Truthy / Falsy.
Outras informações importantes / úteis
- O padrão não precisa conter um X, Y e um Z, pode conter X e Y ou mesmo (embora um pouco inútil) apenas X.
- O padrão não pode estar vazio, mas isso não será usado como um caso de teste.
- A cadeia de pesquisa não estará vazia e será minúscula.
- A ordem alfabética de X, Y e Z no padrão não importa.
- X, Y e Z devem ser caracteres únicos.
- Você pode usar qualquer biblioteca que desejar.
- A pontuação é determinada pelo tamanho do código , em bytes. Menor pontuação ganha.
Boa sorte!
Respostas:
Perl 5 , 85 bytes
Economizou 40 bytes graças à sugestão de Peter Taylor! (veja minha versão mais antiga abaixo para ver as diferenças)
83 bytes de código +
-pl
sinalizador.Experimente online!
O XYXYZ é transformado em
((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)
(sim, alguns dos testes não podem ser verdadeiros, mas são mais curtos), e a segunda entrada é então verificada nesse regex. (veja as explicações da minha versão mais antiga para obter mais intuição de como ela funciona)Minha versão mais antiga:
Obrigado a Arnauld por apontar um erro que cometi na minha primeira versão.
113 bytes de código +
-pl
sinalizadores e-Mre=eval
.Experimente online!
Por exemplo XYXYZ: (.) (.) (.) A primeira regex irá converter o padrão de \ 1 \ 2, e adicionar no final de um teste para verificar se
$1
,$2
e$3
são diferentes: em caso afirmativo,$\
é definido como um. Em seguida, a segunda entrada é testada contra esse regex e$\
é implicitamente impressa no final.O regex gerado para XYXYZ é
(.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^
.(Vou acrescentar mais detalhes às explicações quando tiver um momento)
fonte
(.)((?!\1).)\1\2((?!\1)(?!\2).)
?Geléia , 9 bytes
Retorna o número de vezes que o padrão foi encontrado, sendo diferente de zero e zero sendo falso.
Experimente online!
Como funciona
fonte
JavaScript (ES6), 94 bytes
Funciona transformando o padrão em uma regexp, por exemplo, para
XYXYZ
gerar/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/
.Percebo uma distinção interessante entre PCRE e JavaScript regexp: no PCRE,
\<n>
falha (e, portanto,(?!\<n>)
é bem - sucedido) antes que o grupo de captura seja definido, enquanto o JavaScript corresponde com êxito à string vazia (e, portanto,(?!\<n>)
falha).fonte
Python 2 , 70 bytes
Experimente online!
Verifica se uma sequência corresponde a um padrão usando o método nesta resposta . Usa um prefixo da sequência de pesquisa cujo comprimento é igual ao padrão. Retira o primeiro caractere da string até encontrar uma correspondência ou
False
se ela ficar vazia73 bytes:
Experimente online
Verifica se uma sequência corresponde a um padrão usando o método nesta resposta . Verifica recursivamente todas as substrings, ramificando para remover o primeiro ou o último caractere até que a sequência esteja vazia.
fonte
Python 3 , 100 bytes
Experimente online!
fonte
05AB1E ,
1916 bytesExperimente online!
Retornará 1 se verdadeiro, nulo se não for verdadeiro.
Isso pode ter 14 bytes se o retorno dos possíveis valores de XYZ for permitido:
05AB1E , 14 bytes
Experimente online 2!
fonte
1
eTrue
(o que geralmente é uma desvantagem para esse tipo de desafio), mas se a especificação de desafio puder ser interpretada como permitindo definir verdade / falsidade para o desafio a segunda versão funciona como você diz.Java 7,
177176173 bytesExplicação:
Código do teste:
Experimente aqui.
Saída:
fonte
PHP, 89 bytes
Um presente de @Christoph e @Titus
PHP, 105 bytes
Um presente de @Christoph
PHP, 167 bytes
fonte
++$p
vez de($p+1)
, embora eu não o tenha testado.[,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);
.[,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);
(Note que você deve manter suas velhas usando<strike>
)!
. Vale mais a pena os pontos que eu poderia alcançar com sua boa solução.$argv
para$a
e$b
; -6 bytes comfor(;a&$v=$argv[1][$i++];)
; -1 byte com nomes de variáveis mais longos ( de fato! : Use$vv
em vez de$v
,$ii
em vez de$i
,$rr
em vez de$r
,$yy
em vez de$y
e você pode usar$$vv
em vez de$x[$v]
)C #,
184165155 bytesobrigado aloisdg!
solução de retorno, como bônus, funciona com um padrão com qualquer personagem!
fonte
var s=l==n.Length;
? Você o usa apenas emreturn s?!s:
(onde!s
é semprefalse
), para que possa ser alterado parareturn l==n.Length?0>1:
. Além disso, o que é esta:(n[i]!=n[j]||n[i]!=n[j])
. Você verifican[i]!=n[j]
duas vezes .. Isso sempre serátrue or true
/false or false
..: Sint l = p.Length,i = 0, j;
i++
e o seuj--
dentro do loop for. por exemplo:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
Ruby,
6361 bytesEm vez de procurar um padrão regex, tente substituir 'X', 'Y' e 'Z' de todas as maneiras possíveis e encontre uma correspondência literal.
(Na verdade, o mesmo conceito da resposta 05AB1E da carusocomputing)
fonte
JavaScript (ES6),
92898786 bytesPega entrada
p
(padrão) es
(string) na sintaxe de currying(p)(s)
. Retorna0
/1
.Formatado e comentado
Casos de teste
fonte
Mathematica 18 caracteres (sem contar a sequência e o padrão)
Exemplos:
True
True
fonte