Pour un nombre entier compris dans la plage 0 <= n < 2**64
, indiquez le conteneur de taille minimale dans lequel il peut être inséré
- bit: 1
- grignotage: 4
- octet: 8
- court: 16
- int: 32
- long: 64
Testcases:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
C'est du code-golf , donc la réponse la plus courte en octets est gagnante.
2
c'était aussi une sortie ...Réponses:
05AB1E , 10 octets
Explication
Essayez-le en ligne!
la source
Python, 39 octets
Compte combien de fois on doit prendre la racine carrée pour
n
être en dessous16
, avec quelques casse spéciale pour éviter des sorties de 2.Si 2 étaient inclus, nous pourrions faire
avec True pour 1.
41 octets:
Double à plusieurs reprises l'exposant
i
jusqu'à2**i>n
. Saute dei=1
ài=4
en décalant un bit supplémentaire quandi
est étrange.Alt 45 octets:
la source
1
lorsque la racine carrée de 0 ou 1 est toujours 1 (récursivité infinie enor 2*f(n**.5)
)?or
est évaluée uniquement si la partie qui précède a une valeur falsifiée (zéro). Pour n = 0 et pour n = 1,n>1
évalue àFalse
, traité comme zéro dans une expression numérique, etn<16
évaluant àTrue
, traité comme un dans une expression numérique. Alors4**(n>1)*(n<16)
est 1.J, 19 octets
Verbe monadique prenant le numéro à droite et recrachant la taille du conteneur. Il y a deux façons équivalentes de l'écrire, alors j'ai inclus les deux.
Expliqué par explosion:
Ce qui est cool, c’est que nous voyons deux manières différentes de prendre log base 2 en J. La première est l’évident
2^.
, qui est un logarithme numérique. La seconde est#@#:
, qui peut être lue comme "longueur de la représentation en base 2". Cela équivaut presque à one-plus-floor-of-log-base-2, à la différence que#:0
c'est la liste à un élément0
, qui correspond exactement à ce que nous souhaitons. Cela bat1+2<.@^.1&>.
par 8 octets.En usage sur le REPL:
Ancienne solution de 20 octets trop astucieuse.
la source
Python,
535049 octetsla source
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
est un octet plus courtMathematica,
443938 octetsMerci @ orlp pour 5 octets et @MartinEnder pour 1 octet.
Trouve en premier les éléments de la liste
{1, 4, 8, 16, 32, 64}
tels que 2 ^ nombre est supérieur à l'entrée.la source
Pip , 19 octets
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES7), 35 octets
la source
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
devrait être légèrement plus courte.Mathematica,
464338 octetsMerci à JungHwan Min et Martin Ender pour avoir économisé 3 octets! Merci à ngenisis pour une grosse économie de 5 octets!
Fonction sans nom prenant un entier non négatif en entrée et renvoyant un entier positif.
BitLength@#
calcule le nombre de bits dans l'entrée, puis2^⌈Log2@...⌉
calcule la plus petite puissance de 2 égale au moins au nombre de bits. Enfin,/.{2->4,0->1}
s'occupe du cas particulier où il n'y a pas de "niblit" entre bit et nybble, et corrige également la réponse pour l'entrée étrange0
.la source
BitLength@#
place de⌊1+Log2@#⌋
. Ensuite, au lieu de remplacer∞
par,1
vous pouvez remplacer0
, en enregistrant 2 autres octets et vous êtes lié pour le premier.BitLength
. Voir ma réponseJulia, 40 octets
Il s'agit d'une fonction anonyme qui génère un tableau des puissances de 2 de 0 à 6, à l'exclusion de 2, et le filtre uniquement aux éléments x tels que 2 x soit supérieur à l'entrée. Le premier élément de ce type est la réponse. Malheureusement, cela nécessite la promotion de 2 en a
BigInt
pour éviter le débordement sur x = 64.Ceci est en fait assez similaire à la réponse Python de orlp, bien que je ne l'aie pas vue avant de concocter cette approche.
Essayez-le en ligne!
la source
Perl 6 , 30 octets
+<
est l'opérateur de décalage de bits à gauche de Perl 6, que beaucoup d'autres langues appellent<<
.la source
Haskell, 31 octets
32 octets alt:
la source
Java, 143 octets.
la source
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 octets
la source
Ruby,
3936 octetsMerci GB d'aider à jouer au golf
la source
Java 8,
65 à55 octetsC'est une expression lambda qui prend un
long
et retourne unint
. Jamais joué en Java auparavant, cela devrait donc être facile à battre:Essayez-le en ligne!
Pour 47 octets , nous pourrions avoir:
Toutefois, les
1L<<i
débordements pour les valeurs de retour supérieures à 32 sont résolus, de sorte que cela échoue pour le test final.la source
4
lorsqu'il est testé avec16
quand il est censé revenir 8. Vous pouvez également encore le golf cette solution en supprimant les crochets autouri<<=1+i%2;
depuis sans{}
s, la boucle while sera uniquement exécuter la ligne suivanteMathematica, 30 octets
Explication:
Soit
N
l'ensemble des entiers non négatifs. Définissez deux fonctions surN
,BitLength
etNextPower
comme suit:Cette solution calcule essentiellement à partir d'
NextPower(BitLength(n))
un entiern >= 0
. Carn > 0
, on peut voir çaNextPower(n) = 2^BitLength(n-1)
, alorsNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Mathematica est désormais
BitLength
conforme à la définition que j'ai donnéen >= 0
. Pourn < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
, doncBitLength[-1] == BitLength[0] == 0
. Nous obtenons ainsi la réponse souhaitée de1
pourn==0
.Puisque nous passons directement de mors en mordillés, nous devons remplacer les réponses
2
par4
.la source
bash,
49 octets48 octetsou
Enregistrez dans un script et transmettez le nombre à tester en tant qu'argument.
Edit: Remplacé || avec |, ce qui fonctionne car les arguments sont toujours 0 ou 1.
Note: Ceci fonctionne pour les entiers jusqu'au plus grand entier positif que votre version de bash peut gérer. Si j'en ai le temps, je le modifierai pour qu'il fonctionne jusqu'à 2 ^ 64-1 dans les versions de bash utilisant une arithmétique signée 32 bits.
En attendant, voici une solution de 64 octets qui fonctionne pour des nombres arbitrairement grands (dans toute version bash):
la source
Empilés,
3430 octetsou
Le premier prend en entrée le TOS et laisse la sortie en TOS; la seconde est une fonction. Essayez-le ici!
Explication
Voici un exemple de travail sur le repl :
Cas de test
Ou, en tant que programme complet:
la source
Raquette 45 octets
Ungolfed:
Autres versions:
et en utilisant la longueur de la chaîne:
Essai:
Sortie:
la source
Octave,
40 36 3129 octetsFonction anonyme simple. Il est supposé que la valeur d'entrée est un entier - voir l'avertissement à la fin.
Le code fonctionne comme suit:
Tout d'abord, un tableau des longueurs de bits autorisées (1,4,8,16,32,64) est créé et enregistré
b
.Ensuite, nous trouvons le nombre de bits requis pour stocker le nombre saisi
a
en comparant la taille maximale de chaque conteneurb
pour déterminer ceux qui sont assez gros.Nous utilisons ensuite le vecteur d’index résultant pour extraire à nouveau la taille du conteneur
b
.Enfin, prenons le premier élément du tableau résultant qui sera le plus petit conteneur possible.
Vous pouvez l'essayer en ligne ici .
Il suffit de lancer le code suivant, puis faites-le
ans(x)
.La seule réserve à cela est que la double précision est utilisée par défaut pour les constantes, ce qui signifie qu'elle ne fonctionne qu'avec des nombres allant jusqu'à la valeur la plus élevée pouvant être représentée par un flottant double précision inférieur à 2 ^ 64.
Cela peut être corrigé en s'assurant que le nombre fourni à la fonction est un entier et non un double. Ceci peut être réalisé en appelant la fonction par exemple avec:
ans(uint64(x))
.la source
PHP,
494644 octetsCourez comme ça:
Explication
Tweaks
$r=
tâche-R
pour rendre$argn
disponiblela source
CJam , 18 octets
Essayez-le en ligne!
Explication
la source
C,
7152 octetsla source
(1<<15)+1
ou plus de casser cela à cause du comportement signé delong long
? Le type que vous voulez vraiment estuint64_t
ce qui nécessite#include <stdint.h>
ce qui est encore un perdant comparé àunsigned long long
! Les en-têtes sont le fléau du golf en c.unsigned long long
ouuint64_t
, mais comme il semble fonctionner avec,long long
je suis allé avec.QBIC , 27 octets
Explication
la source
Pyke, 13 octets
Essayez-le ici!
la source
PHP, 43 octets
Courez avec
echo <number> | php -R '<code>'
.boucle
$i
jusqu'à2**(2**$i)
est plus grand que l'entrée. (Tweak:<<
au lieu d'**
éliminer les parens)Après la boucle, $ i est trop élevé; il obtient donc une décrémentation avant de calculer la sortie
- mais pas pour
$i==2
.la source