Un entier est lourd en binaire si sa représentation binaire contient plus de 1
s que 0
s tout en ignorant les zéros de tête. Par exemple, 1 est lourd en binaire, tout comme sa représentation en binaire 1
, mais 4 n'est pas lourd en binaire, au contraire de sa représentation en binaire 100
. En cas d'égalité (par exemple 2, avec une représentation binaire de 10
), le nombre n'est pas considéré comme lourd.
Si vous entrez un nombre entier positif, indiquez une valeur de vérité si elle est lourde comme un binaire et une valeur de falsey si ce n'est pas le cas.
Testcases
Format: input -> binary -> output
1 -> 1 -> True
2 -> 10 -> False
4 -> 100 -> False
5 -> 101 -> True
60 -> 111100 -> True
316 -> 100111100 -> True
632 -> 1001111000 -> False
2147483647 -> 1111111111111111111111111111111 -> True
2147483648 -> 10000000000000000000000000000000 -> False
Notation
C'est le code-golf, donc le moins d'octets dans chaque langue gagne
code-golf
number
decision-problem
binary
Skidsdev
la source
la source
Réponses:
Code machine x86,
15 à14 octetsIl s'agit d'une fonction utilisant la convention d'appel __fastcall de Microsoft (premier et unique paramètre dans ecx, valeur de retour dans eax, l'appelant est autorisé à masquer edx), bien qu'il puisse être modifié de manière triviale pour d'autres conventions d'appel transmettant des arguments dans des registres.
Il renvoie 255 en tant que vérité et 0 en tant que falsey.
Il utilise l'opcode non documenté (mais largement pris en charge)
salc
.Démontage ci-dessous:
Essayez-le en ligne!
Merci à Peter Cordes d’ avoir suggéré de remplacer
lzcnt
parbsr
.la source
popcnt
avant de faire défiler la liste pour rechercher les réponses, mais je n'avais pas pensélzcnt
à gérer uniquement les chiffres significatifs, comme l'exigeait la question.bsr
plutôt quelzcnt
(akarep bsr
)? Vous devriez utiliser à lasub
place delea
puisque cela vous donne 32-lzcnt. (Ou laisse le dst non modifié pour src = 0, sur tout le matériel Intel et AMD existant. AMD documente même ce comportement, mais Intel dit non défini ... Quoi qu'il en soit, OP dit positif , ce qui exclut0
.)popcnt
etbsr
, mais c'était 17 octets. Je pensais que c’était plutôt bien comparé à la première réponse asm que j’ai vue , mais cettelea
astuce habile trompe le pantalon. J'ai aussi regardé comparerbsf
etpopcnt
. Mais je ne vois aucun moyen de battre cette solution, même en tenant compte du 1 octet que vous pourriez économiser en supprimant lerep
préfixe.salc
n'équivaut pas àsetc al
: ce dernieral
est défini sur 1 si CF est défini, pas sur 255.salc
estsbb al, al
, mais vous obtenez une économie de 1 octet pour le coder. À propos, il est documenté par AMD et largement supporté par Intel, le mnémonique provenant même de la carte d'opcode P6 d'Intel. Donc, celui-ci est en fait assez sûr à utiliser. Aussi, belle amélioration ici de penser à utiliser cette instruction! C’est fondamentalement ce que mon projet original faisait, sauf que (1) j’avais utilisé du code x86-64, doncinc
deux fois plus de temps pour encoder, et (2) je n’avais pas pensésalc
, alors je faisais le même travail dans un chemin plus long. Dommage que je ne puisse voter qu'une fois.Gelée , 5 octets
Donne une sortie non vide (vérité) ou vide (falsy).
Essayez-le en ligne!
Comment ça fonctionne
la source
Bo-S
, mais je ne pouvais pas trouver un atome de 1 octet qui convertirait positif / non positif en vérité / fausseté ...Æṃ
n'existait pas à l'époque.Python 2 , 35 octets
Essayez-le en ligne!
Ancienne réponse, 38 octets
Sorties
0
sous forme de fausseté et /-2
ou-1
de véritéEssayez-le en ligne!
la source
bin
cause cause cette solution?max
fonctionne. En cas d'égalité, max renverra la première valeur de l'itérable qui a la valeur maximale. Ce code utilise ce fait pour s'assurer que 1 est renvoyé en cas d'égalité, ce qui signifie en fait qu'il y en a plus que de zéros, puisqu'un zéro supplémentaire a été ajouté parbin
. Ce serait en fait inexact si vous l’écriviez de cette façon, si ce n’était pour le zéro supplémentaire.cmp
retours0
quand ils sont égauxOctave , 18 octets
TIO ne fonctionne pas car la boîte à outils de communication n'est pas incluse. Il peut être testé sur Octave-Online .
Comment ça marche:
de2bi
convertit un nombre décimal en un vecteur numérique binaire, pas une chaîne comme ledec2bin
fait le.mode
renvoie le chiffre le plus fréquent dans le vecteur. La valeur par défaut est la plus basse en cas d'égalité.la source
JavaScript (ES6),
3634 octetsla source
f=(n,x=0)=>n?f(n>>>1,x+=n%2-.5):x>0
pour 35 octets.n>>1
au lieu den>>>1
pour sauvegarder un octet puisque l'entrée n'est jamais négative.n/2|0
ne vaut pas mieux: /MATL , 3 octets
Essayez-le en ligne!
Je ne connais pas vraiment MATL, je viens de remarquer que cela
mode
pourrait fonctionner dans la réponse d’Octave d’alphalpha et j’ai pensé qu’il existait un équivalent dans MATL.la source
Mathematica, 22 octets
Enregistré un octet grâce à @MartinEnder et à @JungHwanMin .
la source
@@
.#>#2&@@#~DigitCount~2&
Brachylog , 6 octets
Essayez-le en ligne!
Explication
Puisqu'il
ḃ
ne sera jamais unifier sa sortie avec une liste de chiffres avec des zéros au début, nous savons que les occurrences de1
seront toujours en premier et les occurrences de0
seront toujours deuxièmes aprèsọ
.la source
Python 3 ,
44(merci @ c-mcavoy) 40 octetsEssayez-le en ligne!
la source
C (gcc) ,
51484140 octetsEssayez-le en ligne!
la source
unsigned
n>>=1
enn/=2
. Je pense aussi que vous pouvez utiliser à la~n
place den^-1
, ce qui devrait également vous permettre de passer&&
à&
n
, et je ne pense pas&&
à changer en&
, je ne pense pas que cela fonctionnerait. Mais le changer*
semble fonctionner&&
n'était que pour gérer le cas non signé, mais comme je n'ai besoin que de gérer des entiers positifs, je peux tout supprimer. Bon pouint d'/=
être plus court que ça>>=
, merci!n&1?++i:--1
pari+=n%2*2-1
. Vous pourriez également être en mesure de vous en débarrasser>0
en déclarant que vous allez afficher zéro pour lourd et non nul pour non lourdR ,
545351 octets-1 octet grâce à Max Lawnboy
lit de stdin; retourne
TRUE
pour les nombres lourds binaires.d
est le nombre de chiffres binaires;sum(n%/%2^(0:d)%%2
calcule la somme des chiffres (c.-à-d. le nombre de uns).Essayez-le en ligne!
la source
log2(n)
au lieu delog(n,2)
pour économiser 1 octetx86_64 code machine,
232221 octetsDémonté:
Merci @Ruslan, @PeterCordes pour
-1
byte!Essayez-le en ligne!
la source
8d 1f
au lieu de89 fb
?add eax, 2
+dec eax
, mais vos commentaires suggèrent que vous souhaitez augmenterebx
, paseax
.jnz Next
/add
/dec
(7 octets) parlea -1(%rax, %rbx, 2), %eax
(4 octets)eax += 2*ebx - 1
(comme dans l’autre réponse code machine x86 ). Ensuite, en dehors de la boucleneg %eax
(2 octets) avant de décaler le bit de signe vers le bas. Économie nette de 1 octet. Outest %eax,%eax
/setge %al
fonctionnerait également, si votre valeur de retour est unbool
ouint8_t
.lea -1(%rax,rbx,2)
mais seulementlea -1(%eax,%eax,2)
et gaspillé des octets de cette façon ... Quoi qu'il en soit, vous aviez tous les deux raison, je peux enregistrer un octet comme celui-ci. Merci beaucoup (en retour, je vais changer celalea
pour unmov
moment, je suis là)!Perl 6 ,
3230 octetsEssaye-le
Essaye-le
Étendu:
la source
Sage ,
4039 octetsEssayez-le en ligne!
Explication
la source
Haskell,
4134Si
n
c'est étrange, prenez un-1
si c'est pair, prenez un1
. Ajouter un appel récursif avecn/2
et arrêter sin = 0
. Si le résultat est inférieur,0
le nombre est binaire.Essayez-le en ligne!
Edit: @ Ørjan Johansen a trouvé des raccourcis et a sauvegardé 7 octets. Merci!
la source
mod n 2
peut être justen
, et c'est un octet plus court sans accumulateur. Essayez-le en ligne!Retina ,
3734 bytesEssayez-le en ligne! Link inclut des cas de test plus petits (les plus gros manquent probablement de mémoire). Edit: 3 octets enregistrés grâce à @MartinEnder. Explication: La première étape est convertie du nombre décimal au unaire, et les deux étapes suivantes sont converties du unaire au binaire (ceci sort presque directement de la page arithmétique unaire du wiki Retina, sauf que j'utilise
@
plutôt que0
). La troisième étape recherche des paires de caractères différents, qui peuvent être l'un@1
ou l' autre1@
, et les supprime jusqu'à ce qu'il n'en reste plus. La dernière étape vérifie ensuite les 1 restants.la source
${1}
peut être$+
. Ou vous pouvez utiliser!
au lieu de0
et puis raccourcir01|10
à.\b.
.$+
-il ce qu'il faut quand le motif contient un|
? Je me demande si j'aurais pu l'utiliser auparavant ...$+
c'est super stupide et utilise simplement le groupe avec le plus grand nombre, qu'il ait été utilisé ou non. Ce n'est utile que pour le golf lorsque vous avez plus de neuf groupes ou dans une situation comme celle-ci, et je ne sais pas pourquoi je l'utilisais jamais dans une regex de production.R , 43 octets
Essayez-le en ligne!
la source
intToBits
Kotlin , 50 octets
Lambda de type implicite
(Int) -> Boolean
. Version 1.1 et ultérieure uniquement en raison de l'utilisation deInt.toString(radix: Int)
.Malheureusement, le runtime Kotlin de TIO semble être 1.0.x, alors voici un chien triste au lieu d'un lien TIO:
la source
Pyth,
9 à7 octetsEssayez ici.
-2 grâce à FryAmTheEggman .
la source
>ysJjQ2lJ
.B
!)R,
3937 octetsCeci est une combinaison des méthodes utilisées par @MickyT et @Giuseppe, en économisant quelques octets supplémentaires.
sum(intToBits(x) > 0)
compte le nombre de1
bits et2+log2(x)/2
correspond à la moitié du nombre total de bits arrondis. Nous n'avons pas à arrondir à cause du comportement lorsque les deux valeurs sont égales.la source
C # (.NET Core) ,
62, 49 octetsSans LINQ.
EDIT: dana avec un golf de -13 octets changeant le temps en un récursif pour et retournant un booléen au lieu d’entier.
Essayez-le en ligne!
la source
Regex (ECMAScript),
857371 octetsEssayez-le en ligne!
explication par Deadcode
La version antérieure de 73 octets est expliquée ci-dessous.
^((?=(x*?)\2(\2{4})+$)\2|(?=(x*?)(\4\4xx)*$)(\4|\5(x*)\7\7(?=\4\7$)\B))+$
En raison des limitations de la regex ECMAScript, une tactique efficace consiste souvent à transformer l’étape numéro un à la fois tout en maintenant l’invariant de propriété requis à chaque étape. Par exemple, pour tester un carré parfait ou une puissance de 2, réduisez le nombre en conservant un carré ou une puissance de 2 (respectivement) à chaque étape.
Voici ce que cette solution fait à chaque étape:
1
1
1
10
01
01
Lorsque ces étapes répétées ne peuvent plus aller plus loin, le résultat final sera soit une chaîne de
1
bits contigus , ce qui est lourd et indique que le nombre d'origine était également lourd, ou une puissance de 2 indiquant que le nombre d'origine n'était pas lourd.Et bien sûr, bien que ces étapes soient décrites ci-dessus en termes de manipulations typographiques sur la représentation binaire du nombre, elles sont en réalité implémentées sous forme d'arithmétique unaire.
la source
\5
suivants sont décalés de un). J'ai étudié cela et expliqué et commenté dans ma réponse (parce que StackExchange n'autorise pas les réponses multilignes).Regex (ECMAScript), 183 octets
C’était un autre problème intéressant à résoudre avec la regex ECMA. La manière "évidente" de gérer cela consiste à compter le nombre de
1
bits et à le comparer au nombre total de bits. Mais vous ne pouvez pas compter directement dans ECMAScript regex - l'absence de références arrières persistantes signifie qu'un seul nombre peut être modifié dans une boucle et qu'il ne peut être que réduit à chaque étape.Cet algorithme unaire fonctionne comme suit:
1
bit le plus significatif vers la position la moins significative où il y a un0
bit. Chacune de ces étapes est une soustraction. À la fin de la boucle, le nombre restant (comme il serait représenté en binaire) est une chaîne de1
s sans0
s. Ces opérations sont en réalité effectuées à l’unisson; ce n'est que conceptuellement qu'ils se font en binaire.1
s" à la racine carrée obtenue précédemment. Si la racine carrée doit être arrondie, utilisez-en une version doublée. Cela garantit que la "chaîne binaire de1
s" doit avoir plus de la moitié de chiffres binaires comme N pour qu'il y ait une correspondance finale.Pour obtenir la racine carrée, on utilise une variante de l'algorithme de multiplication brièvement décrit dans mon numéro Rocco regex post . Pour identifier le
0
bit le moins significatif , on utilise l'algorithme de division décrit brièvement dans mon numéro factoriel regex post . Ce sont des spoilers . Donc , ne lisez pas plus loin si vous ne voulez pas que la magie avancée des regex unaires soit gâtée . Si vous voulez essayer vous-même de découvrir cette magie, je vous recommande vivement de commencer par résoudre certains problèmes de la liste des problèmes recommandés consécutivement marqués par des spoilers dans cet article précédent , puis d'essayer de fournir des informations mathématiques indépendantes.Sans plus tarder, la regex:
^(?=.*?(?!(x(xx)+)\1*$)(x)*?(x(x*))(?=(\4*)\5+$)\4*$\6)(?=(((?=(x(x+)(?=\10$))*(x*))(?!.*$\11)(?=(x*)(?=(x\12)*$)(?=\11+$)\11\12+$)(?=.*?(?!(x(xx)+)\14*$)\13(x*))\16)*))\7\4(.*$\3|\4)
Essayez-le en ligne!
la source
Gelée , 6 octets
Essayez-le en ligne!
la source
Bo-S
peut être utilisé pour calculer le "poids" binaire de l'entrée, malheureusement, le moyen le plus court qui semble êtreBo-S>0
Ḷ
J , 12 octets
J exécute les verbes de droite à gauche, alors commençons par la fin et poursuivons notre chemin vers le début.
Explication
la source
(#<2*+/)@#:
devrait sauver 1 sauf si je manque quelque chose.Julia, 22 octets
la source
Octave , 26 octets
Essayez-le en ligne!
la source
mode(dec2bin(a)-48)
PHP , 44 octets
Essayez-le en ligne!
PHP , 48 octets
Essayez-le en ligne!
la source
Python 2 , 44 octets
Essayez-le en ligne!
Réponse ancienne, 47 octets
Ceci est simplement un port de la réponse C de @ cleblanc . C'est plus long que les autres réponses Python mais je me suis dit que ça valait le coup de poster car c'est une méthode complètement différente pour trouver la réponse.
Essayez-le en ligne!
la source
C #, 82 octets
la source
n=>{var s=Convert.ToString(n,2);return s.Count(c=>c=='1')>s.Length/2;}
Convert
et inclureusing System.Linq;
(écrit plus court quenamespace System.Linq{}
). La bonne idée ne suffit pas pour nous permettre de réaliser des économies dans ce cas.