A veces, mientras juega al golf, uno necesita representar un gran número en su código. Escribirlos tal cual puede aumentar significativamente el conteo de bytes.
¿Qué consejos generales 1 tiene para representar números largos de forma concisa en el código?
Por favor, publique un consejo por respuesta.
1 Con general , me refiero a consejos que se pueden aplicar a más de un idioma. Para consejos específicos del idioma, publique en su respectivo hilo.
Respuestas:
Esté atento a los números especiales.
Algunas lenguas han incorporado funciones de plazas, la exponenciación con base 2, n primer -ésimo, factorial, u otros procedimientos que pueden generar grandes cantidades. Verifique si su número cae en alguna de esas categorías.
Y si no es así, puede suceder que un número mayor que se ajuste a sus propósitos y se pueda usar en su lugar.
fuente
1.01e6
iteraciones son suficientes,1e7
ahorra 3 bytes a expensas del tiempo de ejecución.Usar operadores booleanos bit a bit
Algunos idiomas tienen bit a bit AND, OR, XOR y, a veces, NOT.
Expresar un número grande específico como una combinación bit a bit de un resultado de una exponenciación o desplazamiento a la izquierda y otro número puede llevarlo exactamente al número que necesita. Por lo general, esto solo vale la pena si los números se vuelven bastante grandes.
Por ejemplo,
2147483722
es de 10 bytes, pero2<<30^74
(2 ^ 31 bit-XORed con 74) es solo 8.fuente
bc
) Y XOR nunca es más útil que+
y-
: en este caso, xor y add dan el mismo resultado, pero en todos los casos hay algún número entero que se puede sumar o restar para producir el mismo resultado que xor con un número entero, y el sumando es no más grande y a veces más corto.1e9^2e9
.9<<49^7<<19
uso de la suma en lugar de xor?1286561280
en JavaScript y Perl (y probablemente en otros idiomas), y es una expresión más corta para producir ese valor que el equivalente usando+
o-
.Use cadenas para números repetitivos
Para los números que son de naturaleza muy repetitiva, puede usar cadenas y convertirlos a entero. Por ejemplo, en JavaScript
fuente
1e100/9
en este caso.Usar notación científica
La notación científica puede guardar bytes en caso de números largos. Por ejemplo:
fuente
3564e-8
en ese caso?.00003564
, que también es un byte más corto nuevamente.Busque otro número para usar en su lugar
Esto puede parecer una falta de respuesta, pero no siempre es obvio que se pueda calcular un número mayor mediante un código más corto. Un ejemplo que recuerdo es la salida de una copia googol de una cadena , donde las respuestas obvias requieren calcular 10 100 . Como resultado, calcular cualquier múltiplo de 10 100 conduce a una respuesta igualmente correcta, pero en algunos idiomas, más corta. La respuesta de Dennis allí usa 100 100 , la mía usa 250 255 .
fuente
es
si solo necesita un gran número pero no le importa su valor (o que siempre es el mismo).Compresión Base
El código de descompresión de base puede ser bastante complejo, pero si tiene un número realmente enorme, a veces puede ayudar comprimirlo en una base superior a 10.
También ayuda que en algunos idiomas, el código de compresión base es muy simple. Por ejemplo, PHP tiene
base64_decode(_)
, Python tieneint(_,36)
, JavaScript tieneparseInt(_,36)
, y muchos lenguajes de golf tienen bases integradas de descompresión. Por ejemplo, en CJam:Esto contiene un no imprimible. Pruébalo en línea!
Esto produce:
fuente
Usa fracciones exponenciales para números repetitivos grandes
Supongamos que desea generar el número formado por 100 1's. Puede usar
int("1"*100)
,+"1".repeat(100)
etc., pero también puede aprovechar el hecho de que está muy cerca deEsto funciona mejor para números muy repetitivos, como los de un solo dígito. Un par de dígitos repetidos también funciona bastante bien:
Ocasionalmente encontrará algún otro patrón extraño que también puede representarse de manera bastante escueta en este método. Si por casualidad necesita
int("123456790"*11)
, por ejemplo:Sin embargo, tenga cuidado: los números como
int("1234567890"*10)
no tienen una representación tan fácil.fuente
Use Bitwise Left Shift para la exponenciación de 2
Aunque hay muchos lenguajes que admiten operador para exponenciación, algunos no. Y aquellos que no lo hacen, generalmente requieren funciones de llamada (o métodos de Clase / Objeto), que pueden costar unos pocos bytes.
Pero puede guardar algunos bytes cuando necesite elevar 2 a la potencia n utilizando el operador Bitwise Left Shift
<<
como1<<n
. Tenga en cuenta que esto solo le ahorrará bytes si n es mayor o igual que 17. Sin embargo, esto siempre le ahorrará bytes si n es dinámico. Pocos ejemplos:fuente
8<<9 // 4096
para que podamos obtener hasta99<<61
6 bytes, ¡lo que equivale a6,917,529,027,641,081,856
ahorrar 13 bytes!Teorema del resto chino
Si con frecuencia aparecen números enteros arbitrarios, o la representación de números enteros grandes en el lenguaje de programación de destino cuesta demasiados bytes, puede considerar usar el Teorema del resto chino.
Elija algunos enteros relativamente primos por pares m i > = 2, y puede expresar un gran número de 0 a mcm (m 1 , m 2 , ..., m i ) -1
Por ejemplo, elijo 2, 3, 5, 11, 79, 83, 89, 97, luego puedo expresar un número menor que 18680171730 únicamente. 10000000000 (1e10) se puede expresar como 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97) que no necesita expresarse como una clase / estructura especial de Big Integer que podría guardar Algunos bytes en algún lenguaje de programación.
La suma y la resta se pueden hacer directamente usando esta representación. Ejemplo:
fuente
Use relleno de cadena (cuando sea posible)
Si un número grande incluye un dígito repetido al principio o al final, puede guardar bytes utilizando uno de los métodos de relleno de su idioma para construir una cadena del número que está buscando, que luego puede convertir a un entero.
Ejemplo
Para generar el número
1111111111111111111111112
(25 bytes) en JavaScript (ES8):fuente
Usar exponentes
Si su idioma tiene un operador de exponente, puede usarlo para generar, si no el número que desea, al menos un número que pueda realizar un cálculo simple o 2 para llegar a su número. Incluso sin un operador, es posible que pueda guardar bytes con una función o método incorporado.
Ejemplo
El número entero máximo seguro en JavaScript es
9007199254740991
, que tiene 16 dígitos de largo. En ES7, esto se puede calcular con los siguientes 7 bytes:El equivalente en ES6 y versiones anteriores, mientras que la misma longitud que el entero en este caso, demuestra que el uso de un método más detallado no necesariamente le costará ningún byte.
Sin embargo, lo anterior puede resultar más corto si, por ejemplo, ya tiene un
Math
alias para un solo carácter en otra parte de su código.fuente
Usa fracciones en el lugar del flotador
Ejemplo:
1./3
en lugar de0.333333333
fuente