Suma mocy 2

31

Wyzwanie

Biorąc pod uwagę liczbę całkowitą, w xktórej 1 <= x <= 255zwracane są wyniki potęg dwóch, które po zsumowaniu dają x.

Przykłady

Biorąc pod uwagę wkład:

86

Twój program powinien wypisać:

64 16 4 2

Wkład:

240

Wydajność:

128 64 32 16

Wkład:

1

Wydajność:

1

Wkład:

64

Wydajność:

64

Dane wyjściowe mogą zawierać zera, jeśli pewna potęga dwóch nie jest obecna w sumie.

Na przykład dane wejściowe 65mogą być generowane 0 64 0 0 0 0 0 1.

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w każdym języku.

SpookyGengar
źródło
5
Czy lista musi być posortowana od najwyższej do najniższej?
Adám
2
Czy możemy wygenerować zbędne zera?
Jonathan Allan
4
RE: „posortowane od najwyższego do najniższego” po co dodawać ograniczenie, które nie było częścią wyzwania i unieważnia większość istniejących odpowiedzi? (A co z little-endian ?!) + to unieważnia moją odpowiedź w Pythonie, ponieważ zestawy nie mają żadnej kolejności.
Jonathan Allan
5
@JonathanAllan Usunąłem ograniczenie. Będę o tym pamiętać następnym razem, gdy opublikuję kolejne pytanie - wciąż jestem całkiem nowy. :)
SpookyGengar
6
Myślę, że możesz chcieć stwierdzić, że każda siła dwóch może być użyta tylko raz. W przeciwnym razie ktoś mógłby podać „1 1 1” dla wejścia 3.
Black Owl Kai

Odpowiedzi:

38

JavaScript (ES6), 28 bajtów

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

Wypróbuj online!

Arnauld
źródło
9
Jesteś jedyną osobą na całym świecie, która może zmusić mnie do głosowania na odpowiedzi JavaScript!
sergiol
4
@sergiol, dlaczego normalnie nie głosowałbyś za rozwiązaniem JS? Dobre rozwiązanie to dobre rozwiązanie niezależnie od używanego języka lub tego, kto je opublikował.
Kudłaty
@Shaggy Ponieważ Arnauld wydaje się jedyną osobą, która robi takie rozwiązania JavaScript. Jego odpowiedzi są genialne!
sergiol
3
@sergiol Dzięki za komplement, ale to nie do końca prawda. Regularnie przytłaczają mnie sprytniejsze odpowiedzi - o to właśnie chodzi w tej stronie. ^^
Arnauld
@Oliver Nie jestem pewien. Wygląda na to, że wiodące zera (przed 128) są zabronione. W przeciwnym razie innym możliwym wariantem jest f=n=>n&&f(n&~-n)+[,n&-n].
Arnauld
12

Pure Bash , 20

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

Wypróbuj online!

Wyjaśnienie

          {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
Cyfrowa trauma
źródło
12

Galaretka , 4 bajty

-2, ponieważ możemy wyświetlać zera zamiast niewykorzystanych mocy 2 :)

Ḷ2*&

Wypróbuj online!

W jaki sposób?

Ḷ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]
Jonathan Allan
źródło
11

Galaretka , 6 bajtów

BUT’2*

Wypróbuj online!

Wyjaśnienie

ALE tutaj jest wyjaśnienie (uwaga: założyłem, że możemy wydać moce samych 2 i nic więcej):

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]

„Dowód”, że działa poprawnie. Standardowa reprezentacja liczby całkowitej w bazie 2 to lista , gdzie , tak, że: Wskaźniki takie, że oczywiście nie mają wpływu, więc interesujemy się tylko znajdowanie takich, że . Ponieważ odejmowanie od nie jest wygodne (wszystkie potęgi dwóch mają wykładniki postaci , gdzie jest dowolnym indeksemX{x1,x2,x3,,xn}xi{0,1},i1,n¯

X=i=1nxi2ni
ixi=0xi=1innii1), zamiast znajdować prawdziwe wskaźniki na tej liście, odwracamy ją, a następnie znajdujemy za pomocą „wstecz” . Teraz, gdy znaleźliśmy prawidłowe wskaźniki, musimy tylko podnieść do tych mocy.2UT2

Pan Xcoder
źródło
1
„Tylko ASCII” Podstępne tam ...
Erik the Outgolfer
1
@EriktheOutgolfer Chyba BUT2*Hzadziałałoby.
Pan Xcoder
1
Całkiem imponujące, że działa to z wejściem 302231454903657293676544.
Michael Karas
8

APL (Dyalog Extended) , 7 bajtów SBCS

Anonimowa ukryta funkcja prefiksu. Wymaga indeksowania opartego na 0 ( ⎕IO←0).

2*⍸⍢⌽⍤⊤

Wypróbuj online!

2 dwa
* podniesione do potęgi
 z ɩ ndices gdzie prawda
 podczas
 odwróconej
 od
 reprezentacji binarnej

Adám
źródło
8

Młot młotkowy 0,2, 3 bajty

