Somme des pouvoirs de 2


31

Le défi

Étant donné une entrée entière x1 <= x <= 255, renvoyer les résultats de puissances de deux qui, une fois sommées, donnent x.

Exemples

Compte tenu de l'entrée:

86

Votre programme devrait produire:

64 16 4 2

Contribution:

240

Sortie:

128 64 32 16

Contribution:

1

Sortie:

1

Contribution:

64

Sortie:

64

La sortie peut contenir des zéros si la puissance certaine de deux n'est pas présente dans la somme.

Par exemple, saisissez 65 peut sortir 0 64 0 0 0 0 0 1.

Notation

C'est le , donc la réponse la plus courte dans chaque langue l'emporte.


5
La liste doit-elle être triée du plus haut au plus bas?
mars

2
Pouvons-nous produire des zéros redondants?
Jonathan Allan

4
RE: "trié du plus haut au plus bas" pourquoi ajouter une restriction qui ne faisait pas partie du défi et invalide la plupart des réponses existantes? (Et qu'en est-il du petit-boutien?!) + Cela invalide ma réponse Python car les ensembles n'ont pas d'ordre.
Jonathan Allan

5
@JonathanAllan J'ai supprimé la restriction. Je garderai cela à l'esprit la prochaine fois que je posterai une autre question - je suis encore assez nouveau dans ce domaine. :)
SpookyGengar

6
Je pense que vous voudrez peut-être déclarer que tout pouvoir de deux ne peut être utilisé qu'une seule fois. Sinon, quelqu'un pourrait sortir "1 1 1" pour l'entrée 3.
Black Owl Kai

Réponses:


38

JavaScript (ES6), 28 octets

f=n=>n?[...f(n&~-n),n&-n]:[]

Essayez-le en ligne!


9
Vous êtes la seule personne au monde qui peut me faire voter contre les réponses JavaScript!
sergiol

4
@sergiol, pourquoi ne voteriez-vous pas normalement pour une solution JS? Une bonne solution est une bonne solution quelle que soit la langue utilisée ou qui l'a publiée.
Shaggy

@Shaggy Parce qu'Arnauld semble la seule personne à faire de telles solutions Javascript. Ses réponses sont du pur génie!
sergiol

3
@sergiol Merci pour le compliment, mais ce n'est pas tout à fait vrai. Je suis régulièrement dépassé par des réponses plus intelligentes - et c'est ce que propose ce site. ^^
Arnauld

@Oliver, je ne suis pas sûr. Il semble que les zéros non significatifs (avant 128) soient interdits. Sinon, une autre variante possible est f=n=>n&&f(n&~-n)+[,n&-n].
Arnauld

12

Pure Bash , 20

echo $[2**{7..0}&$1]

Essayez-le en ligne!

Explication

          {7..0}     # Brace expansion: 7 6 5 4 3 2 1 0
       2**{7..0}     # Brace expansion: 128 64 32 16 8 4 2 1
       2**{7..0}&$1  # Brace expansion: 128&n 64&n 32&n 16&n 8&n 4&n 2&n 1&n (Bitwise AND)
     $[2**{7..0}&$1] # Arithmetic expansion
echo $[2**{7..0}&$1] # and output

12

Gelée , 4 octets

-2 puisque nous pouvons produire des zéros à la place des puissances inutilisées de 2 :)

Ḷ2*&

Essayez-le en ligne!

Comment?

Ḷ2*& - Link: integer, n         e.g. 10
Ḷ    - lowered range of n            [  0,  1,  2,  3,  4,  5,  6,  7,  8,  9]
 2*  - two to the power of           [  1,  2,  4,  8, 16, 32, 64,128,256,512]
   & - bit-wise and                  [  0,  2,  0,  8,  0,  0,  0,  0,  0,  0]

11

Gelée , 6 octets

BUT’2*

Essayez-le en ligne!

Explication

MAIS voici une explication (note: j'avais supposé que nous ne pouvions sortir que les puissances de 2 elles-mêmes et rien d'autre):

BUT’2* – Monadic link. Takes a number N as input. Example: 86
B      – Convert N to binary.                              [1, 0, 1, 0, 1, 1, 0]
 U     – Reverse.                                          [0, 1, 1, 0, 1, 0, 1]
  T    – Truthy indices.                                   [2, 3, 5, 7]
   ’   – Decrement.                                        [1, 2, 4, 6]
    2* – Raise 2 to that power.                            [2, 4, 16, 64]

"Preuve" que cela fonctionne correctement. La représentation standard d'un entier X dans la base 2 est une liste {x1,x2,x3,,xn} , où xi{0,1},i1,n¯ , tel que:

