ACTUALIZACIÓN : ¡la presentación Pyth de isaacg es la ganadora!
Muchos de ustedes deben haber escuchado que hay una versión más fresca de JavaScript en la ciudad (lea ES6) que tiene un método String.prototype.repeat
para que puedan hacer
"Hello, World!".repeat(3)
y obten
"Hello, World!Hello, World!Hello, World!"
como la salida
Su trabajo es escribir una función o un programa en un idioma de su elección que detecte si una cadena se ha transformado.
es decir, la cadena de entrada se puede representar como una n
repetición de tiempos exactos de una cadena más pequeña. La salida (como la declaración de retorno de la función o STDOUT) debe ser veraz si la cadena puede ser o falsa si la cadena no se puede representar como una repetición de una cadena más pequeña.
Alguna entrada de muestra:
"asdfasdfasdf" // true
"asdfasdfa" // false
"ĴĴĴĴĴĴĴĴĴ" // true
"ĴĴĴ123ĴĴĴ123" // true
"abcdefgh" // false
Tenga en cuenta que la última entrada es falsa, por lo tanto, n
debe ser mayor que1
Reglas completas
- Escriba una función / programa en cualquier idioma para ingresar (mediante argumento de función / línea de comando args / STDIN) una cadena
- Devuelve / Imprime un valor verdadero si la cadena dada se forma a través de una repetición exacta de una cadena más pequeña, repitiéndose al menos dos veces.
- El tamaño máximo de la cadena de entrada es idealmente Infinito
- La cadena puede tener todos los caracteres ASCII posibles
- Este es un código de golf por lo que gana el código más pequeño en caracteres.
Respuestas:
Pyth , 9
O
Ambas son traducciones cercanas de la respuesta de Python de @ xnor, excepto que toman información de STDIN y la imprimen. El primero es equivalente a:
0 para falso, 1 para verdadero.
La segunda línea es equivalente a:
Falso por Falso, Verdadero por Verdadero.
El compilador oficial de Pyth tenía un error relacionado con el segundo, que acabo de reparar, así que el primero es mi presentación oficial.
fuente
x
fue demasiado largo ...Pitón (24)
Comprueba si la cadena es una subcadena de sí misma concatenada dos veces, eliminando el primer y el último carácter para evitar coincidencias triviales. Si es así, debe ser una permutación cíclica no trivial de sí mismo y, por lo tanto, la suma de segmentos repetidos.
fuente
..+);(;\?)
abcabc
.s+s
lo convierte enabcabcabcabc
. las[1:-1]
chuletas de los dos extremos para cederbcabcabcabcab
. y luegos in ...
trata de encontrarabcabc
como una subcadena de eso. Esta subcadena no se puede encontrar en ninguna de la mitad original, porque ambas se han acortado, por lo que debe abarcar ambas mitades. En particular, debe tener su propio fin antes de su inicio, lo que implica que debe estar formado por subcadenas idénticas (repetidas).ab
seabab
convierte se convierteba
, por lo que devuelve falso, mientras queaa
seaaaa
convierte enaa
, que devuelve verdaderoqweqweqwe
enweqweqweqweqweqw
esTrue
.Regex (sabor ECMAScript), 11 bytes
Suena como un trabajo para expresiones regulares!
Pruébalo aquí.
Elegí ECMAScript, porque es el único sabor (lo sé) en el que
[^]
coincide con cualquier personaje. En todos los demás, necesitaría una bandera para cambiar el comportamiento.
o usar[\s\S]
tres caracteres más largos.Dependiendo de cómo contamos la bandera, eso podría ser, por supuesto, un byte más corto. Por ejemplo, si estamos contando patrón + banderas (por ejemplo, ignorando delimitadores), el equivalente de PCRE / Perl sería
Que es de 10 bytes, ignorando los delimitadores.
Pruébalo aquí.
Esto solo coincide con cadenas que consisten en al menos dos repeticiones de alguna subcadena.
Aquí hay una función ES6 completa de 26 bytes, pero mantengo que los envíos de expresiones regulares son generalmente válidos:
fuente
^(.+)\1+$
funciona para mí, que es de 9 bytes. ¿No te funciona?asd\nasd\nasd\n
. Funciona\
cuando escribo\n
manualmenteCJam, 9
Similar a la idea de xnor.
fuente
)
? Creo que es razonable tener -1 significa FALSO y> = 0 significa VERDADEROg
y?
.#
operador de búsqueda? ¿Seguramente el resultado de eso también es "verdadero" desde la perspectiva de éxito versus fracaso?APL, 11
La explicación
⍞
toma la entrada de la cadena desde las asignaciones de la pantallax←
a la variablex
,⍨
concatena la cadena con la propiax⍷
búsquedax
en la cadena resultante. Devuelve una matriz que consta de 1 en la posición inicial de una coincidencia y 0 en otro lugar.+/
suma la2<
verificación de la matriz si la suma es mayor que 2 (ya que habrá 2 coincidencias triviales)fuente
CJam, 10 bytes
Capté el error de CJam. Mi primera respuesta, por lo que probablemente pueda jugar un poco más:
Salidas -1 para FALSO y un número> = 0 para VERDADERO
fuente
GolfScript, 10 bytes
Otra implementación más de la inteligente idea de xnor.
fuente
)
embargo, su código falta ; cuando no hay coincidencia, se imprimirá-1
. Si va a publicar eso como respuesta, con mucho gusto eliminaré el mío.)
justo antes de que publicaras tu respuesta (edité el comentario)q__+)@+#)
. No funciona en GolfScript.Python -
5957fuente
Bash puro, 30 bytes
Puerto simple de la respuesta inteligente de @xnor :
El código de salida es 0 para VERDADERO y 1 para FALSO:
Nota
=~
dentro[[ ... ]]
es el operador de expresiones regulares en bash . Sin embargo, "se puede citar cualquier parte del patrón para forzarlo a que coincida como una cadena" . Entonces, como a menudo es el caso con bash, es muy importante hacer una cita correcta: aquí solo queremos verificar si hay una subcoincidencia de cadenas y no una coincidencia de expresiones regulares.fuente
TI-BASIC - 32
Pensé en probar un lenguaje tokenizado. Ejecutar con la cadena en Ans, devuelve 0 si es falso y la longitud de la cadena repetida si es verdadero.
Increíble cómo es una línea.
fuente
ECMAScript 6 (189)
¿Seguramente esta es la única solución válida? Por ejemplo, la palabra (cadena)
nana
no se crea necesariamente a partir de"na".repeat(2)
fuente
"nana"
no lo es, pero la pregunta no es probar si.repeat
se usó o no. Más bien, si la cadena es repetida o noECMAScript 6 (34
36)Otra respuesta de ES6, pero sin usar
repeat
y usar el truco de xnor :Debe ejecutarse en la consola de un navegador compatible con ES6 como Firefox.
fuente
C 85
Resultó ser bastante largo, pero las funciones externas siempre son así. Se me ocurrió que podía reescribir cada función de cadena reemplazándolas por un bucle o una recursiva. Pero en mi experiencia, sería más largo y, francamente, no quiero probar eso.
Después de investigar un poco, vi soluciones de alto rendimiento pero no tan inteligentes (y cortas) como las de xnor. solo para ser original ... reescribí la misma idea en c.
explicación:
fuente
ECMAScript 6 (59
626773)No es un ganador, pero parece que al menos debería haber una respuesta en ES6 para esta pregunta que realmente use la
repeat
función:Debe ejecutarse en la consola de un navegador compatible con ES6 como Firefox.
Hace muchas iteraciones innecesarias, pero ¿por qué alargarlo solo para evitar eso, verdad?
fuente
[...i]
lugar dei.split('')
0..N
. ¡Gracias!.slice(0,j)
es un personaje más corto que.substr(0,j)
. Además, la conversión a un entero parece innecesaria|0
puede eliminarse (el uso en|0
realidad reduce la utilidad del método porque fallará en repeticiones que excedan 2 ^ 31).Jalea , 3 bytes
Pruébalo en línea!
Igual que esta respuesta (¿quizás el desafío posterior sea una generalización de esta?).
fuente
Java 8, 28 bytes
Pruébalo en línea.
Explicación:
Comprueba si la cadena de entrada coincide con la expresión regular, donde se
String#matches
agrega implícitamente^...$
para que coincida con la cadena completa.Explicación de la expresión regular en sí:
Por lo tanto, básicamente verifica si una subcadena se repite dos o más veces (admite nuevas líneas).
fuente