Una contracadena es una especie de datos de prueba autodescriptivos que se utilizan en las pruebas de software. No estoy seguro de que fuera realmente inventado por James Bach , pero lo sé a partir de ahí.
La idea es la siguiente: los datos de prueba contienen muchos asteriscos ( *
). El número delante del asterisco le indica cuánto tiempo duran los datos de la prueba en ese punto. Si necesita conocer una posición en los datos de prueba que no es un asterisco, busque el último asterisco, mire el número anterior y agregue el número de dígitos que siguen.
La secuencia comienza así:
2*4*6*8*11*14*17*20*23*
^
Como puede ver, el asterisco marcado está en la posición 14.
Si un archivo se trunca de la siguiente manera
[...]2045*20
entonces puede deducir que hay un límite de 2047 caracteres en algún lugar (2045 donde el asterisco es más 2 para 2
y 0
).
Es su tarea crear el programa más corto (esto es code-golf ) que genera (std :: out o file o lo que sea) una cadena de prueba larga arbitraria de ese formato. La longitud en caracteres se da como argumento. El programa admitirá hasta 2 GB de datos de prueba (valor de entrada 2147483647 caracteres).
Posiciones "peligrosas" en el archivo de 2 GB:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
Esto debería responder a la pregunta de @Leaky Nun si hay que tomar una decisión entre 995 * 999 * y 995 * 1000 * o similar: no.
El final del archivo de 2 GB con el valor de entrada 2147483647 es:
2147483640*2147483
995*999*
y995*1000*
nada de eso?Respuestas:
Haskell,
6058 bytesComo función obtenemos:
Programa completo,
7270 bytesEsto genera una contracadena infinita a STDOUT:
Ingresar la longitud requiere 20 bytes adicionales:
Esto funciona aproximadamente a su tamaño de RAM, ya que Haskell predetermina los tipos integrales numéricos a
Integer
.fuente
Pyth,
25171514 bytesPruébalo en línea.
La longitud se toma a través de STDIN.
fuente
Python 2,
7472666461 BytesToma un entero n y genera una contracadena de longitud n.
versión del programa, 69 Bytes:
Toma un entero n de stdin e imprime una contracadena de longitud n.
Versión alternativa más corta, pero solo casi funcional:
fuente
PowerShell v5, 97 bytes
Toma la entrada como un argumento de línea de comando
$n
, establece el ayudante$l
que usamos para realizar un seguimiento de nuestra longitud entera. Luego, hacemos un bucle de0
hasta$n
. Cada iteración, incrementamos$i
por.length
la cadena formada a partir de$i
un asterisco. Entonces, si el.length
de$i
cambiado (por ejemplo, pasamos de 2 dígitos a 3 dígitos), incrementamos tanto el ayudante$l
variable de ength y$i
(a la cuenta para el dígito adicional). Luego usamos eladd-content
comando para agregar"$i*"
al archivo.\o
en el directorio actual, con-n
oNewLine.nótese bien
-noNewLine
parámetro finalmente se agregó en esa versión.[int]
a[double]
(no, no sé por qué no funciona[long]
), por lo que manejará correctamente la entrada hasta y2147483648
sin problemas. Teóricamente, manejará la entrada en algún lugar hasta alrededor1.79769313486232E+308
(valor máximo de[double]
) antes de quejarse, pero espero que el disco se llene antes de que eso suceda. ;-)10
esto dará salida2*4*6*8*11*
, ya que11
es el primer$i
valor mayor que la entrada.PowerShell v2 +, también 97 bytes (no competitivos)
En lugar de enviar a un archivo, esto encapsula las iteraciones del bucle y luego
-join
las une en una cadena. Esto le permite funcionar para versiones anteriores a la v5. Sin embargo, dado que .NET define a[string]
con un constructor comoString(char c,Int32 length)
, esta versión no satisface el requisito de entrada máxima, ya que la cadena de salida se desbordará y se barf.Además, es posible que no desee tener una cadena de ~ 2GB flotando en su tubería. Sólo digo'.
fuente
[double]
s son de 64 bits. Por ejemplo, la ejecuciónfor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
mostrará una progresión constante de$i
pero losType
cambios en2147483648
adouble
. Estoy seguro de que en algún momento dejará de funcionar, probablemente alrededor de ~ 15 dígitos de precisión o cuando.ToString
comience a usarsee
. El[double]::MaxValue
era más de una broma de usar y tirar que un serio límite superior.Python 3,
12611499 bytesUna función que toma la entrada a través del argumento del recuento de caracteres en el que truncar la cadena e imprime en STDOUT.
Cómo funciona
La diferencia entre los números en la cadena es inicialmente 2. Cada vez que se pasa un orden de magnitud, esta diferencia aumenta en 1; esto se puede lograr tomando la diferencia entre el número de dígitos del número actual y el número de dígitos del número actual agregado a la diferencia, que es 1 solo cuando es necesario. La función simplemente se repite mientras la longitud de la cadena es menor que la entrada, se agrega a la cadena y actualiza la diferencia y el número según sea necesario, y luego se trunca antes de imprimir.
Pruébalo en Ideone
Versión de salida infinita, 69 bytes.
fuente
R, 92 bytes
Salida de ejemplo:
fuente
Jalea ,
221918 bytesPruébalo en línea!
Encuentra los primeros
n
números en la cadena y luego únete a la lista con un asterisco. Esto siempre será más largo quen
el permitido por OP en los comentarios.El programa actualiza selectivamente el registro con el número actual en la secuencia en el
#
ciclo con¹©=¡
. Esperaba que esto pudiera ser más corto, por ejemplo,©
después del segundoµ
, pero desafortunadamente eso no funciona y no pude resolver nada más corto.fuente