X=i=1nxi2ni
Les indicesi tels quexi=0 n'ont évidemment aucune contribution, nous ne sommes donc intéressés qu'à trouver ceux tels quexi=1 . Puisque soustrairei den n'est pas commode (les puissances de deux ont toutes des exposants de la formeni , oùi est n'importe quel indice d'un1), au lieu de trouver les indices véridiques dans cette liste, nous l'inversons puis les retrouvons "à l'envers" avec UT. Maintenant que nous avons trouvé les bons indices, tout ce que nous avons à faire est d'élever 2 à ces pouvoirs.


1
"ASCII uniquement" Sneaky là-bas ...
Erik the Outgolfer

1
@EriktheOutgolfer, je suppose que BUT2*Hcela fonctionnerait cependant.
M. Xcoder

1
Assez impressionnant que cela fonctionne avec une entrée de 302231454903657293676544.
Michael Karas


8

APL (Dyalog Extended) , SBCS 7 octets

Fonction de préfixe tacite anonyme. Nécessite une indexation basée sur 0 ( ⎕IO←0).

2*⍸⍢⌽⍤⊤

Essayez-le en ligne!

2 deux
* élevé à la puissance de
 la ɩ ndices où vrai
 alors
 inversé
 de
 la représentation binaire


8

Sledgehammer 0,2, 3 octets

⡔⡸⢣

Se décompresse en {intLiteral[2],call[NumberExpand,2]} .

Sledgehammer est un compresseur pour le code Wolfram Language utilisant le braille comme page de codes. La taille réelle de ce qui précède est de 2,75 octets, mais en raison des règles actuelles sur les méta, le remplissage à l'octet le plus proche est compté dans la taille du code.


2
Hein! Petite langue soignée, et tous les personnages sont en fait imprimables.
LegionMammal978

Et maintenant, je ne peux plus sortir la chanson de Peter Gabriel de mon esprit ...
Digital Trauma

8

05AB1E , 3 octets

Ýo&

Port de @JonathanAllan 's Jelly answer , alors assurez-vous de lui donner un vote positif!

Contient des zéros (y compris des charges de zéros de fin).

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

Ý      # Create a list in the range [0, (implicit) input]
       #  i.e. 15 → [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
       #  i.e. 16 → [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
 o     # Take 2 to the power of each value
       #  → [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
       #  → [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536]
  &    # Bitwise-AND each value with the (implicit) input
       # 15 → [1,2,4,8,0,0,0,0,0,0,0,0,0,0,0,0]
       # 16 → [0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0]
       # (and output the result implicitly)

1
... quoi?! Jamais vu honnêtement bitwise andutilisé en osabie. Joli.
Urne de poulpe magique le

@MagicOctopusUrn Je ne l'utilise d'ailleurs pas très souvent. Je ne trouve même pas d'autre réponse dans laquelle j'ai utilisé &. XD J'ai utilisé Bitwise-XOR plusieurs fois, comme ici ou ici et Bitwise-NOT une fois ici (que j'ai retiré plus tard après avoir joué plus loin ..). J'utilise Bitwise-AND, XOR, OR, NOT, SHIFT, etc. assez souvent en Java, mais en 05AB1E pas tellement. :)
Kevin Cruijssen



7

R , 27 23 octets

bitwAnd(scan(),2^(7:0))

Essayez-le en ligne!

Code déroulé et explication:

A = scan()         # get input number A from stdin
                   # e.g. A = 65

bitwAnd( A , 2^(7:0))  # bitwise AND between all powers of 2 : 2^7 ... 2^0 and A
                       # and implicitly print the result
                       # e.g. B = bitwAnd(65, c(128,64,32,16,8,4,2,1)) = c(0,64,0,0,0,0,0,1)
  • 4 octets grâce à @Kirill L.

1
23 octets avec et au niveau du bit.
Kirill L.

@KirillL .: génial!
digEmAll

7

C # (Visual C # Interactive Compiler) , 29 octets

Contient 5 caractères non imprimables.

n=>"€@ ".Select(a=>a&n)

Explication

//Lambda taking one parameter 'n'
n=>
//String with ASCII characters 128, 64, 32, 16, 8, 4, 2, and 1
"€@ "
//Iterate through all the chars of the above string and transform them to
.Select(a=>
//A bitwise AND operation between the integer value of the current char and the input value
a&n)

Essayez-le en ligne!


Mais nous devons nous débarrasser des zéros, comme n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)la partie précédente Whereest plus courte de cinq octets
polfosol os_ఠ

@polfosolThe output may contain zeros
Jo King

2
@JoKing Still, n=>new int[8].Select((j,i)=>1<<i&n)fait 35 octets de long et nous n'aurons pas besoin de drapeaux et d'encodages de texte supplémentaires.
polfosol ఠ_ఠ