⡔⡸⢣

Dekompresuje się na {intLiteral[2],call[NumberExpand,2]}.

Sledgehammer to kompresor kodu języka Wolfram używającego brajla jako strony kodowej. Rzeczywisty rozmiar powyższego wynosi 2,75 bajtów, ale ze względu na obecne reguły dotyczące meta dopełnianie do najbliższego bajtu jest liczone jako rozmiar kodu.

lirtosiast
źródło
2
Huh! Czysty mały język, a wszystkie znaki można wydrukować.
LegionMammal978
A teraz nie mogę wymyślić piosenki Peter Gabriel ...
Digital Trauma
8

05AB1E , 3 bajty

Ýo&

Port odpowiedzi galaretki @JonathanAllan , więc upewnij się, że go głosujesz!

Zawiera zera (w tym -loads-końcowe zera).

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Ý      # 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)
Kevin Cruijssen
źródło
1
... co?! Nigdy nie widziałem szczerze bitwise andużywanego w osabie. Niezłe.
Magic Octopus Urn
@MagicOctopusUrn I rzeczywiście nie używam go zbyt często. Nie mogę znaleźć żadnej innej odpowiedzi, w której użyłem &. XD Użyłem Bitwise-XOR kilka razy, jak tutaj lub tutaj, a Bitwise-NIE raz tutaj (którą później usunąłem po dalszym golfie ...). Używam Bitwise-AND, XOR, OR, NOT, SHIFT itp. Dość często w Javie, ale w 05AB1E nie bardzo. :)
Kevin Cruijssen
8

Catholicon , 3 bajty

ṫĊŻ

Wypróbuj online!

Wyjaśnienie:

ṫ       Decompose         into the largest values where:
 Ċ               the input
  Ż       the bit count is truthy (equal to one)
Okx
źródło
Ciekawy! Zdobądź TIO'd: D
Jonathan Allan
Współpracuje z 302231454903657293676544. Ładne.
Michael Karas
7

R , 27 23 bajtów

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

Wypróbuj online!

Kod i objaśnienie:

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 bajty dzięki @Kirill L.
digEmAll
źródło
1
23 bajty z bitowym i.
Kirill L.
@KirillL .: genialne!
digEmAll
7

C # (interaktywny kompilator Visual C #) , 29 bajtów

Zawiera 5 niedrukowalnych znaków.

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

Wyjaśnienie

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

Wypróbuj online!

Wcielenie ignorancji
źródło
Ale musimy pozbyć się zer, tak jak n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)poprzednia część Wherejest o pięć bajtów krótsza btw
polfosol ఠ_ఠ
@polfosolThe output may contain zeros
Jo King
2
@JoKing Nadal n=>new int[8].Select((j,i)=>1<<i&n)ma 35 bajtów i nie będziemy potrzebować dodatkowych flag i kodowania tekstu.
polfosol ఠ_ఠ
1
Używanie znaków ascii 0–7 powinno być krótsze, np. n=>"INSERT ASCII HERE".Select(a=>1<<a&n)Ale jestem na urządzeniu mobilnym, które nie może wyświetlać ani pisać druków, więc będę musiał poczekać, aż wrócę do domu, aby zaktualizować odpowiedź
Embodiment of Ignorance,
6

C # (interaktywny kompilator Visual C #) , 38 bajtów

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

Wypróbuj online!

dana
źródło
aw, zamknij: P
tylko ASCII
1
Nie powiedzie się wejść 1, 2, 4, 8, 16, itd. (The x>ypowinno być x>=yzamiast).
Kevin Cruijssen
1
@ASCII Tylko - mówię ci, operator zasięgu będzie słodki :)
dana
@ Tylko ASCII W międzyczasie możesz użyć flagi /u:System.Linq.Enumerablei wypróbować to przez 31 bajtów
Embodiment of Ignorance
@EmbodimentofIgnorance na pewno. ale wolałbym nie wymieniać języka jako „C # /u:System.Linq.Enumerable”: P
tylko ASCII
5

05AB1E, 7 bajtów

2вRƶ<oò

wyjaśnienie:

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

Wypróbuj online!

Jackson
źródło
Działa również z danymi wejściowymi 302231454903657293676544
Michael Karas
5

C (brzęk) , 133 110 63 58 bajtów

58-bajtowe rozwiązanie dzięki @ceilingcat .

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

Wypróbuj online!

