Às vezes, durante o golfe, é necessário representar um número grande (s) em seu código. Escrevê-los como estão pode aumentar significativamente a contagem de bytes.
O que em geral 1 dicas você daria para representar números longos concisa em código?
Poste uma dica por resposta.
1 Em geral , quero dizer dicas que podem ser aplicadas a mais de um único idioma. Para obter dicas específicas do idioma, poste no respectivo segmento.
Respostas:
Procure números especiais
Alguns idiomas possuem funções internas para quadrados, exponenciação com procedimentos de base 2, n- ésima primação, fatorial ou outros que podem gerar números grandes. Verifique se o seu número se enquadra em qualquer uma dessas categorias.
E se isso não acontecer, pode acontecer que um número maior seja adequado aos seus objetivos e possa ser usado.
fonte
1.01e6
iterações forem suficientes,1e7
economiza 3 bytes à custa do tempo de execução.Use operadores booleanos bit a bit
Alguns idiomas têm AND, OR, XOR e, às vezes, NÃO.
Expressar um número grande específico como uma combinação bit a bit de resultado de uma exponenciação ou deslocamento à esquerda e outro número pode levá-lo exatamente ao número necessário. Isso geralmente só vale a pena se os números ficarem muito grandes.
Por exemplo,
2147483722
são 10 bytes, mas2<<30^74
(2 ^ 31 bits por XOR com 74) é apenas 8.fonte
bc
). E o XOR nunca é mais útil que+
e-
: nesse caso, xor e add fornecem o mesmo resultado, mas em todos os casos há algum número inteiro que pode ser adicionado ou subtraído para produzir o mesmo resultado que xor com um número inteiro, e o addend é não maior e às vezes menor.1e9^2e9
.9<<49^7<<19
usando adição em vez de xor?1286561280
em JavaScript e Perl (e provavelmente em outros idiomas), e é uma expressão mais curta para produzir esse valor do que o equivalente usando+
or-
.Use Strings para números repetitivos
Para números de natureza muito repetitiva, você pode usar Strings e convertê-los em Inteiro. Por exemplo, em JavaScript
fonte
1e100/9
neste caso.Usar notação científica
A notação científica pode salvar bytes em caso de números longos. Por exemplo:
fonte
3564e-8
nesse caso?.00003564
, que também é um byte mais curto novamente.Procure outro número para usar
Isso pode parecer uma não resposta, mas nem sempre é óbvio que um número maior possa ser calculado por um código mais curto. Um exemplo que me lembro é o Output a googol, cópias de uma string , em que as respostas óbvias exigem computação 10 100 . Como se vê, calcular qualquer múltiplo de 10 100 leva a uma resposta igualmente correta, mas em alguns idiomas, mais curta. A resposta de Dennis usa 100 100 , a minha usa 250 255 .
fonte
es
se você só precisa de um grande número, mas não se preocupam com o seu valor (ou que é sempre o mesmo).Compressão de Base
O código de descompressão de base pode ser bastante complexo, mas se você tiver um número realmente enorme, às vezes pode ajudar a compactá-lo em uma base superior a 10.
Também ajuda que, em alguns idiomas, o código de compactação básico seja muito simples. Por exemplo, o PHP possui
base64_decode(_)
, o Pythonint(_,36)
, o JavaScriptparseInt(_,36)
e muitas linguagens de golfe têm builtins básicos de descompressão. Por exemplo, no CJam:Este contém um imprimível. Experimente online!
Isso produz:
fonte
Use frações exponenciais para grandes números repetitivos
Digamos que você queira gerar o número composto de 100 1's. Você pode usar
int("1"*100)
,+"1".repeat(100)
etc., mas também pode aproveitar o fato de estar muito próximoIsso funciona melhor para números muito repetitivos, como os feitos de um único dígito. Alguns dígitos repetidos também funcionam bastante bem:
Ocasionalmente, você encontrará algum outro padrão estranho que também pode ser representado de maneira bastante concisa neste método. Se você precisar
int("123456790"*11)
, por exemplo:Porém, tenha cuidado: números como esses
int("1234567890"*10)
não têm uma representação tão fácil.fonte
Use o deslocamento à esquerda bit a bit para exponenciação de 2
Embora existam muitos idiomas que suportam o operador para exponenciação, alguns não. E aqueles que não precisam, geralmente requerem funções de chamada (ou métodos de Classe / Objeto), que podem custar alguns bytes.
Mas você pode salvar alguns bytes quando precisar aumentar 2 para a potência n usando o operador Bitwise Left Shift
<<
como1<<n
. Observe que isso só salvará bytes se n for maior ou igual a 17. No entanto, isso sempre salvará bytes se n for dinâmico. Alguns exemplos:fonte
8<<9 // 4096
para que possamos chegar99<<61
em 6 bytes, o que equivale a6,917,529,027,641,081,856
economizar 13 bytes!Teorema do Restante Chinês
Se números inteiros grandes arbitrários aparecerem com freqüência ou uma representação inteira grande na linguagem de programação de destino custar muitos bytes, considere o uso do Teorema do Restante Chinês.
Escolha alguns números inteiros relativamente primos emparelhados m i > = 2, e você pode expressar um grande número de 0 a lcm (m 1 , m 2 , ..., m i ) -1
Por exemplo, eu escolho 2, 3, 5, 11, 79, 83, 89, 97, então posso expressar um número menor que 18680171730 exclusivamente. 10000000000 (1e10) pode ser expresso como 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97) que não precisam ser expressos como classe / estrutura grande inteiro inteiro especial que pode salvar alguns bytes em alguma linguagem de programação.
A adição e a subtração podem ser feitas diretamente usando essa representação. Exemplo:
fonte
Use o preenchimento de cordas (sempre que possível)
Se um número grande incluir um dígito repetido no início ou no final, você poderá salvar bytes usando um dos métodos de preenchimento do seu idioma para construir uma sequência do número que está procurando, que poderá ser convertido em um inteiro.
Exemplo
Para gerar o número
1111111111111111111111112
(25 bytes) em JavaScript (ES8):fonte
Usar expoentes
Se o seu idioma tiver um operador de expoente, você poderá usá-lo para gerar, se não o número desejado, pelo menos um número, você poderá executar um cálculo simples ou 2 para chegar ao seu número. Mesmo sem um operador, você ainda poderá salvar bytes com uma função ou método interno.
Exemplo
O inteiro máximo seguro em JavaScript é
9007199254740991
, que é de 16 dígitos. No ES7, isso pode ser calculado com os seguintes 7 bytes:O equivalente no ES6 e versões anteriores, embora o mesmo tamanho do número inteiro nesta instância, demonstre que o uso de um método mais detalhado pode não necessariamente custar bytes.
No entanto, as opções acima podem ser mais curtas se, por exemplo, você já tiver um
Math
alias para um único caractere em outra parte do seu código.fonte
Use frações no lugar da bóia
Exemplo:
1./3
no lugar de0.333333333
fonte