1
L'utilisation des caractères ascii 0-7 devrait être plus courte, par exemple, n=>"INSERT ASCII HERE".Select(a=>1<<a&n)mais je suis sur un appareil mobile qui ne peut pas afficher ou taper les caractères non imprimables, donc je vais devoir attendre jusqu'à ce que je rentre à la maison pour mettre à jour la réponse
Embodiment of Ignorance

6

C # (Visual C # Interactive Compiler) , 38 octets

x=>{for(int y=8;y-->0;Print(x&1<<y));}

Essayez-le en ligne!



1
Ne parvient pas pour les entrées 1, 2, 4, 8, 16, etc. (le x>ydevrait être à la x>=yplace).
Kevin Cruijssen

1
@ASCIIOnly - Je vous le dis, l' opérateur de la plage va être gentil :)
dana

@ ASCII seulement en moyenne, vous pouvez utiliser le drapeau /u:System.Linq.Enumerableet essayer ce pour 31 octets
de l'ignorance

@EmbodimentofIgnorance bien sûr. mais je préfère ne pas lister la langue comme "C # /u:System.Linq.Enumerable": P
ASCII uniquement


5

05AB1E, 7 octets

2вRƶ<oò

explication:

2в        convert input to binary array
R         reverse array
ƶ<        multiply each item by it's index and subtract 1
oò        2^item then round down

Essayez-le en ligne!


Fonctionne également avec l'entrée de 302231454903657293676544
Michael Karas



5

C (bruit) , 133 110 63 58 octets

Solution de 58 octets grâce à @ceilingcat .

x=256;main(y){for(scanf("%d",&y);x/=2;)printf("%d ",y&x);}

Essayez-le en ligne!


En C89, vous pouvez déclarer like main(){}et le type de retour par défaut int. Idem pour les variables à portée globale. De plus, au moins sur les implémentations normales comme clang, printf et scanf fonctionnent sans prototypes. Vous obtenez des avertissements bien sûr, mais c'est toujours C89 valide (peut-être) ou au moins K&R C pour qu'ils soient implicitement déclarés. Les types des objets C que vous passez en tant qu'args définissent comment ils sont passés, donc un char*et fonctionnera int*simplement sans tronquer les pointeurs à 32 bits sur x86-64 ou quoi que ce soit. (Les promotions d'argument par défaut se produisent, comme pour les fonctions variadiques qu'elles sont de toute façon.)
Peter Cordes

Ou vise-t-il à être valide C11 sans comportement indéfini? Si c'est le cas, proclamez-le fièrement. :) Et BTW, écrire une fonction qui prend un tableau de sortie comme argument serait probablement plus petit. Quoi qu'il en soit, voir Conseils pour jouer au golf en C
Peter Cordes

Vous pouvez utiliser au niveau du bit &pour vérifier si un bit est défini. Comme y&(1<<x)&&printf("%d ",1<<x);. Ou pour ne pas sauter de zéros, juste printf("%d ", y&(1<<x)). Ou au lieu de compter les positions des bits, utilisez x=256et x>>=1pour déplacer le masque. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 octets Essayez-le en ligne! clang compilera même cela avec-std=c11
Peter Cordes


4

MATL , 5 octets

BPfqW

Essayez-le en ligne!

Explication

Considérez l'entrée 86comme un exemple.

B    % Implicit input. Convert to binary (highest to lowest digits)
     % STACK: [1 0 1 0 1 1 0]
P    % Flip
     % STACK: [0 1 1 0 1 0 1]
f    % Find: indices of nonzeros (1-based)
     % STACK: [2 3 5 7]
q    % Subtract 1, element-wise
     % STACK: [1 2 4 6]
W    % Exponential with base 2, element-wise. Implicit display
     % STACK: [2 4 16 64]

4

Perl 6 , 16 12 octets

-4 octets grâce à Jonathan Allan

*+&2**all ^8

Essayez-le en ligne!

Renvoie une jonction All avec 8 éléments. Il s'agit d'un moyen de retour plutôt non standard, mais généralement, les jonctions peuvent agir comme des listes ordonnées (au moins jusqu'à ce que la lecture automatique soit implémentée) et il est possible d'extraire les valeurs d'une liste.

Explication:

*+&              # Bitwise AND the input with
   2**           # 2 raised to the power of
      all ^8     # All of the range 0 to 7

4

Japt, 8 5 octets

Æ&2pX

L'essayer

Æ&2pX     :Implicit input of integer U
Æ         :Map each X in the range [0,U)
 &        :  Bitwise AND of U with
  2pX     :  2 to the power of X

Alternative

Suggéré par Oliver pour éviter les 0s dans la sortie en utilisant l' -mfindicateur.

N&2pU

L'essayer

N&2pU     :Implicitly map each U in the range [0,input)
N         :The (singleton) array of inputs
 &        :Bitwise AND with
  2pX     :2 to the power of U
          :Implicitly filter and output

1
Joli. Vous pouvez faire N&2pUavec -mfpour éviter le 0s
Oliver

4

05AB1E , 9 octets

Ýoʒ›}æʒOQ

