Défi
Étant donné un entier au format complément à deux de 32 bits , retournez l'index du deuxième chiffre zéro le moins significatif dans la représentation binaire, où un index de 0
représente le bit le moins significatif et un index de 31
représente le bit le plus significatif.
S'il n'y a pas de second zéro, vous pouvez renvoyer 0, tout nombre négatif, toute valeur falsifiée ou signaler une erreur d'une manière qui a du sens dans votre langue.
Vous pouvez utiliser l'indexation 1 si vous préférez, mais les cas de test ci-dessous utiliseront l'indexation 0.
Vous pouvez utiliser des entiers non signés si vous préférez; si vous le faites, vous devez alors gérer des entiers dans la plage [0, 2^32)
. Si vous utilisez des entiers signés, vous devez gérer les entiers de la plage [-2^31, 2^31)
. Les cas de test ici utiliseront des entiers signés, mais notez que -x
(signé) est2^32 - x
(non signé).
Cas de test
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> Aucun -2 (0b11..10) -> Aucun -4 (0b11..00) -> 1 -5 (0b11..1011) -> Aucun -9 (0b11..10111) -> Aucun 2 ^ 31-2 (0b0111..1110) -> 31
Notation
C'est le code-golf , donc la réponse la plus courte dans chaque langue gagne!
[0, 2^32)
.0b...
en entrée?2^32-1
parce que je n'étais pas censé revenir33
.Réponses:
Python 2 , 45 octets
Essayez-le en ligne!
Utilise l'indexation 0, les nombres non signés et renvoie une erreur sur aucun deuxième zéro.
Crée simplement une liste d'index de bits non définis, du plus bas au plus élevé, et renvoie la deuxième entrée.
la source
JavaScript (ES6), 34 octets
Renvoie un index basé sur 0, ou
-1
si aucun deuxième zéro n'est trouvé.Cas de test
Afficher l'extrait de code
Expression alternative
Version récursive, 42 octets
Renvoie un index basé sur 0, ou
false
si aucun deuxième zéro n'est trouvé.Comment?
Cas de test
Afficher l'extrait de code
Version alternative suggérée par Neil, 41 octets
Renvoie un index basé sur 0 ou renvoie une erreur de récursivité trop importante si aucun deuxième zéro n'est trouvé.
la source
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Gelée , 7 octets
Essayez-le en ligne!
Il produit quelque chose qui n'est pas dans la plage [1,31] s'il n'y a pas le deuxième zéro. Cela comprend
32
33
et(-inf+nanj)
. Je suppose que cela a du sens.Il calcule
log(((x|(x+1))+1)&~x)/log(2)
.la source
-inf+nanj
Je ne pensais même pas que cela pourrait exister(-inf+nanj)
pour une entrée2147483647
dont la représentation binaire est de 31 1s, donc pas de second zéro en notation signée 32 bits (c'est pourquoi il est tellement plus court que le mien et les réponses d'Erik).(-inf+nanj)
?Java, ...
194191186octets-159 octets pour utiliser des noms de variables plus petits et supprimer les espaces blancs
-25 octets, après avoir pris des variables encore plus courtes et grâce aux astuces @KevinCruijssen
-18 octets, plus d'espaces blancs, le nom de la fonction
-3 octets, grâce à @KevinCruijssen, raccourcir si condition
-5 octets , Merci à @Arnold Palmer, @KevinCruijssen, boucle de raccourcissement
Non golfé
la source
static
pouvez jouer au golf: peuvent être supprimées;if(n<0||n>o){return 0;}
peut êtreif(n<0|n>o)return 0;
(|
au lieu de||
et pas de crochets);bs
,bsa
Etc. peuvent tous être des caractères simples (ne jamais utiliser de noms de variables multi-octets / méthode dans le code-golf); Vous pouvez combinerint
s, comme ceci:int o=2^32-2,c=0,i=x.length,l=i-1;
. Et il y a encore plus de choses au golf. Des conseils pour jouer au golf en Java et des conseils pour jouer au golf dans toutes les langues peuvent être intéressants à lire. Encore une fois bienvenue, et profitez de votre séjour! :)if(c[i]=='0'){j++;}
peut encore être joué àif(c[i]==48)j++;
-3 octets :) EDIT: Ou mieux encore:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
peut êtrefor(;j<2&i>0;j+=c[i--]==48?1:0);
à -8 octets.for(;j<2&i>0;j+=c[--i]==48?1:0);
cela devrait fonctionner. L'erreur vient dei
la longueur de la chaîne, donc au départ, vous essayez d'indexer au-delà des limites du tableau. Si vous effectuez une pré-décrémentation (comme indiqué dans l'extrait mis à jour), la première fois que vous l'utiliserez, il y aura accèsc[c.length-1]
comme dans votre code d'origine.Java (OpenJDK 8) ,
4438 octetsEssayez-le en ligne!
Renvoie 0 s'il n'existe pas de second bit zéro.
la source
Code machine IA-32,
1413 octetsHexdump:
Liste de démontage:
Reçoit une entrée dans
ecx
; la sortie est enal
. Renvoie 0 en cas d'erreur.Tout d'abord, il inverse l'entrée, afin qu'il puisse utiliser les instructions de balayage de bits pour rechercher les bits définis. Il recherche le bit défini le moins significatif, le réinitialise, recherche à nouveau le bit défini le moins significatif et renvoie le résultat.
Si l'instruction de balayage de bits ne trouve aucun bit défini, la documentation Intel indique que la sortie n'est pas définie. Cependant, dans la pratique, tous les processeurs laissent le registre de destination inchangé dans ce cas (comme indiqué par Cody Gray, la documentation AMD décrit ce comportement comme obligatoire).
Donc, il y a les cas suivants:
not
et reste 0btr
et reste 0 aprèsbsf
bsf
la source
SALC
+DEC
soit extrêmement intelligent, vous pouvez raser un octet en utilisant simplement ce qu'il contient àECX
partir de la deuxièmeBSF
instruction. La seule chose qui nécessite est un octetXCHG
pour obtenir le résultatEAX
afin qu'il puisse être retourné. En d'autres termes,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
comme registre d'entrée, nous devons dire à GCC d'utiliser la convention d'appel fastcall.Dyalog APL, 20 octets
Utilise l'indexation 1, lance
INDEX ERROR
en cas d'absence de deuxième zéro.Comment?
⍵⊤⍨
- encoder en⍵
tant que32⍴2
- chaîne binaire de longueur 32⌽
- inverser~
- nier (0 → 1, 1 → 0)(⍳32)/⍨
- compresser avec la plage 1-32 (en laissant des index de zéros)2⊃
- choisissez le deuxième élémentla source
⍸
)Gelée , 13 octets
Essayez-le en ligne!
Utilise l'indexation 1, obtient un entier non signé en entrée. Renvoie
0
pour introuvable.la source
33
pour l'entrée4294967295
(2^32-1
, l'équivalent non signé 32 bits de-1
)Gelée , 12 octets
Un lien monadique, prenant un entier, utilisant l'option non signée et renvoyant le résultat indexé 1 (retourne 0 quand il n'en existe pas).
Essayez-le en ligne!
ou
Essayez ça
Comment?
1.
2.
la source
code machine x86_64,
3432 octetsJe ne sais pas si c'est la bonne approche, beaucoup d'octets (il s'avère que ce n'est pas le cas ):
Essayez-le en ligne!
Merci @CodyGray pour les
-2
octets.la source
BSF
,BSR
,POPCNT
,BT
, etc. Anatolyg a soumis une solution dans ce sens . Je n'ai pas encore déterminé s'il peut être battu. :-por ecx, -1
,. C'est 3 octets, 1 octet de moins que XOR + NEG. Ce n'est pas un bon truc quand ne jouez pas au golf, car cela introduit une fausse dépendance en lecture sur le registre de destination, mais là, il vous suffit d'utilisermov ecx, -1
et de dépenser les 5 octets.8ème , 149 octets
Code commenté
Utilisation et sortie
la source
R , 66 octets
lit à partir de stdin; renvoie
0
pour aucun deuxième zéro et le lieu autrement.Essayez-le en ligne!
la source