Uma contraparte é algum tipo de dado de teste autoexplicativo usado nos testes de software. Não tenho certeza se foi realmente inventado por James Bach , mas eu sei disso a partir daí.
A ideia é a seguinte: os dados de teste contêm muitos asteriscos ( *
). O número na frente do asterisco informa quanto tempo os dados do teste estão nesse ponto. Se você precisar conhecer uma posição nos dados de teste que não é um asterisco, localize o último asterisco, verifique o número anterior e adicione o número de dígitos a seguir.
A sequência começa assim:
2*4*6*8*11*14*17*20*23*
^
Como você pode ver, o asterisco marcado está na posição 14.
Se um arquivo estiver truncado da seguinte maneira
[...]2045*20
então você pode derivar que há um limite de 2047 caracteres em algum lugar (2045 onde o asterisco é mais 2 para 2
e 0
).
É sua tarefa criar o programa mais curto (este é o código-golfe ) que gera (std :: out ou arquivo ou qualquer outra coisa) uma sequência de testes longa arbitrária desse formato. O comprimento em caracteres é dado como argumento. O programa deve suportar até 2 GB de dados de teste (valor de entrada 2147483647 caracteres).
Posições "perigosas" no arquivo de 2 GB:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
Isso deve responder à pergunta de @Leaky Nun se houver uma decisão a tomar entre 995 * 999 * e 995 * 1000 * ou similar: não.
O final do arquivo de 2 GB com o valor de entrada 2147483647 é:
2147483640*2147483
995*999*
e995*1000*
ou algo assim?Respostas:
Haskell,
6058 bytesComo função, obtemos:
Programa completo,
7270 bytesIsso gera uma contraparte infinita para STDOUT:
A entrada do comprimento requer 20 bytes adicionais:
Isso funciona com o tamanho aproximado do seu RAM, já que Haskell usa como padrão os tipos integrais numéricos
Integer
.fonte
Pitão,
25171514 bytesExperimente online.
O comprimento é obtido via STDIN.
fonte
Python 2,
7472666461 bytesPega um número inteiro n e gera uma cadeia de caracteres de comprimento n.
versão do programa, 69 bytes:
Pega um número inteiro n de stdin e imprime uma cadeia de caracteres de comprimento n.
Versão alternativa mais curta, mas apenas quase funcional:
fonte
PowerShell v5, 97 bytes
Recebe a entrada como um argumento da linha de comando
$n
, define o auxiliar$l
que usamos para acompanhar nosso comprimento inteiro. Então, fazemos um loop de0
até$n
. Cada iteração, incrementamos$i
pela.length
da corda formada a partir$i
e um asterisco. Então, se o.length
de$i
mudou (por exemplo, passamos de 2 para 3 dígitos), incrementamos a$l
variável de entrada do auxiliar e$i
(para contabilizar o dígito adicional). Em seguida, usamos oadd-content
comando para anexar"$i*"
ao arquivo.\o
no diretório atual, com-n
oNewLine.NB
-noNewLine
parâmetro foi finalmente adicionado nessa versão.[int]
para[double]
(não, não sei por que não vai[long]
), portanto, isso manipulará adequadamente as entradas até e maiores que2147483648
, sem problemas. Teoricamente, ele manipulará a entrada em algum lugar1.79769313486232E+308
(valor máximo de[double]
) antes de reclamar, mas espero que o disco seja preenchido antes que isso aconteça. ;-)10
isso será exibido2*4*6*8*11*
, pois11
é o primeiro$i
valor maior que a entrada.PowerShell v2 +, também 97 bytes (não concorrente)
Em vez de enviar para um arquivo, isso encapsula as iterações do loop e
-join
as reúne em uma string. Isso permite que ele funcione para versões anteriores à v5. No entanto, como o .NET define a[string]
com um construtorString(char c,Int32 length)
, essa versão não atende ao requisito máximo de entrada, já que a sequência de saída transbordará e será vomitada.Além disso, você pode não querer ter uma seqüência de ~ 2 GB flutuando no seu pipeline. Apenas dizendo'.
fonte
[double]
s são de 64 bits. Por exemplo, a execuçãofor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
mostrará uma progressão constante de$i
mas asType
alterações em2147483648
paradouble
. Tenho certeza de que em algum momento ele irá parar de funcionar, provavelmente em torno de ~ 15 dígitos de precisão ou quando.ToString
começar a usare
. A[double]::MaxValue
era mais uma piada descartável do que um sério limite superior.Python 3,
12611499 bytesUma função que recebe entrada via argumento da contagem de caracteres na qual truncar a string e imprime em STDOUT.
Como funciona
A diferença entre os números na sequência é inicialmente 2. Toda vez que uma ordem de magnitude é passada, essa diferença é aumentada em 1; isso pode ser alcançado considerando a diferença entre o número de dígitos do número atual e o número de dígitos do número atual adicionado à diferença, que é 1 somente quando necessário. A função simplesmente faz um loop enquanto o comprimento da string é menor que a entrada, anexa à string e atualiza a diferença e o número conforme necessário e, em seguida, trunca antes da impressão.
Experimente no Ideone
Versão de saída infinita, 69 bytes
fonte
R, 92 bytes
Exemplo de saída:
fonte
Geléia ,
221918 bytesExperimente online!
Encontre os primeiros
n
números na string e entre na lista com um asterisco. Isso sempre será mais longo don
que o permitido pelo OP nos comentários.O programa atualiza seletivamente o registro com o número atual na sequência no
#
loop com¹©=¡
. Eu esperava que isso pudesse ser mais curto, colocando©
após o segundo,µ
por exemplo, mas infelizmente isso não funciona e eu não consegui descobrir nada mais curto.fonte