inspiré par Count down from infinity
Étant donné un entier non négatif N
, affichez le nombre de répétitions des étapes suivantes pour atteindre 0:
- Convertir
N
en binaire (4812390 -> 10010010110111001100110
) - Retournez chaque bit (
10010010110111001100110 -> 01101101001000110011001
) - Couper les zéros non significatifs (
01101101001000110011001 -> 1101101001000110011001
) - Convertir en décimal (
1101101001000110011001 -> 3576217
)
Règles
- L'entrée et la sortie peuvent être dans n'importe quel format cohérent et sans ambiguïté
- L'entrée sera dans la plage entière représentable native pour votre langue (si votre langue prend en charge des entiers arbitrairement grands, il n'y a pas de limite)
Cas de test
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Cette séquence est A005811 dans l'OEIS.
~(~a) == a
Réponses:
Gelée ,
64 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
Contexte
Soit n un entier non négatif.
Les étapes 2 et 3 du processus décrit dans la spécification peuvent également être déclarées comme supprimant tous les 1 en tête et basculant les bits restants.
Cela signifie que nous supprimerons exactement un groupe de chiffres binaires adjacents et égaux à chaque itération, donc la longueur du compte à rebours binaire de n est juste le nombre de ces groupes dans la représentation binaire de n . Aux fins de ce défi, pensez à 0 comme n'ayant pas de chiffres.
Pour n = 8675309 , le processus se présente comme suit en binaire.
Au lieu de compter ces groupes (ce qui échouerait pour le cas de bord 0 ), nous procédons comme suit.
n et n: 2 ont les représentations binaires suivantes.
Notez que la représentation binaire de n: 2 est simplement n , décalée d'un bit vers la gauche.
Si nous XOR n et n: 2 , nous obtiendrons un 1 (MSB) et un 1 supplémentaire pour chaque paire de chiffres adjacents différents. Le nombre de groupes est donc égal au nombre de bits mis en n ⊻ n: 2 .
Comment ça fonctionne
la source
Python 2, 30 octets
Testez-le sur Ideone .
Contexte
Soit n un entier non négatif.
Les étapes 2 et 3 du processus décrit dans la spécification peuvent également être déclarées comme supprimant tous les 1 en tête et basculant les bits restants.
Cela signifie que nous supprimerons exactement un groupe de chiffres binaires adjacents et égaux à chaque itération, donc la longueur du compte à rebours binaire de n est juste le nombre de ces groupes dans la représentation binaire de n . Aux fins de ce défi, pensez à 0 comme n'ayant pas de chiffres.
Pour n = 8675309 , le processus se présente comme suit en binaire.
Au lieu de compter ces groupes (ce qui échouerait pour le cas de bord 0 ), nous procédons comme suit.
n et n: 2 ont les représentations binaires suivantes.
Notez que la représentation binaire de n: 2 est simplement n , décalée d'un bit vers la gauche.
Si nous XOR n et n: 2 , nous obtiendrons un 1 (MSB) et un 1 supplémentaire pour chaque paire de chiffres adjacents différents. Le nombre de groupes est donc égal au nombre de bits mis en n ⊻ n: 2 .
la source
Python 2, 29 octets
Compte le nombre d'alternances entre 0 et 1 dans l'expansion binaire, en comptant le 1 en tête comme une alternance. Le fait en vérifiant si les deux derniers chiffres binaires sont différents, puis en revenant sur le numéro avec le dernier chiffre supprimé. Les deux derniers chiffres sont exactement différents si
n%4
est 1 ou 2, ce qui peut être vérifié comme-n%4/2
.la source
JavaScript (ES6), 26 octets
Fonctionne en comptant les transitions entre 0 et 1. Fonctionne uniquement jusqu'à 31 bits. 29 octets pour prendre en charge 53 bits:
la source
Haskell, 34 octets
la source
05AB1E ,
75 octetsEnregistré 2 octets grâce à Dennis .
Sans le cas de bord de 0, cela pourrait être de 3 octets
bÔg
.Essayez-le en ligne! ou comme suite de tests
Explication
la source
CJam , 14 octets
Essayez-le en ligne!
Fondamentalement, un coup de ma réponse à l'autre question.
la source
Java 7,
112 108 100 9073 octetsIdée basique
la source
j=j/2
peut être raccourcij/=2
. En dehors de cela, une excellente réponse!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 octets ). Je laisserais quand même votre réponse actuelle, car elle est plus originale et les ports d'autres utilisateurs sont complètement opposés à l'original. :)J, 14 octets
Compte le nombre d'exécutions dans les chiffres binaires de n avec le cas spécial retournant 0 pour n = 0.
Usage
Explication
la source
CJam ,
1110 octetsMerci à @Dennis d'avoir enregistré un octet!
Essayez-le en ligne!
Explication
la source
e&
(AND logique) enregistre un octet de plus\g*
.Raquette 349 octets
Non golfé:
Essai:
Production:
la source
tl
etib
en noms de 1 octet.MATL , 7 octets
Essayez-le en ligne!
Explication
la source
Vim,
6259 octets-3 octets grâce à DJMcMayhem
Voici la sortie xxd avec les caractères non imprimables intacts:
Essayez-le en ligne!
Explication
la source
:s/^0*
est un octet plus court que:s/^0\+
, et pendant que vous êtes dans le registre "eval", vous pouvez simplement le fairepr<S-tab>'%b',<C-r>")
pour la saisie semi-automatique. (:s/^0*
car il correspond à une ligne vide, et j'ai besoin qu'il échoue pour vider une ligne vide pour échapper à la macro récursive.Rubis, 26 octets
Inspiré par la réponse Python de xnor.
la source
PHP, 64 octets
basé sur ma solution de compte à rebours
imprime les temps des
1
caractèresk
, oùk
est le nombre d'itérations.+4 octets pour la sortie entière: (sortie vide pour
0
)la source
JavaScript (ES6), 44
Fonction récursive
Limité à un entier positif javascript, 31 bits:
Gestion du nombre double précision jusqu'à 53 bits significatifs - 59 octets:
D'une autre manière: en utilisant l'algorithme étonnant de @Dennis, fonction non récursive gérant jusqu'à 53 bits, 43 octets:
la source
PHP, 51 octets
Utilise une expression régulière pour compter le nombre d'exécutions de 1 ou 0. Malheureusement, cela nécessite un cas spécial pour l'entrée de
0
qui nécessite 3 octets supplémentaires (et donne un avis).la source
o
pour éviter l'avis. b) Vous pouvez enregistrer 3 octets avec le-F
drapeau et$argn
au lieu de$argv[1]
. c)/1+|0+/
devrait suffire pour l'expression régulière.Java 7, 71 octets
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Je sais que cela est battu par la
split
solution de Geobits (qui sera finalement publiée) mais c'était toujours amusant à écrirela source
Octave, 47 octets
Selon l'entrée OEIS, la valeur que nous recherchons comme solution à ce défi est également égale au nombre de
1
s dans le code Gray pour l'entier donné.Wikipedia me dit que le code Gray peut être calculé comme x ^ (x >> 1), donc dans la fonction ci-dessus, je calcule le code Gray en tant que tel, le convertis en une chaîne binaire et compte le nombre de chiffres de cette chaîne
1
.la source
Java 7, 64 octets
Je sais que cela pourrait être battu par un port d'une des meilleures réponses, mais je l'ai trouvé dans le chat, et je ne peux pas ne pas le poster après que Poke en ait parlé :)
la source
C, 76 octets
Fonctionne pour tous les cas de test (autant que je ne veux pas inclure le mot non signé ou dernier cas de test) ...
la source
Bash, 57 octets
Paquets: Core Utililities, grep, sed, vim (pour
xxd
)Supposons que le nombre soit donné au format binaire. Toute longueur est acceptable :)
la source
Perl 5 , 31 + 1 (
p
) = 32 octetsEssayez-le en ligne!
Utilisation de la méthode de @ Dennis.
la source
Tcl , 119 octets
Essayez-le en ligne!
Encore très dépourvu de goût
la source