Un entier positif peut être dilué en insérant un 0
entre deux bits dans son expansion binaire. Cela signifie qu'un n
nombre de bits a des n-1
dilutions, qui ne sont pas nécessairement toutes distinctes.
Par exemple, pour 12
(ou 1100
en binaire), les dilutions sont
11000 = 24
^
11000 = 24
^
10100 = 20
^
Dans ce défi, nous allons prendre la somme de toutes les dilutions, à l'exclusion du nombre d'origine. Car 12
, en prenant la somme des 24, 24, 20
résultats dans 68
, il 68
devrait en être de même pour la sortie de 12
.
Défi
Étant donné un entier positif n > 1
en entrée, émettez / retournez la somme diluée comme expliqué ci-dessus.
Exemples
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
Règles
- L'entrée et la sortie peuvent être supposées correspondre au type d'entier natif de votre langue.
- L'entrée et la sortie peuvent être données dans n'importe quel format pratique .
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
code-golf
arithmetic
number-theory
binary
AdmBorkBork
la source
la source
Réponses:
Python 2 ,
4339 octetsEssayez-le en ligne!
Comment?
Chaque appel de la fonction récursive calcule une seule dilution. La position de l'inséré
0
estlog2(i)
. La fonction se répète jusqu'à ce qu'ellei
soit plus grande quen
et que l'insertion se fasse à gauche du nombre. Sii>n
,n/i
évalue à0
, qui est une valeur fausse en Python.n*2
décale la totalité du chiffre binaire numéro un vers la gauchen%i
oun % 2**(position of insertion)
calcule la valeur de la partie qui ne doit pas être décalée vers la gauche. Cette valeur est soustraite du nombre décalé.Exemple (n = 7)
la source
Gelée , 11 octets
Essayez-le en ligne!
Comment ça marche
la source
MATL , 13 octets
Essayez-le sur MATL Online! Ou vérifiez tous les cas de test .
Explication
Considérez la saisie
12
comme exemple.la source
C,
5856 octetsMerci à @Dennis d'avoir économisé deux octets!
Essayez-le en ligne!
C (gcc) , 50 octets
Le retour par
k=s;
est un comportement non défini, mais fonctionne avec gcc lorsque les optimisations sont désactivées. En outre,n%k+n/k*(k+=k)
a un comportement non spécifié , mais semble fonctionner correctement avec gcc.Essayez-le en ligne!
la source
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 octets)n%k
oun/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
est très bien, etn%k
sera toujours évalué avantn/k*(k*=2)
etn/k
évaluera également avantk*=2
. Merci pour l'explication. (Je vais supprimer certains de mes commentaires maintenant pour réduire l'encombrement.)Gelée ,
98 octetsEssayez-le en ligne!
Inversement,:
B¹ƤṖ+BḄS
obtenez les préfixes, supprimez-les en dernier, ajoutez-les à l'entrée et additionnez.la source
J ,
20 1514 octetsEssayez-le en ligne.
15 octets
Essayez-le en ligne!
la source
Japt ,
1211 octetsEssayez-le
Explication
la source
JavaScript (ES6),
4140 octets1 octet enregistré grâce à Mr.Xcoder
Cas de test
Afficher l'extrait de code
la source
Rétine ,
535047 octetsEssayez-le en ligne! Le lien inclut des cas de test. Edit: sauvé 3 octets grâce à @MartinEnder. Explication:
Convertissez de décimal en binaire, mais en utilisant O pour représenter 0, car ce n'est pas un chiffre, et _ pour représenter 1, car c'est le caractère de répétition par défaut dans Retina 1.
Insérez un O entre chaque paire de chiffres et rassemblez les résultats sous forme de liste.
Convertissez du binaire en unaire. (Cette conversion produit des
O
s supplémentaires , mais peu nous importe.)Additionnez et convertissez en décimal.
la source
%
. Si c'est plus compliqué, vous aurez besoin de quelque chose comme/[O_]+/_
.Pyth , 13 octets
Essayez-le ici!
Explication
la source
Gelée , 10 octets
Essayez-le en ligne!
Pas le plus court actuellement, mais il se pourrait qu'il y ait un moyen de contourner
Bµ µḄ
...Explication
Fondamentalement, cela fonctionne en multipliant chaque chiffre binaire par un nombre magique. Je ne peux pas l'expliquer sans le visualiser, alors voici le nombre binaire avec lequel nous travaillerons:
Comme expliqué par le défi, la sortie que nous voulons est la somme de ces nombres binaires:
Cependant, nous n'avons pas à insérer de zéros: l'atome "non binaire" de Jelly acceptera des nombres autres que juste
0
et1
. Quand nous nous permettons d'utiliser2
, ce modèle devient plus simple:Lorsque nous résumons les chiffres de chaque colonne, nous obtenons
L'astuce que cette réponse utilise consiste à générer ce modèle et à multiplier chaque chiffre par le chiffre correspondant dans l'original pour annuler les colonnes nécessaires. 12, par exemple, serait représenté comme
la source
Java 8, 55 octets
Port de la réponse C de Steadybox ' et golf 3 octets dans le processus.
Essayez-le en ligne.
la source
Husk ,
1312 octets-1 octet grâce à @Mr. Xcoder!
Essayez-le en ligne!
Explication
la source
05AB1E , 14 octets
Essayez-le en ligne!
la source
Pip ,
2118 octetsEssayez-le en ligne!
Explication
Appelez notre numéro d'entrée
a
. Pour chaque index binairei
auquel nous voulons insérer un zéro, nous pouvons calculer les bits à gauche du point d'insertion asa // 2**i
(où//
est la division entière et l'**
exponentiation), les bits à droite du point d'insertion asa % 2**i
, et donc l'entier dilué as2 * (a // 2**i) * 2**i + (a % 2**i)
. Mais(a // 2**i) * 2**i
est égal àa - (a % 2**i)
, et nous pouvons donc réorganiser une formule plus courte:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.la source
R ,
14148 octetsEssayez-le en ligne!
Soit je fais quelque chose de vraiment mal, soit R est tout simplement horrible à manipuler.Le portage de l'approche de Luis Mendo est facile, correct et golfique.Mais si vous voulez vraiment vous occuper des opérations de bits, MickyT a suggéré les 105 octets suivants:
Essayez-le en ligne!
la source
Python 3,
928078 octetsEssayez-le en ligne
Merci à Mr.XCoder et ovs pour -12 octets et -2 octets respectivement.
la source
Lot,
9277 octetsModifier: basculé sur la même formule que tout le monde utilise.
la source
Gelée , 14 octets
Essayez-le en ligne!
la source
Perl 5 , 36 + 1 (
-p
) = 37 octetsEssayez-le en ligne!
la source
Attaché , 57 octets
Essayez-le en ligne!
Je pensais aborder le problème à partir d'une approche de manipulation non binaire, car une telle approche n'est pas pratique dans Attache. Je dois enquêter sur certaines parties de cette approche pour trouver des alternatives.
Explication
Voici une version étendue:
Cela prend simplement la représentation binaire du nombre, le fractionne à certains points, y insère des zéros, reconvertit en décimal et les additionne.
la source
J , 33 octets
Il y a très probablement beaucoup de place pour le golf.
Comment?
@#:
convertir en binaire et<@}.\.
- trouvez tous les suffixes, déposez le premier chiffre de chacun et encadrez<\
- trouver tous les préfixes et les encadrer(,0;])"0
- à chaque préfixe ajouter 0 puis ajouter le suffixe décapité correspondant;@
raze (unbox)1#.[:}:#.@
- convertir en décimal, réduire et additionnerEssayez-le en ligne!
la source