Somma di poteri di 2


31

La sfida

Dato un input intero xdove 1 <= x <= 255, restituisce i risultati dei poteri di due che quando sommati danno x.

Esempi

Dato l'input:

86

Il tuo programma dovrebbe produrre:

64 16 4 2

Ingresso:

240

Produzione:

128 64 32 16

Ingresso:

1

Produzione:

1

Ingresso:

64

Produzione:

64

L'output può contenere zeri se la somma potenza di due non è presente nella somma.

Ad esempio, l'input 65potrebbe essere in uscita 0 64 0 0 0 0 0 1.

punteggio

Questo è , quindi vince la risposta più breve in ogni lingua.


5
L'elenco deve essere ordinato dal più alto al più basso?
Adám,

2
Possiamo produrre degli zeri ridondanti?
Jonathan Allan,

4
RE: "ordinati dal più alto al più basso" perché aggiungere una restrizione che non faceva parte della sfida e invalida la maggior parte delle risposte esistenti? (E che dire di little-endian ?!) + invalida la mia risposta Python poiché i set non hanno alcun ordine.
Jonathan Allan,

5
@JonathanAllan Ho rimosso la limitazione. Lo terrò a mente la prossima volta che posterò un'altra domanda: sono ancora abbastanza nuovo in questo. :)
SpookyGengar,

6
Penso che potresti voler affermare che qualsiasi potere di due può essere usato una sola volta. Altrimenti qualcuno potrebbe produrre "1 1 1" per l'ingresso 3.
Black Owl Kai

Risposte:


38

JavaScript (ES6), 28 byte

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

Provalo online!


9
Sei l'unica persona al mondo che può farmi votare risposte JavaScript!
sergiol

4
@sergiol, perché normalmente non dovresti votare una soluzione JS? Una buona soluzione è una buona soluzione indipendentemente dalla lingua utilizzata o da chi l'ha pubblicata.
Shaggy

@Shaggy Perché Arnauld sembra l'unica persona a fare tali soluzioni Javascript. Le sue risposte sono puro genio!
sergiol

3
@sergiol Grazie per il complimento, ma non è del tutto vero. Sono regolarmente superato da risposte più intelligenti - e questo è ciò di cui tratta questo sito. ^^
Arnauld

@Oliver non ne sono sicuro. Sembra che gli zeri iniziali (prima del 128) siano vietati. Altrimenti, un'altra possibile variante è f=n=>n&&f(n&~-n)+[,n&-n].
Arnauld,

12

Pure Bash , 20

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

Provalo online!

Spiegazione

          {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

Gelatina , 4 byte

-2 poiché potremmo generare zeri al posto di potenze inutilizzate di 2 :)

Ḷ2*&

Provalo online!

Come?

Ḷ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

Gelatina , 6 byte

BUT’2*

Provalo online!

Spiegazione

MA qui c'è una spiegazione (nota: avevo ipotizzato che potremmo produrre solo i poteri di 2 stessi e nient'altro):

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]

"Prova" che funziona correttamente. La rappresentazione standard di un numero intero X nella base 2 è un elenco {x1,x2,x3,,xn} , dove xi{0,1},i1,n¯ , tale che:

X=i=1nxi2ni
Gli indicii tali chexi=0 ovviamente non hanno alcun contributo, quindi siamo interessati solo a trovare quelli tali chexi=1 . Poiché sottrarrei dan non è conveniente (i poteri di due hanno tutti esponenti del moduloni , dovei è un indice di un1 ), invece di trovare gli indici di verità in questo elenco, li invertiamo e li troviamo "indietro" conUT. Ora che abbiamo trovato gli indici corretti, tutto ciò che dobbiamo fare è aumentare2 a quei poteri.


1
"Solo ASCII"
Laggiù

1
@EriktheOutgolfer Immagino BUT2*Hche funzionerebbe comunque.
Mr. Xcoder,

1
Abbastanza impressionante che funzioni con un input di 302231454903657293676544.
Michael Karas,


8

APL (Dyalog Extended) , 7 byte SBCS

Funzione prefisso tacito anonimo. Richiede l'indicizzazione basata su 0 ( ⎕IO←0).

2*⍸⍢⌽⍤⊤

Provalo online!

2 due
* elevato alla potenza di
 i ɩ ndices in cui il vero
 , mentre
 invertito
 della
 rappresentazione binaria


8

Mazza 0,2, 3 byte

⡔⡸⢣

Si decomprime in {intLiteral[2],call[NumberExpand,2]}.

Sledgehammer è un compressore per il codice Wolfram Language che utilizza Braille come tabella codici. La dimensione effettiva di quanto sopra è 2,75 byte, ma a causa delle regole correnti su meta, il riempimento al byte più vicino viene conteggiato nella dimensione del codice.


2
Eh! Piccolo linguaggio pulito e tutti i personaggi sono in realtà stampabili.
LegionMammal978,

E ora non riesco a togliermi dalla mente la canzone di Peter Gabriel ...
Digital Trauma,

8

05AB1E , 3 byte

Ýo&

La risposta di Jelly al porto di @JonathanAllan , quindi assicurati di votarlo!

Contiene zeri (inclusi -load di--zero finali).

Provalo online o verifica tutti i casi di test .

Spiegazione:

Ý      # 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
... che cosa?! Mai visto onestamente bitwise andusato in Osabie. Ben fatto.
Magic Octopus Urn

