Dado un número entero en el rango 0 <= n < 2**64
, envíe el contenedor de tamaño mínimo en el que puede caber
- bit: 1
- mordisco: 4
- byte: 8
- corto: 16
- int: 32
- largo: 64
Casos de prueba:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
2
fuera una salida ...Respuestas:
05AB1E , 10 bytes
Explicación
Pruébalo en línea!
fuente
Python, 39 bytes
Cuenta cuántas veces se debe tomar la raíz cuadrada para
n
estar debajo16
, con una carcasa especial para evitar salidas de 2.Si se incluyeran 2, podríamos hacer
con True para 1.
41 bytes:
Duplica repetidamente el exponente
i
hasta2**i>n
. Salta dei=1
ai=4
al cambiar un bit adicional cuandoi
es extraño.Alt 45 bytes:
fuente
1
cuando la raíz cuadrada de 0 o 1 es siempre 1 (recursividad infinita enor 2*f(n**.5)
)?or
solo se evalúa si la parte anterior se evalúa como algo falso (cero). Para n = 0 y para n = 1,n>1
evalúa aFalse
, que se trata como cero en una expresión numérica, yn<16
evalúa aTrue
, que se trata como uno en una expresión numérica. Así4**(n>1)*(n<16)
es 1.J, 19 bytes
Verbo monádico tomando el número a la derecha y escupiendo el tamaño del contenedor. Hay un par de formas equivalentes de escribirlo, así que he incluido ambos.
Explicado por explosión:
Lo que es genial es que vemos dos formas diferentes de tomar la base de registro 2 en J. La primera es la obvia
2^.
, que es un logaritmo numérico. El segundo es#@#:
, que puede leerse como "longitud de representación de base 2". Esto es casi equivalente a one-plus-floor-of-log-base-2, excepto que#:0
es la lista de un elemento0
, que es exactamente lo que queremos. Esto late1+2<.@^.1&>.
por 8 bytes.En uso en REPL:
Solución antigua de 20 bytes demasiado inteligente.
fuente
Python,
535049 bytesfuente
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
es un byte más cortoMathematica,
443938 bytesGracias @orlp por 5 bytes y @MartinEnder por 1 byte.
Encuentra los primeros elementos de la lista de
{1, 4, 8, 16, 32, 64}
modo que el número 2 ^ sea mayor que la entrada.fuente
Pip , 19 bytes
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES7), 35 bytes
fuente
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
debería ser un poco más corta.Mathematica,
464338 bytes¡Gracias a JungHwan Min y Martin Ender por guardar 3 bytes! ¡Gracias a ngenisis por un gran ahorro de 5 bytes!
Función sin nombre que toma un entero no negativo como entrada y devuelve un entero positivo.
BitLength@#
calcula el número de bits en la entrada y luego2^⌈Log2@...⌉
calcula la potencia más pequeña de 2 que es al menos tan grande como el número de bits. Finalmente,/.{2->4,0->1}
se ocupa del caso especial de que no hay "niblit" entre bit y nybble, y también corrige la respuesta para la entrada extraña0
.fuente
BitLength@#
lugar de⌊1+Log2@#⌋
. Luego, en lugar de reemplazar∞
con1
usted, puede reemplazar0
, guardando otros 2 bytes y estará empatado en primer lugar.BitLength
. Ver mi respuestaJulia, 40 bytes
Esta es una función anónima que genera una matriz de las potencias de 2 de 0 a 6, excluyendo 2, y la filtra solo a aquellos elementos x de modo que 2 x sea mayor que la entrada. El primer elemento es la respuesta. Desafortunadamente, esto requiere promover 2 a a
BigInt
para evitar el desbordamiento en x = 64.En realidad, esto es bastante similar a la respuesta de Python de orlp, aunque no lo vi antes de inventar este enfoque.
Pruébalo en línea!
fuente
Perl 6 , 30 bytes
+<
es el operador de desplazamiento de bit izquierdo de Perl 6, que muchos otros idiomas llaman<<
.fuente
Haskell, 31 bytes
Alt de 32 bytes:
fuente
Java, 143 bytes.
fuente
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 bytes
fuente
Ruby,
3936 bytesGracias GB por ayudar al golf.
fuente
Java 8,
6555 bytesEsta es una expresión lambda que toma un
long
y devuelve unint
. Nunca jugué golf en Java antes, por lo que esto debería ser fácilmente superable:Pruébalo en línea!
Para 47 bytes , podríamos tener:
Sin embargo, se
1L<<i
desborda para valores de retorno superiores a 32, por lo que esto falla para el caso de prueba final.fuente
4
cuando se prueba con16
cuando se supone que debe devolver 8. Además, aún puede jugar golf esta solución quitando los corchetesi<<=1+i%2;
ya que sin{}
s, el ciclo while solo ejecutará la siguiente líneaMathematica, 30 bytes
Explicación:
Dejar
N
ser el conjunto de enteros no negativos. Defina dos funciones enN
,BitLength
y de laNextPower
siguiente manera:Esta solución esencialmente calcula
NextPower(BitLength(n))
dado un enteron >= 0
. Porquen > 0
podemos ver esoNextPower(n) = 2^BitLength(n-1)
, entoncesNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Ahora el Mathematica
BitLength
incorporado está de acuerdo con la definición que din >= 0
. Paran < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
, asíBitLength[-1] == BitLength[0] == 0
. Así obtenemos la respuesta deseada de1
forn==0
.Como saltamos directamente de bit a mordisco, tenemos que reemplazar las respuestas de
2
con4
.fuente
bash,
49 bytes48 byteso
Guarde en un script y pase el número a probar como argumento.
Editar: Reemplazado || con |, que funciona porque los argumentos son siempre 0 o 1.
Nota: Esto funciona para enteros hasta el mayor entero positivo que su versión de bash puede manejar. Si tengo tiempo, lo modificaré para que funcione hasta 2 ^ 64-1 en versiones de bash que usan aritmética con signo de 32 bits.
Mientras tanto, aquí hay una solución de 64 bytes que funciona para números arbitrariamente grandes (en cualquier versión bash):
fuente
Apilado,
3430 byteso
El primero toma entrada en los TOS y deja la salida en TOS; El segundo es una función. Pruébalo aquí!
Explicación
Aquí hay un ejemplo de ello trabajando en la respuesta :
Casos de prueba
O, como un programa completo:
fuente
Raqueta 45 bytes
Sin golf:
Otras versiones:
y usando longitud de cadena:
Pruebas:
Salida:
fuente
Octava,
40 36 3129 bytesFunción anónima simple. Se supone que el valor de entrada es un número entero; vea la advertencia al final.
El código funciona de la siguiente manera:
Primero se crea y se guarda una matriz de las longitudes de bits permitidas (1,4,8,16,32,64)
b
.A continuación, encontramos el número de bits necesarios para almacenar el número de entrada
a
comparándolo con el tamaño máximo de cada contenedorb
para ver cuáles son lo suficientemente grandes.Luego usamos el vector índice resultante para extraer
b
nuevamente el tamaño del contenedor .Finalmente, tomamos el primer elemento en la matriz resultante que será el contenedor más pequeño posible.
Puedes probarlo en línea aquí .
Simplemente ejecute el siguiente código y luego haga
ans(x)
.La única advertencia con esto es que la precisión doble se usa para constantes de forma predeterminada, lo que significa que solo funciona con números hasta el valor más alto representable por un flotante de precisión doble que es menor que 2 ^ 64.
Esto se puede solucionar asegurándose de que el número que se proporciona a la función es un número entero en lugar de un doble. Esto se puede conseguir llamando a la función, por ejemplo, con:
ans(uint64(x))
.fuente
PHP,
494644 bytesCorre así:
Explicación
Ajustes
$r=
tarea-R
para poner a$argn
disposiciónfuente
CJam , 18 bytes
Pruébalo en línea!
Explicación
fuente
C,
7152 bytesfuente
(1<<15)+1
o más no rompería esto debido al comportamiento firmado delong long
? ¡El tipo que realmente quieres es eluint64_t
que necesita,#include <stdint.h>
que sigue siendo un perdedor en comparaciónunsigned long long
! Los encabezados son la ruina del golf en c.unsigned long long
ouint64_t
, pero como parece funcionar, lolong long
seguí.QBIC , 27 bytes
Explicación
fuente
Pyke, 13 bytes
Pruébalo aquí!
fuente
PHP, 43 bytes
Corre con
echo <number> | php -R '<code>'
.se repite
$i
hasta que2**(2**$i)
sea más grande que la entrada. (Ajuste: en<<
lugar de**
eliminar a los padres)Después del ciclo, $ i es uno demasiado alto; por lo que obtiene una disminución antes de calcular la salida
, pero no para
$i==2
.fuente