introduction
Ce défi nécessite que vous définissiez les zéros de fin d'une représentation binaire entière 010101…
, cela est mieux expliqué avec un exemple:
Étant donné l'entier 400
, la première étape consiste à le convertir en binaire:
110010000
Comme nous pouvons voir que le cinquième bit est le bit le moins significatif 1
, à partir de là, nous remplaçons les zéros inférieurs par 0101
:
110010101
Enfin, nous convertissons cela en décimal: 405
Défi
Étant donné un retour / sortie entier positif, la valeur résultante correspondante du processus défini ci-dessus.
Règles
- Cette séquence n'est définie que pour les entiers avec au moins un
1
bit, donc l'entrée sera toujours ≥ 1 - Vous pouvez prendre la saisie sous forme de chaîne, liste de chiffres (décimal) à la place
- Vous n'avez pas à gérer les entrées non valides
Cas de test
Voici quelques autres tests avec les étapes intermédiaires (vous n'avez pas besoin de les imprimer / retourner):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298
n
la puissance maximale de 2 divise l'entrée, alors la réponse est simplement(input) + ceil((2^n - 2)/3)
Réponses:
Python 3 , 20 octets
Essayez-le en ligne!
Explication
Prenons
192
l'exemple. Sa forme binaire est11000000
, et nous devons la convertir en11010101
.Nous notons que nous devons ajouter
10101
au nombre. Il s'agit d'une série géométrique (4^0 + 4^1 + 4^2
), qui a une forme fermée comme(4^3-1)/(4-1)
. C'est la même chose que4^3//3
lorsque//
dénote une division entière.Si c'était le cas
101010
, ce serait toujours une série géométrique (2×4^0 + 2×4^1 + 2×4^2
), ce qui est2×4^3//3
pour les raisons ci-dessus.Quoi qu'il en soit,
4^3
et2×4^3
serait juste le bit le moins significatif, que nous obtenons enn&-n
:On remarque que le complément de
n
est00111111
. Si nous en ajoutons un, il devient01000000
, et il ne chevauche quen=11000000
le chiffre le moins significatif. Notez que «compléter et ajouter un» n'est qu'une négation.la source
lambda n:(n&-n)//3+n
peut- être aussi? Réussit tous les exemples de cas de test , mais selon mon intuition, il ne devrait pas être valide, non?Gelée , 5 octets
Essayez-le en ligne!
Cette fois, un port de l'approche de Leaky Nun (au moins je l'ai aidé à jouer un peu au golf: P)
Gelée , 7 octets
Essayez-le en ligne!
Utilise l'approche fantastique de JungHwan Min , avec l'aide indirecte de Martin Ender .
la source
&N:3|
. Toutes nos félicitations; vous battez Dennis dans Jelly! (Mais pas tout à fait hors-golf.)Wolfram Language (Mathematica) ,
36282624 octets-8 octets grâce à @MartinEnder et -2 octets grâce à @ Mr.Xcoder
Essayez-le en ligne!
Nous avons seulement besoin de trouver le nombre de zéros de fin dans l'entrée, de trouver le nombre avec des
0
s et des1
s alternants avec une longueur inférieure à cela, et de l'ajouter à l'entrée.Donc,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
La formule explicite pour
n
le nombre th avec alternance de1
s et0
s a été donnée dans A000975 sur OEIS. Nous pouvons utiliser len
nombre e car aucun nombre différent ne peut avoir la même longueur en binaire et avoir des chiffres alternés.la source
2^#~IntegerExponent~2
est(BitXor[#,#-1]+1)/2
#+⌊(#~BitAnd~-#)/3⌋&
place.J ,
1918 octetsEssayez-le en ligne!
Explication rapide
C'est une vieille réponse, mais elle est de nature très similaire à la réponse actuelle, elle compte simplement les zéros de fin différemment. Voir les commentaires pour un lien expliquant comment cela fonctionne.
Autres réponses:
Réponse précédente (19 octets).
Plus long qu'il ne devrait l'être car
\
va de droite à gauche.la source
+(2|-.i.@#.-.)&.#:
#.~
compte le nombre de vérités de fin , donc ce dont nous avons besoin est#.~ -. #:
de compter le nombre de zéros de finJulia 0,6 , 12 octets
Essayez-le en ligne!
la source
((!n=(n|n))&-n)/3
, ou!n=(((n|n)&(-n))/3)
, etc.|
c'est pareil+
et&
c'est pareil*
. Par conséquent,n|n&-n÷3
est analysé commen | ((n&-n) ÷3)
.JavaScript (ES6),
4039 octetsPrend l'entrée comme un entier 32 bits.
Cas de test
Afficher l'extrait de code
la source
05AB1E ,
1385 octetsEnregistré 5 octets grâce à M. Xcoder et la formule soignée de JungHwan Min
Enregistré 3 autres grâce à M. Xcoder
Essayez-le en ligne!
Explication
la source
(<bitwise and here>3÷+
devrait fonctionner pendant environ 5 octets.R ,
7158 octetsgrâce à NofP pour -6 octets
Essayez-le en ligne!
Suppose que l'entrée est un entier 32 bits. R n'a de toute façon que des entiers 32 bits signés (transtypage en
double
cas de débordement d'un entier) et pas d'entiers 64 bits ou non signés.la source
which.max(n):1-1
pour!cumsum(n)
obtenir une solution de 65 octetsbrainfuck , 120 octets
Essayez-le en ligne!
Commence par la valeur dans la cellule actuelle et se termine sur la cellule avec la valeur de sortie. Évidemment, cela ne fonctionnera pas sur les nombres supérieurs à 255 car c'est la limite de cellules pour le brainfuck typique, mais cela fonctionnera si vous supposez une taille de cellule infinie.
la source
PowerShell , 168 octets
Essayez-le en ligne!
Aie. La conversion vers / depuis le binaire et le découpage de tableaux ne sont pas vraiment les points forts de PowerShell.
Prend l'entrée
$n
sous forme de nombre. Nous avons immédiatementconvert
cela dans une base binaire2
et stocké cela dans$a
. Ensuite, nous avons une construction if / else. La clause if teste si unregex
Match
contre 1 ou plusieurs0
s à la fin de la chaîne ('0+$'
) a sonindex
à un emplacement supérieur à0
(c'est-à-dire le début de la chaîne binaire). Si c'est le cas, nous avons quelque chose à travailler,else
nous sortons simplement le nombre.À l'intérieur de
if
, nous découpons lesx
e premiers chiffres et concaténons+
les tableaux avec les chiffres restants. Cependant, pour les chiffres restants, nous les parcourons en boucle et sélectionnons a0
ou1
à afficher à la place, en utilisant$i++%2
pour choisir. Cela nous donne le010101...
motif au lieu de0
s à la fin. Ensuite, nous les remettons-join
ensemble dans une chaîne, et nous les$c
retournons dans uneInt32
base de départ2
.Dans les deux cas, le nombre est laissé sur le pipeline et la sortie est implicite.
la source
APL + WIN, 43 octets
Invite à saisir l'écran
la source
PowerShell ,
4136 octetsEssayez-le en ligne! ou vérifier tous les cas de test
Réponse de Port of Leaky Nun's Python .
5 octets enregistrés grâce à Leaky Nun
la source
PHP , 47 octets
Essayez-le en ligne!
Vraiment juste un autre port de la solution de @Leaky Nun
la source
Perl 5 , 54 octets
Essayez-le en ligne!
la source
Python 3 , 56 octets
Essayez-le en ligne!
Pas vraiment satisfait de ça pour le moment, mais je ne voulais vraiment pas utiliser la formule ... -2 grâce à Rod . -1 merci à Jonathan Frech .
la source
eval(...)
au lieu deint(...,2)
pourrait enregistrer un octet.Rubis , 15 octets
Un autre port de l'approche de Leaky Nun.
Essayez-le en ligne!
la source
Rouille , 18 octets
Un port de l'approche de Leaky Nun
Essayez-le en ligne!
la source
AWK , 24 octets
Un port de la réponse Mathmatica de JungHwan Min
Essayez-le en ligne!
la source
JavaScript ES6, 13 octets
la source
C, 56 octets
Essayez-le en ligne!
C (gcc), 50 octets
Essayez-le en ligne!
5148 octets utilisant la solution d'Arnauld :Merci à @ l4m2 pour avoir économisé trois octets!
Essayez-le en ligne!
43 avec gcc:
Essayez-le en ligne!
la source
0xAAAAAAAA
=>-1u/3*2
Pari / GP , 19 octets
Un port de l'approche de Leaky Nun.
Essayez-le en ligne!
la source
Gelée , 13 octets
Essayez-le en ligne!
Explication
Prenez 24 comme exemple d'entrée.
la source