Normalement, nous décomposons un nombre en chiffres binaires en lui affectant des puissances de 2, avec un coefficient de
0
ou1
pour chaque terme:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
Le choix de
0
et1
n'est ... pas très binaire. Nous effectuerons la véritable expansion binaire en développant avec des puissances de 2, mais avec un coefficient de1
ou à la-1
place:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Maintenant, cela semble binaire.
Étant donné un nombre positif, il devrait être trivial de voir que:
- Chaque nombre impair a une infinité de véritables extensions binaires
- Chaque nombre pair n'a pas de véritables extensions binaires
Par conséquent, pour qu'une véritable expansion binaire soit bien définie, nous avons besoin que l'expansion soit la plus petite , c'est-à-dire avec la plus courte longueur.
Étant donné un entier positif et impair n
, retournez sa véritable expansion binaire, du chiffre le plus significatif au chiffre le moins significatif (ou dans l'ordre inverse).
Règles:
- Comme il s'agit de code-golf , vous devez viser à le faire dans le nombre d'octets le plus court possible. Les Builtins sont autorisés.
- Toute sortie pouvant représenter et lister les coefficients est acceptable: un tableau, une chaîne de coefficients avec séparateurs, etc ...
- Des échappatoires de golf standard s'appliquent.
- Votre programme devrait fonctionner pour les valeurs comprises dans la taille entière standard de votre langue.
Cas de test
25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]
0
au lieu de-1
l'état basse tension. L'appelant qui reçoit les bits sait ce qu'ils signifient. (C'est toujours un exercice de manipulation de bits non trivial, car une rotation à droite ne fonctionne que si elle a 32 bits significatifs. Par exemple, un nombre à 5 bits a besoin d'une largeur de rotation de 5.)111-1-1
sortie valide est-elle pour25
?Réponses:
Japt , 6 octets
Essayez-le en ligne!
Explication:
la source
Pyth ,
1211 octetsEssayez-le ici!
Comment?
Tout d'abord, nous remarquons que la tâche consiste simplement à "remplacer le
0
s dans l'écriture binaire par-1
s et à le déplacer vers la droite de 1 place". - C'est exactement ce que nous devons faire! La conversion binaire nous donne une liste de0
s et1
s. Tout ce que nous devons faire ici est de trouver un moyen de se convertir0
au golf-1
. L'opérateur au niveau du bit|
(OR au niveau du bit) est notre ami. La carte de la représentation binaire s'est déplacée avec|
et-1
. Si le nombre actuel est0
, il est converti en-1
.la source
Perl 6
Version chaîne, 31 octets
Essayez-le en ligne!
Version de liste, 36 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
3534 octetsExtrait de test
Afficher l'extrait de code
la source
Perl 6 , 72 octets
Il y a sûrement une meilleure façon, mais c'est ce que j'ai ...
Essayez-le en ligne!
Explication : C'est une fonction qui prend un argument (
->$a
). Nous obtenons d'abord le nombre de coefficients nécessaires ($a.base(2).chars
= nombre de caractères dans la représentation de base 2), puis faisons un produit cartésien (X
) de ce nombre de paires(1,-1)
. (Le[X]
moyen: réduisez la liste suivante avecX
.) Nous obtenons donc une liste de toutes les combinaisons possibles de 1 et -1. Ensuite, nous filtrons (grep
) uniquement les listes qui codent le nombre donné$a
. Il n'y en a qu'une, nous obtenons donc une liste d'une liste avec les coefficients.Le bloc grep fait ceci: prend son argument comme une liste (
@^a
), l'inverse et le zippe avec une liste infinie en0,1,2,...
utilisant l'opérateur "left bit shift"+<
. Le zip s'arrête dès que la liste la plus courte est épuisée (bon pour nous!) Nous additionnons ensuite tous les résultats et les comparons avec le nombre donné. Nous avons dû utiliser.reverse
parce que le PO exige que les coefficients soient dans l'ordre du plus significatif au moins significatif.la source
Gelée , 5 octets
Essayez-le en ligne!
la source
05AB1E ,
65 octetsEssayez-le en ligne!
la source
D<
peut être®
(®
par défaut-1
).J, 11 octets
Essayez-le en ligne!
Merci à @JosiahWinslow pour l'algorithme.
Avez-vous des idées pour raccourcir la conversion? Mes pensées vont à l'utilisation de
!.
-fit (nvm, cela change juste la tolérance de la conversion).L'utilisation de
{
-take est plus longue d'un caractère.la source
Java 8, 101 octets
Port de @Oliver réponse Japt de , avec quelques octets de plus ..;)
Peut certainement être joué au golf en utilisant une approche mathématique au lieu de cette approche String.
Explication:
Essayez-le ici.
la source
R ,
908846 octetsEssayez-le en ligne!
Implémente l'algorithme d'Oliver , mais renvoie les chiffres dans l'ordre inverse. Comme nous sommes garantis que ce
n
n'est jamais pair, le bit le moins significatif (le premier) est toujours1
, alors nous le supprimons et ajoutons un1
à la fin pour simuler la rotation en R. Merci à Shaggy de m'avoir permis de corriger mes calculs .En termes simples
rev( )
les appels de fonction dans le pied de page devrait renvoyer les valeurs dans le même ordre.réponse originale, 88 octets:
Fonction anonyme; renvoie les valeurs dans l'ordre inverse avec les noms de colonne attachés.
Essayez-le en ligne!
Explication:
la source
from the most significant digit to the least significant digit (or in reversed order).
cela devrait donc être parfaitement acceptable.25
, par exemple, serait[1,1,1,-1,-1]
ou[-1,-1,1,1,1]
.2*bits - 1
au lieu de1-2*bits
. Je vous remercie.Perl 5 , 30 octets
Code de 29 octets, 1 octet pour
-p
commutateur.Essayez-le en ligne!
la source
CJam, 12 octets
Un portage de ma réponse Golfscript.
la source
Rubis ,
44 37 3332 octetsEssayez-le en ligne!
la source
Golfscript,
141314 octets-1 octet car j'ai oublié qu'il
%
existait. +1 octet car j'ai également oublié que l'entrée est une chaîne.la source
{}
pour en faire un bloc. Les programmes complets ne peuvent être saisis que sous forme de chaînes.{2base{.+(}%\}
pour 15 octets. De même, votre réponse CJam.~
.