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.


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!


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

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]

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


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

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.


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)

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



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.

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!


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!



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!


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!


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


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]

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

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

1
Niezłe. Można zrobić N&2pUz -mfuniknąć 0s
Oliver





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

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

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


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

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`
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.