kamienny pajęczak
źródło
W C89 możesz zadeklarować like, main(){}a domyślnym typem zwrotu jest int. To samo dotyczy zmiennych o zasięgu globalnym. Ponadto, przynajmniej w normalnych implementacjach, takich jak clang, printf i scanf, działają bez prototypów. Oczywiście otrzymujesz ostrzeżenia, ale nadal obowiązuje C89 (może) lub przynajmniej K&R C, aby można je było domyślnie zadeklarować. Typy obiektów C, które przekazujesz jako argumenty, określają sposób ich przekazywania, więc char*a int*będzie działać bez obcinania wskaźników do 32-bitów na x86-64 lub cokolwiek innego. (Zdarzają się domyślne promocje argumentów, tak samo jak w przypadku funkcji variadic, którymi są i tak.)
Peter Cordes
Czy może ma to być poprawne C11 bez niezdefiniowanego zachowania? Jeśli tak, z dumą to głoście. :) A BTW, pisanie funkcji, która przyjmuje tablicę wyjściową jako argument, prawdopodobnie byłoby mniejsze. W każdym razie zobacz Wskazówki dotyczące gry w golfa w C
Peter Cordes
Możesz użyć bitowego, &aby sprawdzić, czy bit jest ustawiony. Jak y&(1<<x)&&printf("%d ",1<<x);. Lub, aby nie pomijać zer, po prostu printf("%d ", y&(1<<x)). Lub zamiast zliczać pozycje bitów, użyj x=256i, x>>=1aby przesunąć maskę. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 bajty Wypróbuj online! clang nawet to skompiluje z-std=c11
Peter Cordes
44 bajty
pułapkat
4

MATL , 5 bajtów

BPfqW

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 86jako przykład.

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]
Luis Mendo
źródło
4

Perl 6 , 16 12 bajtów

-4 bajty dzięki Jonathanowi Allanowi

*+&2**all ^8

Wypróbuj online!

Zwraca All Junction z 8 elementami. Jest to raczej niestandardowy sposób zwracania, ale generalnie Połączenia mogą działać zgodnie z kolejnością (przynajmniej do momentu wdrożenia automatycznego odczytu) list i możliwe jest wyodrębnienie z nich wartości.

Wyjaśnienie:

*+&              # Bitwise AND the input with
   2**           # 2 raised to the power of
      all ^8     # All of the range 0 to 7
Jo King
źródło
4

Japt, 8 5 bajtów

Æ&2pX

Spróbuj

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

Alternatywny

Sugerowany przez Olivera, aby uniknąć 0s na wyjściu za pomocą -mfflagi.

N&2pU

Spróbuj

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
Kudłaty
źródło
1
Niezłe. Można zrobić N&2pUz -mfuniknąć 0s
Oliver
4

05AB1E , 9 bajtów

Ýoʒ›}æʒOQ

Wypróbuj online!


Jest to również poprawne w przypadku 6 bajtów, ale nie kończy się w czasie na TIO dla 86:

05AB1E , 6 bajtów

ÝoæʒOQ

Wypróbuj online!

Urna Magicznej Ośmiornicy
źródło
1
Obie odpowiedzi dają pusty zestaw 15zamiast[1,2,4,8]
Kevin Cruijssen
1
Potrzebny @KevinCruijssen 2**0, niezły chwyt. Ýponad L.
Magic Octopus Urn
1
Ach, znam to uczucie. Miałem też Lzamiast Ýna początku w mojej odpowiedzi.
Kevin Cruijssen
4

K (oK) , 19 16 bajtów

-3 bajty dzięki ngn!

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

Wypróbuj online!

OK nie ma poweroperatora, dlatego potrzebuję funkcji pomocnika {*/x#2}(skopiuj 2 xrazy i zmniejsz wynikową listę przez pomnożenie)

Galen Iwanow
źródło
możesz pominąć{ x}
ngn
@ngn Thanks! Próbowałem i zadziałało, ale nie byłem pewien, czy jest to akceptowalne.
Galen Iwanow
4

Alchemik , 125 bajtów

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

Wypróbuj online! lub Przetestuj każde wejście!

Wyjaśnienie

_->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
Tylko ASCII
źródło
4

PHP ,41 39 bajtów

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

Wypróbuj online!

Lub 38 bez zabawnego >>=operatora i PHP 5.6+:

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

Lub 36 z wyjściem little-endian („0 2 4 0 16 0 64 0”):

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

Naprawdę chciałem po prostu użyć >>=operatora, więc trzymam się 39 .

Testy:

$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
640 KB
źródło
4

TSQL, 43 39 bajtów

Nie mogę znaleźć krótszego fantazyjnego rozwiązania, więc oto standardowa pętla. -4 bajty dzięki MickyT i KirillL

DECLARE @y int=255

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

Wypróbuj to

t-clausen.dk
źródło
używając bitowego i (&) możesz zapisać kilka z poniższych ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. Wskazuje na to @KirillL dla odpowiedzi R
MickyT
@MickyT, który działał jak urok.
Wielkie
3

Python 2 , 43 40 bajtów

f=lambda n,p=1:n/p*[1]and f(n,p*2)+[p&n]

Wypróbuj online!

ovs
źródło
1
@JonathanAllan to zdecydowanie pomogło. Dzięki za powiadomienie.
OVS
1
... a ograniczenie zostało zniesione, więc -1 bajt :)
Jonathan Allan
3

C # (interaktywny kompilator Visual C #), 33 bajty

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

Port odpowiedzi JavaScript (ES6) na @Arnauld, więc upewnij się, że go głosujesz!

Wypróbuj online.

Wyjaśnienie:

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`
Kevin Cruijssen
źródło