Essayez-le en ligne!


Ceci est également correct pour 6 octets, mais il ne se termine pas à temps sur TIO pour 86:

05AB1E , 6 octets

ÝoæʒOQ

Essayez-le en ligne!


1
Vos deux réponses donnent un ensemble vide pour 15, au lieu de[1,2,4,8]
Kevin Cruijssen

1
@KevinCruijssen nécessaire 2**0, belle prise. Ýfini L.
Urne de poulpe magique le

1
Ah, je connais le sentiment. Avait également Lau lieu de Ýd'abord dans ma réponse.
Kevin Cruijssen



4

K (oK) , 19 16 octets

-3 octets grâce à ngn!

{*/x#2}'&|(8#2)\

Essayez-le en ligne!

oK n'a pas d' poweropérateur, c'est pourquoi j'ai besoin d'une fonction d'aide {*/x#2}(copiez 2 xfois et réduisez la liste résultante par multiplication)


vous pouvez omettre le{ x}
ngn

@ngn Merci! Je l'ai essayé et cela a fonctionné, mais je n'étais pas sûr qu'il soit acceptable.
Galen Ivanov

4

Alchimiste , 125 octets

_->In_x+128a+m
m+x+a->m+b
m+0x+a->n+a
m+0a->o+Out_b+Out_" "
n+b->n+x+c
n+0b+a->n+c
n+0a->p
o+b->o+c
o+0b->p
p+2c->p+a
p+0c->m

Essayez-le en ligne! ou Testez chaque entrée!

Explication

_->In_x+128a+m           # Initialize universe with input, 128a (value to compare to) and m (state)
m+x+a->m+b               # If c has been halved, subtract min(a, x) from a and x and put its value into b
m+0x+a->n+a              # If x < a, continue to state n
m+0a->o+Out_b+Out_" "    # Else print and continue to state o
n+b->n+x+c               # Add min(a, x) (i.e. x) back to x, and add it to c (we're collecting a back into c)
n+0b+a->n+c              # Then, add the rest of a to c
n+0a->p                  # Then, go to state p
o+b->o+c                 # Add min(a, x) (i.e. a) to c - x _is_ greater than a and so contains it in its binary representation, so we're not adding back to x
o+0b->p                  # Then, go to state p
p+2c->p+a                # Halve c into a
p+0c->m                  # Then go to state m

4

PHP ,41 39 octets

for($c=256;$c>>=1;)echo$argv[1]&$c,' ';

Essayez-le en ligne!

Ou 38 sans >>=opérateur amusant et PHP 5.6+:

for($x=8;$x--;)echo$argv[1]&2**$x,' ';

Ou 36 avec sortie little-endian ("0 2 4 0 16 0 64 0"):

while($x<8)echo$argv[1]&2**$x++,' ';

Vraiment, je voulais juste utiliser l' >>=opérateur, donc je m'en tiens au 39 .

Tests:

$php pow2.php 86
0 64 0 16 0 4 2 0

$php pow2.php 240
128 64 32 16 0 0 0 0

$php pow2.php 1
0 0 0 0 0 0 0 1

$php pow2.php 64
0 64 0 0 0 0 0 0

$php pow2.php 65
0 64 0 0 0 0 0 1

4

TSQL, 43 39 octets

Impossible de trouver une solution de fantaisie plus courte, alors voici une boucle standard. -4 octets grâce à MickyT et KirillL

DECLARE @y int=255

,@ int=128s:PRINT @y&@ SET @/=2IF @>0GOTO s

Essaye le


en utilisant les bits et (&), vous pouvez en enregistrer quelques-uns avec ce qui suit ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. C'est suggéré par @KirillL pour la réponse R
MickyT

@MickyT qui fonctionnait comme un charme. Merci beaucoup
t-clausen.dk


3

C # (Visual C # Interactive Compiler), 33 octets

n=>{for(;n>0;n&=n-1)Print(n&-n);}

Port de la réponse JavaScript (ES6) de @Arnauld , alors assurez-vous de voter pour lui!

Essayez-le en ligne.

Explication:

n=>{            // Method with integer parameter and no return-type
  for(;n>0      //  Continue looping as long as `n` is larger than 0:
      ;         //    After every iteration:
       n&=n-1)  //     Bitwise-AND `n` by `n-1`
    Print(      //   Print with trailing newline:
      n&-n);}   //    `n` bitwise-AND `-n`
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.