Dado um número inteiro no intervalo 0 <= n < 2**64
, imprima o contêiner de tamanho mínimo em que ele pode caber
- bit: 1
- mordidela: 4
- byte: 8
- curta: 16
- int: 32
- longo: 64
Casos de teste:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
Isso é código-golfe , então a resposta mais curta em bytes vence.
2
também houvesse uma saída ...Respostas:
05AB1E , 10 bytes
Explicação
Experimente online!
fonte
Python, 39 bytes
Conta quantas vezes é necessário obter a raiz quadrada para
n
estar abaixo16
, com uma caixa especial para evitar saídas 2.Se 2 fossem incluídos, poderíamos fazer
com True para 1.
41 bytes:
Dobra repetidamente o expoente
i
até2**i>n
. Pula dei=1
parai=4
deslocando um bit adicional quandoi
é ímpar.Alt 45 bytes:
fonte
1
quando a raiz quadrada de 0 ou 1 é sempre 1 (recursividade infinita emor 2*f(n**.5)
)?or
só é avaliada se a parte anterior for avaliada como algo falso (zero). Para n = 0 e para n = 1,n>1
avalia comoFalse
, que é tratado como zero em uma expressão numérica, en<16
avalia comoTrue
, que é tratado como um em uma expressão numérica. Assim4**(n>1)*(n<16)
é 1.J, 19 bytes
Verbo monádico, pegando o número à direita e cuspindo o tamanho do contêiner. Existem algumas maneiras equivalentes de escrever, então eu incluí as duas.
Explicado por explosão:
O legal é que vemos duas maneiras diferentes de obter a base de log 2 em J. A primeira é a óbvia
2^.
, que é um logaritmo numérico. A segunda é#@#:
, que pode ser lida como "comprimento da representação da base 2". Isso é quase equivalente a um mais-andar-de-log-base-2, exceto que#:0
é a lista de um elemento0
, que é exatamente o que queremos. Isso bate1+2<.@^.1&>.
em 8 bytes.Em uso no REPL:
Solução antiga e excessivamente inteligente de 20 bytes.
fonte
Python,
535049 bytesfonte
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
é um byte mais curtoMathematica,
443938 bytesObrigado @orlp por 5 bytes e @MartinEnder por 1 byte.
Localiza os primeiros elementos da lista, de
{1, 4, 8, 16, 32, 64}
modo que o número 2 ^ seja maior que a entrada.fonte
Pip , 19 bytes
Experimente online!
Como funciona
fonte
JavaScript (ES7), 35 bytes
fonte
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
deve ser um pouco mais curta.Mathematica,
464338 bytesAgradecemos a JungHwan Min e Martin Ender por economizar 3 bytes! Obrigado à ngenisis por uma grande economia de 5 bytes!
Função sem nome, recebendo um número inteiro não negativo como entrada e retornando um número inteiro positivo.
BitLength@#
calcula o número de bits na entrada e depois2^⌈Log2@...⌉
calcula a menor potência de 2 que é pelo menos tão grande quanto o número de bits. Finalmente,/.{2->4,0->1}
cuida do caso especial de que não há "niblit" entre bit e nybble e também corrige a resposta para a entrada estranha0
.fonte
BitLength@#
vez de⌊1+Log2@#⌋
. Então, em vez de substituir∞
por1
você0
, você pode substituir , economizando outros 2 bytes e você fica empatado em primeiro lugar.BitLength
. Veja minha respostaJulia, 40 bytes
Essa é uma função anônima que gera uma matriz dos poderes de 2 de 0 a 6, excluindo 2, e a filtra apenas aos elementos x, de modo que 2 x seja maior que a entrada. O primeiro desses elementos é a resposta. Infelizmente, isso exige a promoção de 2 a
BigInt
para evitar o estouro de x = 64.Na verdade, isso é bastante semelhante à resposta Python do orlp, embora eu não a tenha visto antes de inventar essa abordagem.
Experimente online!
fonte
Perl 6 , 30 bytes
+<
é o operador de deslocamento de bits esquerdo do Perl 6, que muitos outros idiomas chamam<<
.fonte
Haskell, 31 bytes
Alt de 32 bytes:
fonte
Java, 143 bytes.
fonte
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 bytes
fonte
Ruby,
3936 bytesObrigado GB por ajudar o golfe
fonte
Java 8,
6555 bytesEsta é uma expressão lambda que pega
long
ae retorna anint
. Nunca jogou golfe em Java antes, portanto, isso deve ser facilmente superável:Experimente online!
Para 47 bytes , poderíamos ter:
No entanto,
1L<<i
estouros excessivos para valores de retorno maiores que 32, portanto, isso falha no caso de teste final.fonte
4
quando testado com16
quando deve retornar 8. Além disso, você ainda pode jogar golfe nessa solução removendo os colchetes,i<<=1+i%2;
pois sem{}
s, o loop while apenas executa a próxima linhaMathematica, 30 bytes
Explicação:
Let
N
Ser o conjunto de números inteiros não negativos. Definir duas funções emN
,BitLength
eNextPower
como segue:Esta solução calcula essencialmente
NextPower(BitLength(n))
dado um número inteiron >= 0
. Poisn > 0
, podemos ver issoNextPower(n) = 2^BitLength(n-1)
, entãoNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Agora, o Mathematica
BitLength
interno concorda com a definição que eu dein >= 0
. Porn < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
, entãoBitLength[-1] == BitLength[0] == 0
. Assim, obtemos a resposta desejada de1
paran==0
.Já que pulamos direto de pouco para mordiscar, temos que substituir as respostas de
2
por4
.fonte
bash,
49 bytes48 bytesou
Salve em um script e passe o número a ser testado como argumento.
Editar: Substituído || com |, que funciona porque os argumentos são sempre 0 ou 1.
Nota: Isso funciona para números inteiros até o maior número positivo positivo que sua versão do bash pode manipular. Se tiver tempo, modificarei para que funcione até 2 ^ 64-1 em versões do bash que usam aritmética de 32 bits.
Enquanto isso, aqui está uma solução de 64 bytes que funciona para números arbitrariamente grandes (em qualquer versão do bash):
fonte
Empilhados,
3430 bytesou
O primeiro recebe entrada no TOS e deixa a saída no TOS; o segundo é uma função. Experimente aqui!
Explicação
Aqui está um exemplo dele trabalhando na repl :
Casos de teste
Ou, como um programa completo:
fonte
Raquete 45 bytes
Ungolfed:
Outras versões:
e usando o comprimento da string:
Testando:
Resultado:
fonte
Oitava,
40 36 3129 bytesFunção anônima simples. Supõe-se que o valor de entrada seja um número inteiro - veja a ressalva no final.
O código funciona da seguinte maneira:
Primeiro, uma matriz dos comprimentos de bits permitidos (1,4,8,16,32,64) é criada e salva em
b
.A seguir, encontramos o número de bits necessários para armazenar o número de entrada
a
comparando com o tamanho máximo de cada contêinerb
para ver quais são grandes o suficiente.Em seguida, usamos o vetor de índice resultante para extrair o tamanho do contêiner
b
novamente.Finalmente, pegamos o primeiro elemento na matriz resultante, que será o menor contêiner possível.
Você pode experimentá-lo online aqui .
Simplesmente execute o código a seguir e faça
ans(x)
.A única ressalva é que a precisão dupla é usada para constantes por padrão, o que significa que ela só funciona com números até o valor mais alto representável por um flutuador de precisão dupla menor que 2 ^ 64.
Isso pode ser corrigido garantindo que o número fornecido à função seja um número inteiro e não um duplo. Isto pode ser conseguido chamando a função por exemplo, com:
ans(uint64(x))
.fonte
PHP,
494644 bytesExecute assim:
Explicação
Tweaks
$r=
tarefa-R
para$argn
disponibilizarfonte
CJam , 18 bytes
Experimente online!
Explicação
fonte
C,
7152 bytesfonte
(1<<15)+1
ou mais não quebraria isso por causa do comportamento assinado delong long
? O tipo que você realmente quer é ouint64_t
que precisa e#include <stdint.h>
que ainda é um perdedor comparado aunsigned long long
! Cabeçalhos são a proibição do golfe em c.unsigned long long
oruint64_t
, mas, como parece funcionarlong long
, fui com ele.QBIC , 27 bytes
Explicação
fonte
Pyke, 13 bytes
Experimente aqui!
fonte
PHP, 43 bytes
Corra com
echo <number> | php -R '<code>'
.faz um loop
$i
até2**(2**$i)
ser maior que a entrada. (Ajuste: em<<
vez de**
eliminar parênteses)Após o loop, $ i é um muito alto; portanto, obtém um decréscimo antes de calcular a saída
- mas não para
$i==2
.fonte