Problème:
Trouver le nombre de zéros non significatifs dans un entier signé 64 bits
Règles:
- L'entrée ne peut pas être traitée comme une chaîne; cela peut être n'importe quoi où les opérations mathématiques et au niveau des bits conduisent l'algorithme
- La sortie doit être validée par rapport à la représentation entière signée 64 bits du nombre, quelle que soit la langue
- Les règles de golf par défaut s'appliquent
- Le code le plus court en octets gagne
Cas de test:
Ces tests supposent deux entiers signés complémentaires. Si votre langue / solution manque ou utilise une représentation différente des entiers signés, veuillez l'indiquer et fournir des cas de test supplémentaires qui peuvent être pertinents. J'ai inclus quelques cas de test qui traitent de la double précision, mais n'hésitez pas à en suggérer d'autres qui devraient être répertoriés.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
au lieu de0
?Réponses:
Langage machine x86_64 sous Linux, 6 octets
Nécessite un processeur Haswell ou K10 ou supérieur avec
lzcnt
instruction.Essayez-le en ligne!
la source
Hexagonie ,
7870 octetsEssayez-le en ligne!
Ce défi n'est-il pas trop banal pour un langage pratique? ;)
longueur de côté 6. Je ne peux pas l'adapter dans un hexagone de longueur de côté 5.
Explication
la source
Python , 31 octets
Essayez-le en ligne!
L'expresson est le bit à bit
&
de deux parties:Le
67-len(bin(-n))
donne la bonne réponse pour les entrées non négatives. Il prend la longueur en bits et soustrait 67, ce qui est 3 de plus que 64 pour compenser le-0b
préfixe. La négation est une astuce à régler pourn==0
utiliser cette négation qui ne produit pas de-
signe devant.Le
& ~n>>64
fait que la réponse soit plutôt0
négativen
. Quandn<0
,~n>>64
est égal à 0 (sur des entiers 64 bits), donc -ing avec cela0
. Quandn>=0
, l'~n>>64
évalue-1
et l'action&-1
n'a aucun effet.Python 2 , 36 octets
Essayez-le en ligne!
Alternative arithmétique.
la source
Java 8,
3226 octets.Long::numberOfLeadingZeros
Builtins FTW.
-6 octets grâce à Kevin Cruijssen
Essayez-le en ligne!
la source
numberOfLeadingZeros
.. Vous pouvezn->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
est encore plus court (26 octets).C (gcc) , 14 octets
Fonctionne bien sur tio
C (gcc) ,
3529 octetsEssayez-le en ligne!
Que Dennis pour 6 octets
Indicateurs du compilateur C (gcc) , 29 octets par David Foerster
Essayez-le en ligne!
la source
__builtin_clzl
avec laquelle je peux arriver .long
est 32 bits (y compris Windows x64), vous avez besoin__builtin_clzll
(non signé long long). godbolt.org/z/MACCKf . (Contrairement à Intel intrinsèques, les builds GNU C sont pris en charge quelle que soit l'opération réalisable avec une instruction machine. Sur x86 32 bits, clzll se compile en une branche ou cmov pour fairelzcnt(low half)+32
oulzcnt(high half)
. Oubsr
silzcnt
n'est pas disponible.__builtin_clz(l)(l)
comportement n'est pas défini pour zéro: "Si x est 0, le résultat n'est pas défini."Perl 6 ,
35 2826 octets-2 octets grâce à nwellnhof
Essayez-le en ligne!
Bloc de code anonyme qui prend un nombre et renvoie un nombre. Cela convertit le nombre en une chaîne binaire et compte les zéros non significatifs. Cela fonctionne pour les nombres négatifs car le premier caractère est un
-
exemple-00000101
, donc il n'y a pas de zéros de tête.Explication:
la source
JavaScript (Node.js) , 25 octets
Prend l'entrée comme un littéral BigInt.
Essayez-le en ligne!
la source
n=>n<1?0:n.toString(2)-64
N'exécuterait pas la même chose?n=>n<1?0:n.toString(2).length-64
, mais cela ne fonctionnerait pas de toute façon. Ce serait , je pense..toString()
approche fonctionne, mais nous avons toujours besoin d'un littéral BigInt en entrée. Sinon, nous n'avons que 52 bits de mantisse, ce qui conduit à des résultats invalides lorsque la précision est perdue .Python 3 , 34 octets
Essayez-le en ligne!
la source
J , 18 octets
Essayez-le en ligne!
J , 19 octets
Essayez-le en ligne!
Explication:
la source
1#.[:*/\1-_64{.#:
(17) est proche mais ne fonctionne pas pour les nombres négatifs :(Perl 6 , 18 octets
-2 octets grâce à Jo King
Essayez-le en ligne!
la source
Rubis , 22 octets
Essayez-le en ligne!
la source
05AB1E ,
109 octetsLes E / S sont deux entiers
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Haskell , 56 octets
Merci xnor d' avoir repéré une erreur!
Pourrait allouer beaucoup de mémoire, essayez-le en ligne!
Vous souhaitez peut-être le tester avec une constante plus petite: Essayez 8 bits!
Explication
Au lieu d'utiliser{ 0 , 1 }64 dans l'ordre lexicographique. Nous pouvons donc simplement résumer la1 préfixe s en utilisant
mapM(pure[0,1])[1..64]
pour convertir l'entrée en binaire, nous utiliseronsmapM(pure[1,0])[1..64]
ce qui génère essentiellement les chaînes inverséessum.fst.span(>0)
.la source
Powershell, 51 octets
Script de test:
Production:
la source
Java 8, 38 octets
Entrée en tant que
long
(entier 64 bits), sortie en tant queint
(entier 32 bits).Port de la réponse C (gcc) de @ l4m2 .
Essayez-le en ligne.
Explication:
EDIT: peut être de 26 octets en utilisant le module intégré
Long::numberOfLeadingZeros
comme affiché dans la réponse Java 8 de @lukeg .la source
APL + WIN, 34 octets
Explication:
la source
C # (Visual C # Interactive Compiler) , 42 octets
Essayez-le en ligne!
C # (Visual C # Interactive Compiler) , 31 octets
Encore plus court, basé sur la réponse C (gcc) de @ l4m2. Je n'ai jamais su que tu pouvais déclarer des fonctions comme ça, merci @Dana!
Essayez-le en ligne!
la source
Gelée ,
109 octets-1 grâce à une astuce d'Erik the Outgolfer (est-non-négatif est maintenant tout simplement
AƑ
)Un lien monadique acceptant un entier (dans la plage) qui donne un entier.
Essayez-le en ligne! Ou consultez la suite de tests .
Le 10 était
ḤBL65_ɓ>-×
Voici une autre solution de 10 octets, que j'aime car elle dit que c'est "BOSS" ...
Test-suite ici
...
BoṠS63r0¤i
,BoṠS63ŻṚ¤i
ouBoṠS64ḶṚ¤i
fonctionnerait également.Un autre 10 octets (de Dennis) est
æ»64ḶṚ¤Äċ0
(encoreæ»63r0¤Äċ0
etæ»63ŻṚ¤Äċ0
fonctionnera également)la source
Ƒ
rapide, très beau travail!AƑ
depuis un certain temps maintenant. Soyez averti qu'il ne vectorise pas! ;-) C'est en fait "aplatir puis vérifier si tous les éléments ne sont pas négatifs".Perl 5 , 37 octets
Essayez-le en ligne!
Ou ces 46 octets si la "stringification" n'est pas autorisée: sub z
la source
s/length$&/$+[0]/
(-3 octets);)sub
mot - clé des réponses contenant les fonctions Perl 5.sub
réponses pour d'autres langues, perl6, PowerShell et plus encore.sub{}
de créer un sous (anonyme?), Ce qui explique pourquoi il est omis des réponses Perl6. Je suis d'accord avec @nwellnhof que vous ne devriez pas être autorisé à supprimersub
. (quand j'étais encore actif, il y a environ un an, c'était la règle)$+[0]
.Swift (sur une plate-forme 64 bits), 41 octets
Déclare une fermeture appelée
f
qui accepte et retourne unInt
. Cette solution ne fonctionne que correctement sur les plates-formes 64 bits, oùInt
esttypealias
éditéInt64
. (Sur une plate-forme 32 bits,Int64
peut être utilisé explicitement pour le type de paramètre de fermeture, en ajoutant 2 octets.)Dans Swift, même le type entier fondamental est un objet ordinaire déclaré dans la bibliothèque standard. Cela signifie
Int
peut avoir des méthodes et des propriétés telles queleadingZeroBitCount
(ce qui est requis sur tous les types conformes auFixedWidthInteger
protocole de la bibliothèque standard ).la source
Haskell , 24 octets
Essayez-le en ligne!
C'est fondamentalement la même que la solution Java de Kevin Cruijssen, mais je l'ai trouvée indépendamment.
L'argument doit avoir un type
Int
pour une version 64 bits, ouInt64
pour n'importe quoi.Explication
Si l'argument est négatif, le résultat est immédiatement 0. Sinon, on décale vers la gauche, en remplissant avec ceux , jusqu'à ce que nous atteignions un nombre négatif. Ce remplissage nous permet d'éviter un cas spécial pour 0.
Juste pour référence, voici le moyen évident / efficace:
34 octets
la source
Propre , 103 octets
Utilise le même "intégré" que la réponse de plafond.
Essayez-le en ligne!
Nettoyer , 58 octets
Essayez-le en ligne!
la source
Stax , 10 octets
Exécuter et déboguer
C'est un portage de la solution 05AB1E de Kevin.
la source
Perl 5
-p
, 42 octetsEssayez-le en ligne!
Plus longue qu'une solution basée sur les chaînes de bits, mais une solution basée sur les mathématiques décente.
la source
int
lancé un appel qui devrait résoudre le problème.APL (NARS), 15 caractères, 30 octets
testez quelques chiffres pour voir comment utiliser:
la source
Rouille, 18 octets
Essayez-le en ligne!
la source
K (ngn / k) , 6 octets
Essayez-le en ligne!
2\
encoder l'argument en binaire#
longueur64-
soustraire de 64la source
# = length
... semble basé sur les chaînes2\
donne une liste d'entiers et#
trouve sa longueur. aucune chaîne n'est impliquée ici.PHP,
5046 octetsExécuter en tant que pipe avec
-R
ou essayer en ligne ,<?=$argn<0?0:0|64-log($argn+1,2);
a des problèmes d'arrondi; j'ai donc pris le long chemin.la source
Wolfram Language (Mathematica), 41 bytes
La formule des nombres positifs est juste
63-Floor@Log2@#&
. Des règles de remplacement sont utilisées pour les cas spéciaux d'entrée nulle et négative.L'entrée n'a pas besoin d'être un entier signé 64 bits. Cela prendra effectivement la parole de l'entrée pour la transformer en un entier. Si vous entrez un nombre en dehors des limites normales pour un entier 64 bits, il indiquera retourner un nombre négatif indiquant combien de bits supplémentaires seraient nécessaires pour stocker cet entier.
Essayez-le en ligne!
La solution de @ LegionMammal978 est un peu plus courte avec 28 octets. L'entrée doit être un entier. Selon la documentation: "
BitLength[n]
est effectivement une version efficace deFloor[Log[2,n]]+1
." Il gère automatiquement le cas de zéro correctement rapportant0
plutôt que-∞
.Wolfram Language (Mathematica) , 28 octets
Essayez-le en ligne!
la source
Boole[#>=0](64-BitLength@#)&
is a good bit shorter at 28 bytes. It uses the same basic concept as yours, but appliesBitLength
andBoole
.bitNumber - math.ceil (math.log(number) / math.log(2))
e.g 64 bit NUMBER : 9223372036854775807 math.ceil (math.log(9223372036854775807) / math.log(2)) ANS: 63
la source