ATUALIZAÇÃO : O envio de Pyth de isaacg é o vencedor!
Muitos de vocês devem ter ouvido falar que existe uma versão mais legal do JavaScript na cidade (leia ES6), que possui um método String.prototype.repeat
para que você possa fazer
"Hello, World!".repeat(3)
e pegue
"Hello, World!Hello, World!Hello, World!"
como a saída.
Seu trabalho é escrever uma função ou um programa em um idioma de sua escolha, que detecta se uma string foi submetida a essa transformação.
ou seja, a sequência de entrada pode ser representada como uma n
repetição exata de uma sequência menor. A saída (como instrução de retorno da função ou STDOUT) deve ser verdadeira se a sequência puder ser ou falsificada se a sequência não puder ser representada como uma repetição de uma sequência menor.
Alguma amostra de entrada:
"asdfasdfasdf" // true
"asdfasdfa" // false
"ĴĴĴĴĴĴĴĴĴ" // true
"ĴĴĴ123ĴĴĴ123" // true
"abcdefgh" // false
Observe que a última entrada é falsa, portanto n
deve ser maior que1
Regras completas
- Escreva uma função / programa em qualquer idioma para inserir (via argumento da função / linha de comando args / STDIN) uma string
- Retorne / imprima o valor da verdade se a sequência especificada for formada através de uma repetição exata de uma sequência menor, repetindo pelo menos duas vezes.
- O tamanho máximo da sequência de entrada é idealmente Infinito
- A cadeia pode ter todos os caracteres ASCII possíveis
- Este é um código de golfe, pelo que o menor código em caracteres vence.
Respostas:
Pitão , 9
Ou
Ambas são traduções aproximadas da resposta python do @ xnor, exceto que elas recebem a entrada do STDIN e a imprimem. O primeiro é equivalente a:
0 para Falso, 1 para Verdadeiro.
A segunda linha é equivalente a:
Falso para Falso, Verdadeiro para Verdadeiro.
O compilador oficial do Pyth tinha um bug relacionado ao segundo, que acabei de corrigir, então o primeiro é o meu envio oficial.
fonte
x
era muito longo ...Python (24)
Verifica se a cadeia de caracteres é uma subcadeia de si concatenada duas vezes, eliminando o primeiro e o último caracteres para evitar correspondências triviais. Se for, deve ser uma permutação cíclica não trivial de si mesma e, portanto, a soma de segmentos repetidos.
fonte
..+);(;\?)
abcabc
.s+s
transforma issoabcabcabcabc
. as[1:-1]
costeletas dos dois terminambcabcabcabcab
. e, em seguida,s in ...
tenta encontrarabcabc
como uma substring disso. Essa substring não pode ser encontrada em nenhuma das metades originais, porque ambas foram reduzidas e, portanto, deve abranger as duas metades. Em particular, ele deve ter seu próprio fim antes do início, o que implica que deve ser composto de substrings idênticos (repetidos).ab
torna-abab
se torna- seba
, então retorna falso, enquantoaa
torna-aaaa
se torna- seaa
, que retorna verdadeiro.qweqweqwe
inweqweqweqweqweqw
isTrue
.Regex (sabor ECMAScript), 11 bytes
Parece um trabalho para regex!
Teste aqui.
Eu escolhi o ECMAScript, porque é o único sabor (eu sei) que
[^]
corresponde a qualquer caractere. Em todos os outros, eu precisaria de um sinalizador para alterar o comportamento.
ou usar[\s\S]
três caracteres a mais.Dependendo de como contamos a bandeira, é claro que isso pode ser um byte mais curto. Por exemplo, se estivermos contando padrão + sinalizadores (por exemplo, ignorando delimitadores), o equivalente PCRE / Perl será
Qual é 10 bytes, ignorando os delimitadores.
Teste aqui.
Isso corresponde apenas às seqüências de caracteres que consistem em pelo menos duas repetições de alguma substring.
Aqui está uma função ES6 completa de 26 bytes, mas afirmo que os envios de expressões regulares geralmente são válidos:
fonte
^(.+)\1+$
funciona para mim, que é de 9 bytes. Isso não funciona para você?asd\nasd\nasd\n
. Funciona\
quando eu escrever\n
manualmenteCJam, 9
Semelhante à idéia de xnor.
fonte
)
? Eu acho que é razoável ter -1 significa FALSO e> = 0 significa VERDADEIROg
e?
.#
operador de localização? Certamente o resultado disso também é "verdadeiro" do ponto de vista do sucesso versus do fracasso?APL, 11
A explicação
⍞
utiliza a entrada de seqüência de caracteres da telax←
atribuída à variávelx
,⍨
concatena a seqüência de caracteres que elax⍷
procurax
na sequência resultante. Retorna uma matriz que consiste em 1 na posição inicial de uma partida e 0 em outro lugar.+/
soma a matriz,2<
verifique se a soma é maior que 2 (pois haverá 2 correspondências triviais)fonte
CJam, 10 bytes
Eu peguei o bug CJam. Minha primeira resposta, então provavelmente pode ser jogado um pouco mais:
Saídas -1 para FALSE e um número> = 0 para TRUE
fonte
GolfScript, 10 bytes
Mais uma implementação da idéia inteligente do xnor.
fonte
)
; quando não houver correspondência, ela será impressa-1
. Se você postar isso como resposta, excluirei o meu com prazer.)
logo antes que você postou sua resposta (I editou o comentário)q__+)@+#)
. Não funciona no GolfScript.Python -
5957fonte
Festa pura, 30 bytes
Porta simples da resposta inteligente do @ xnor :
O código de saída é 0 para TRUE e 1 para FALSE:
Observe que
=~
dentro[[ ... ]]
é o operador regex no bash . No entanto, "qualquer parte do padrão pode ser citada para forçá-lo a corresponder como uma sequência" . Então, como geralmente acontece com o bash, é muito importante fazer uma citação correta - aqui, queremos apenas verificar se há uma sub-correspondência de string e não uma correspondência de regex.fonte
TI-BASIC - 32
Eu pensei em experimentar uma linguagem tokenizada. Execute com a string em Ans, retornará 0 se false e o comprimento da string repetida se true.
Incrível como é uma linha.
fonte
ECMAScript 6 (189)
Certamente esta é a única solução válida? Por exemplo, a palavra (string)
nana
não é necessariamente criada a partir de"na".repeat(2)
fonte
"nana"
não é, mas a questão não está testando se.repeat
foi usada ou não. Em vez disso, se a cadeia é um repetida uma ou nãoECMAScript 6 (34
36)Outra resposta do ES6, mas sem usar
repeat
e usar o truque do xnor :Deve ser executado no console de um navegador compatível com ES6, como o Firefox.
fonte
C 85
Acabou sendo bastante longo, mas as funções externas são sempre assim. Me ocorreu que eu poderia reescrever todas as funções de string substituindo-as por um loop ou por uma recursiva. Mas na minha experiência, ficaria mais tempo e, francamente, não quero tentar isso.
Após algumas pesquisas, vi soluções de alto desempenho, mas não tão inteligentes (e curtas) quanto as do xnor. apenas para ser original ... reescrevi a mesma idéia em c.
explicação:
fonte
ECMAScript 6 (59
626773)Não é um vencedor, mas parece que deveria haver pelo menos uma resposta realmente no ES6 para esta pergunta que realmente usa a
repeat
função:Deve ser executado no console de um navegador compatível com ES6, como o Firefox.
Faz muitas iterações desnecessárias, mas por que prolongar apenas para evitar isso, certo?
fonte
[...i]
, em vez dei.split('')
0..N
. Obrigado!.slice(0,j)
é um caractere menor que.substr(0,j)
. Além disso, a conversão para um número inteiro parece desnecessária e|0
pode ser removida (o uso|0
na verdade reduz a utilidade do método, pois falhará em repetições que excedam 2 ^ 31).Gelatina , 3 bytes
Experimente online!
O mesmo que esta resposta (talvez o desafio posterior seja uma generalização dessa?).
fonte
Java 8, 28 bytes
Experimente online.
Explicação:
Verifica se a String de entrada corresponde ao regex, onde é
String#matches
incluído implicitamente^...$
para corresponder à String inteira.Explicação do próprio regex:
Portanto, basicamente verifica se uma substring é repetida duas ou mais vezes (suportando novas linhas).
fonte