@MagicOctopusUrn In effetti anche io non lo uso molto spesso. Non riesco nemmeno a trovare un'altra risposta in cui ho usato &. XD Ho usato Bitwise-XOR un paio di volte, come qui o qui e Bitwise-NOT una volta qui (che in seguito ho rimosso di nuovo dopo aver giocato a golf ulteriormente ..). Io uso Bitwise-AND, XOR, OR, NOT, SHIFT, ecc. Abbastanza spesso in Java, ma in 05AB1E non così tanto. :)
Kevin Cruijssen,



7

R , 27 23 byte

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

Provalo online!

Codice non spiegato e spiegazione:

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 byte grazie a @Kirill L.

1
23 byte con bit a bit e.
Kirill L.

@KirillL .: geniale!
digEmAll

7

C # (compilatore interattivo Visual C #) , 29 byte

Contiene 5 caratteri non stampabili.

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

Spiegazione

//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)

Provalo online!


Ma abbiamo bisogno di sbarazzarci di zeri, come n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)La parte prima Whereè di cinque byte più breve tra
polfosol ఠ_ఠ

@polfosolThe output may contain zeros
Jo King

2
@JoKing Still, n=>new int[8].Select((j,i)=>1<<i&n)è lungo 35 byte e non avremo bisogno di ulteriori flag e codifiche di testo.
polfosol ఠ_ఠ

1
L'uso dei caratteri ascii 0-7 dovrebbe essere più breve, ad es. n=>"INSERT ASCII HERE".Select(a=>1<<a&n)Ma sono su un dispositivo mobile che non può visualizzare o digitare caratteri non stampabili, quindi dovrò aspettare fino a quando non torno a casa per aggiornare la risposta
Incarnazione dell'ignoranza il

6

C # (compilatore interattivo Visual C #) , 38 byte

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

Provalo online!



1
Fallisce per ingressi 1, 2, 4, 8, 16, ecc (il x>ydovrebbe essere x>=yinvece).
Kevin Cruijssen,

1
@ASCIIOnly - Te lo dico io, l' operatore di campo sarà dolce :)
Dana il

@ ASCII-only Nel frattempo, puoi usare il flag /u:System.Linq.Enumerablee provare questo per 31 byte
Incarnazione dell'ignoranza il

@EmbodimentofIgnorance sicuro. ma preferirei non elencare la lingua come "C # /u:System.Linq.Enumerable": P
ASCII il


5

05AB1E, 7 byte

2вRƶ<oò

spiegazione:

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

Provalo online!


Funziona anche con input di 302231454903657293676544
Michael Karas,



5

C (clang) , 133 110 63 58 byte

Soluzione a 58 byte grazie a @ceilingcat .

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

Provalo online!


In C89, è possibile dichiarare like main(){}e il tipo restituito per impostazione predefinita è int. Lo stesso vale per le variabili di portata globale. Inoltre, almeno su normali implementazioni come clang, printf e scanf funzionano senza prototipi. Ovviamente ricevi avvisi, ma è ancora valido C89 (forse) o almeno K&R C per essere dichiarati implicitamente. I tipi di oggetti C che passi come args definiscono il modo in cui vengono passati, quindi a char*e int*funzionerà semplicemente senza troncare i puntatori a 32 bit su x86-64 o altro. (Le promozioni con argomenti predefiniti si verificano, come per le funzioni variadiche che sono comunque.)
Peter Cordes

Or is this aiming to be valid C11 with no undefined behaviour? If so, proudly proclaim it. :) And BTW, writing a function that takes an output array as an arg would probably be smaller. Anyway, see Tips for golfing in C
Peter Cordes

You can use bitwise & to check if a bit is set. Like y&(1<<x)&&printf("%d ",1<<x);. Or to not skip zeros, just printf("%d ", y&(1<<x)). Or instead of counting bit positions, use x=256 and x>>=1 to shift the mask. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);} 63 bytes Try it online! clang will even compile that with -std=c11
Peter Cordes


4

MATL, 5 bytes

BPfqW

Try it online!

Explanation

Considera l'input 86come esempio.

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 bytes

-4 byte grazie a Jonathan Allan

*+&2**all ^8

Provalo online!

Restituisce un All Junction con 8 elementi. Si tratta di un modo piuttosto non standard di restituzione, ma in genere le giunzioni possono agire come ordinate (almeno fino a quando non viene implementata la creazione automatica di testi) ed è possibile estrarre i valori da una.

Spiegazione:

*+&              # 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 byte

Æ&2pX

Provalo

Æ&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

Alternativa

Suggerito da Oliver per evitare le 0s nell'output usando il -mfflag.

N&2pU

Provalo

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
Nice one. You can do N&2pU with -mf to avoid the 0s
Oliver




4

K (oK), 19 16 bytes

-3 bytes thanks to ngn!

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

Try it online!

oK does not have power operator, that's why I need a helper function {*/x#2} (copy 2 x times and reduce the resulting list by multiplication)


you can omit the { x}
ngn

@ngn Thanks! I tried it and it worked, but I wasn't sure it is acceptible.
Galen Ivanov

4

Alchemist, 125 bytes

_->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

Try it online! or Test every input!

Explanation

_->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 bytes

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

Try it online!

Or 38 with no fun >>= operator and PHP 5.6+:

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

Or 36 with little-endian ("0 2 4 0 16 0 64 0") output:

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

Really I just wanted to use the >>= operator, so I'm sticking with the 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 bytes

Can't find a shorter fancy solution, so here is a standard loop. -4 bytes thanks to MickyT and KirillL

DECLARE @y int=255

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

Try it out


using the bitwise and (&) you can save a few with the following ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. This is hinted by @KirillL for the R answer
MickyT

@MickyT that worked like a charm. Thanks a lot
t-clausen.dk


3

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

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

Port of @Arnauld's JavaScript (ES6) answer, so make sure to upvote him!

Try it online.

Explanation:

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`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.