Jumlah Kekuatan 2

31

Tantangan

Diberikan input integer di xmana 1 <= x <= 255, kembalikan hasil dari kekuatan dua yang saat dijumlahkan beri x.

Contohnya

Diberikan input:

86

Program Anda harus menampilkan:

64 16 4 2

Memasukkan:

240

Keluaran:

128 64 32 16

Memasukkan:

1

Keluaran:

1

Memasukkan:

64

Keluaran:

64

Output mungkin mengandung nol jika kekuatan dua tidak ada dalam jumlah.

Misalnya, input 65dapat dihasilkan 0 64 0 0 0 0 0 1.

Mencetak gol

Ini adalah , jadi jawaban tersingkat di setiap bahasa menang.

SpookyGengar
sumber
5
Apakah daftar harus disortir tertinggi ke terendah?
Adám
2
Bisakah kita menghasilkan beberapa nol yang berlebihan?
Jonathan Allan
4
RE: "diurutkan tertinggi ke terendah" mengapa menambahkan batasan yang bukan bagian dari tantangan dan membatalkan sebagian besar jawaban yang ada? (Juga bagaimana dengan little-endian ?!) + itu membatalkan jawaban Python saya karena set tidak memiliki urutan apa pun.
Jonathan Allan
5
@ Jonathan Allan Saya sudah menghapus batasannya. Saya akan mengingatnya lain kali saya mengirim pertanyaan lain - saya masih cukup baru dalam hal ini. :)
SpookyGengar
6
Saya pikir Anda mungkin ingin menyatakan bahwa kekuatan dua hanya dapat digunakan sekali. Kalau tidak, seseorang bisa menampilkan "1 1 1" untuk input 3.
Black Owl Kai

Jawaban:

38

JavaScript (ES6), 28 byte

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

Cobalah online!

Arnauld
sumber
9
Anda adalah satu-satunya orang di seluruh dunia yang dapat membuat saya meningkatkan jawaban JavaScript!
sergiol
4
@sergiol, mengapa Anda tidak akan secara normal memilih solusi JS? Solusi yang baik adalah solusi yang baik terlepas dari bahasa yang digunakan atau siapa yang mempostingnya.
Shaggy
@Shaggy Karena Arnauld tampaknya satu-satunya orang yang melakukan solusi Javascript semacam itu. Jawabannya benar-benar jenius!
sergiol
3
@sergiol Terima kasih atas pujiannya, tapi itu tidak sepenuhnya benar. Saya secara teratur dikalahkan oleh jawaban yang lebih cerdik - dan itulah tujuan dari situs ini. ^^
Arnauld
@Saya tidak yakin. Sepertinya nol di depan (sebelum 128) dilarang. Jika tidak, varian lain yang mungkin adalah f=n=>n&&f(n&~-n)+[,n&-n].
Arnauld
12

Bash Murni , 20

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

Cobalah online!

Penjelasan

          {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
Trauma Digital
sumber
12

Jelly , 4 byte

-2 karena kita dapat menghasilkan nol menggantikan kekuatan 2 yang tidak terpakai :)

Ḷ2*&

Cobalah online!

Bagaimana?

Ḷ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
sumber
11

Jelly , 6 byte

BUT’2*

Cobalah online!

Penjelasan

TETAPI di sini adalah penjelasan (catatan: Saya berasumsi bahwa kita hanya dapat menghasilkan kekuatan 2 sendiri dan tidak ada yang lain):

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]

"Bukti" bahwa itu berfungsi dengan benar. Representasi standar integer X dalam basis 2 adalah daftar {x1,x2,x3,,xn} , di mana xsaya{0,1},saya1,n¯ , sehingga:

X=saya=1nxsaya2n-saya
Indekssaya sehinggaxsaya=0 jelas tidak memiliki kontribusi sehingga kita hanya tertarik dalam menemukan orang-orang sehinggaxsaya=1 . Karena mengurangisaya darin tidak nyaman (kekuatan dua semuanya memiliki eksponen dari bentukn-saya , di manasaya adalah indeks dari1), alih-alih menemukan indeks kebenaran dalam daftar ini, kita membalikkannya dan kemudian menemukannya dengan "mundur" UT. Sekarang kita telah menemukan indeks yang benar yang harus kita lakukan adalah menaikkan 2 ke kekuatan itu.

Tuan Xcoder
sumber
1
"Khusus ASCII" Menyelinap di sana ...
Erik the Outgolfer
1
@EriktheOutgolfer saya kira BUT2*Hakan bekerja sekalipun.
Tn. Xcoder
1
Cukup mengesankan bahwa ini bekerja dengan input 302231454903657293676544.
Michael Karas
9

Python , 35 byte

lambda n:[n&2**i for i in range(8)]

Little-endian dengan nol pada kekuatan 2 yang tidak digunakan.

Cobalah online!

Jonathan Allan
sumber
8

APL (Dyalog Extended) , 7 byte SBCS

Fungsi awalan diam-diam anonim. Membutuhkan pengindeksan berbasis 0 ( ⎕IO←0).

2*⍸⍢⌽⍤⊤

Cobalah online!

2 dua
* pangkat dari
 yang ɩ ndices mana yang benar
 sementara
 terbalik
 dari
 representasi biner

Adm
sumber
8

Sledgehammer 0,2, 3 byte

⡔⡸⢣

Dekompresi menjadi {intLiteral[2],call[NumberExpand,2]}.

Sledgehammer adalah kompresor untuk kode Bahasa Wolfram menggunakan Braille sebagai halaman kode. Ukuran aktual di atas adalah 2,75 byte, tetapi karena aturan saat ini pada meta, padding ke byte terdekat dihitung dalam ukuran kode.

lirtosiast
sumber
2
Hah! Bahasa kecil yang rapi, dan semua karakter sebenarnya dapat dicetak.
LegionMammal978
Dan sekarang saya tidak bisa mendapatkan Peter Gabriel lagu dari pikiran saya ...
Trauma Digital
8

05AB1E , 3 byte

Ýo&

Port of @JonathanAllan menjawab Jelly , jadi pastikan untuk membatalkannya!

Berisi angka nol (termasuk angka nol untuk trailing).

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Ý      # 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
sumber
1
... apa?! Tidak pernah jujur bitwise anddigunakan di osabie. Bagus
Guci Gurita Ajaib
@ MagicOctopusUrn Saya memang juga tidak terlalu sering menggunakannya. Bahkan tidak dapat menemukan jawaban lain yang telah saya gunakan &. XD Saya telah menggunakan Bitwise-XOR beberapa kali, seperti di sini atau di sini dan Bitwise-TIDAK sekali di sini (yang kemudian saya hapus lagi setelah bermain golf lebih lanjut ..). Saya menggunakan Bitwise-AND, XOR, OR, NOT, SHIFT, dll. Cukup sering di Jawa, tetapi di 05AB1E tidak begitu banyak. :)
Kevin Cruijssen
8

Catholicon , 3 byte

ṫĊŻ

Cobalah online!

Penjelasan:

ṫ       Decompose         into the largest values where:
 Ċ               the input
  Ż       the bit count is truthy (equal to one)
Okx
sumber
Menarik! Dapatkan TIO'd: D
Jonathan Allan
Bekerja dengan 302231454903657293676544. Bagus.
Michael Karas
7

R , 27 23 byte

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

Cobalah online!

Kode dan penjelasan yang belum dibuka:

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 terima kasih kepada @ Kirill L.
menggali semua
sumber
1
23 byte dengan bitwise dan.
Kirill L.
@ KirillL .: brilian!
digEmAll
7

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

Berisi 5 karakter yang tidak patut dicetak.

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

Penjelasan

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber
Tetapi kita perlu menyingkirkan nol, seperti n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)Bagian sebelumnya Whereadalah lima byte lebih pendek btw
polfosol ఠ_ఠ
@polfosolThe output may contain zeros
Jo King
2
@JoKing Still, n=>new int[8].Select((j,i)=>1<<i&n)panjangnya 35 byte dan kita tidak akan perlu tambahan bendera dan penyandian teks.
polfosol ఠ_ఠ
1
Menggunakan karakter ascii 0-7 harus lebih pendek, mis. n=>"INSERT ASCII HERE".Select(a=>1<<a&n)Tapi saya menggunakan perangkat seluler yang tidak dapat menampilkan atau mengetik yang tidak diinginkan, jadi saya harus menunggu sampai saya pulang untuk memperbarui jawabannya
Perwujudan Ketidaktahuan
6

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

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

Cobalah online!

dana
sumber
aw, tutup: P
ASCII-satunya
1
Gagal untuk input 1, 2, 4, 8, 16, dll (yang x>yharus x>=ysebaliknya).
Kevin Cruijssen
1
@ ASCIIHanya - Saya katakan, operator jangkauan akan menjadi manis :)
dana
@ Hanya ASCII Sementara itu, Anda dapat menggunakan bendera /u:System.Linq.Enumerabledan coba ini selama 31 byte
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance yakin. tetapi saya lebih suka untuk tidak mencantumkan bahasa sebagai "C # /u:System.Linq.Enumerable": P
ASCII-only
5

C (gcc) , 39 byte

f(n){for(;n;n&=n-1)printf("%d ",n&-n);}

Cobalah online!

nwellnhof
sumber
5

05AB1E, 7 byte

2вRƶ<oò

penjelasan:

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

Cobalah online!

Jackson
sumber
Juga bekerja dengan input 302231454903657293676544
Michael Karas
5

C (dentang) , 133 110 63 58 byte

Solusi 58-byte berkat @ceilingcat .

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

Cobalah online!

arakhnida batu
sumber
Di C89, Anda dapat mendeklarasikan suka main(){}dan tipe pengembalian default ke int. Sama untuk variabel di lingkup global. Juga, setidaknya pada implementasi normal seperti dentang, printf, dan scanf bekerja tanpa prototipe. Anda mendapatkan peringatan tentu saja, tetapi itu masih berlaku C89 (mungkin) atau setidaknya K&R C bagi mereka untuk dinyatakan secara implisit. Jenis objek C yang Anda lewati sebagai args mendefinisikan cara mereka dilewati, jadi a char*dan int*Just Work tanpa memotong pointer ke 32-bit pada x86-64 atau apa pun. (Promosi argumen default terjadi, sama seperti untuk fungsi variadik yang sebenarnya.)
Peter Cordes
Atau apakah ini bertujuan menjadi C11 yang valid tanpa perilaku yang tidak terdefinisi? Jika demikian, dengan bangga nyatakan hal itu. :) Dan BTW, menulis fungsi yang mengambil array output sebagai arg mungkin akan lebih kecil. Anyway, lihat Tips untuk bermain golf di C
Peter Cordes
Anda dapat menggunakan bitwise &untuk memeriksa apakah bit diatur. Seperti y&(1<<x)&&printf("%d ",1<<x);. Atau untuk tidak melewatkan nol, adil printf("%d ", y&(1<<x)). Atau alih-alih menghitung posisi bit, gunakan x=256dan x>>=1untuk menggeser topeng. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 byte Cobalah secara online! dentang bahkan akan mengkompilasi itu dengan-std=c11
Peter Cordes
44 bytes
ceilingcat
4

MATL , 5 byte

BPfqW

Cobalah online!

Penjelasan

Pertimbangkan input 86sebagai contoh.

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
sumber
4

Perl 6 , 16 12 byte

-4 byte terima kasih kepada Jonathan Allan

*+&2**all ^8

Cobalah online!

Mengembalikan Semua Persimpangan dengan 8 elemen. Ini adalah cara pengembalian yang agak non-standar, tetapi secara umum, persimpangan dapat bertindak seperti yang diperintahkan (setidaknya sampai autothreading diterapkan) daftar dan dimungkinkan untuk mengekstrak nilai dari satu.

Penjelasan:

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

Japt, 8 5 byte

Æ&2pX

Cobalah

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

Alternatif

Disarankan oleh Oliver untuk menghindari 0s dalam output menggunakan -mfflag.

N&2pU

Cobalah

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
Shaggy
sumber
1
Bagus Anda dapat melakukannya N&2pUdengan -mfmenghindari 0s
Oliver
4

05AB1E , 9 byte

Ýoʒ›}æʒOQ

Cobalah online!


Ini juga benar untuk 6-byte, tetapi tidak lengkap pada waktunya di TIO untuk 86:

05AB1E , 6 byte

ÝoæʒOQ

Cobalah online!

Guci Gurita Ajaib
sumber
1
Kedua jawaban Anda menghasilkan set kosong 15, alih-alih[1,2,4,8]
Kevin Cruijssen
1
@KevinCruijssen dibutuhkan 2**0, tangkapan yang bagus. Ýselesai L.
Guci Gurita Ajaib
1
Ah, aku tahu perasaan itu. Juga Lbukannya Ýpada awalnya dalam jawaban saya.
Kevin Cruijssen
4

K (oK) , 19 16 byte

-3 byte terima kasih kepada ngn!

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

Cobalah online!

oK tidak memiliki poweroperator, itu sebabnya saya memerlukan fungsi pembantu {*/x#2}(salin 2 xkali dan kurangi daftar yang dihasilkan dengan perkalian)

Galen Ivanov
sumber
kamu bisa menghilangkan{ x}
ngn
@ ngn, terima kasih! Saya mencobanya dan berhasil, tetapi saya tidak yakin itu dapat diterima.
Galen Ivanov
4

Alchemist , 125 byte

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

Cobalah online! atau Uji setiap input!

Penjelasan

_->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
Khusus ASCII
sumber
4

PHP ,41 39 byte

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

Cobalah online!

Atau 38 tanpa >>=operator yang menyenangkan dan PHP 5.6+:

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

Atau 36 dengan output little-endian ("0 2 4 0 16 0 64 0"):

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

Sungguh saya hanya ingin menggunakan >>=operator, jadi saya tetap menggunakan 39 .

Tes:

$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
640KB
sumber
4

TSQL, 43 39 byte

Tidak dapat menemukan solusi mewah yang lebih pendek, jadi inilah loop standar. -4 byte berkat MickyT dan KirillL

DECLARE @y int=255

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

Cobalah

t-clausen.dk
sumber
menggunakan bitwise dan (&) Anda dapat menyimpan beberapa dengan yang berikut ini ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. Ini mengisyaratkan oleh @ KirillL untuk jawaban R
MickyT
@MickyT yang bekerja seperti pesona. Terima kasih banyak
t-clausen.dk
3

Python 2 , 43 40 byte

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

Cobalah online!

ovs
sumber
1
@ Jonathan Allan ini pasti membantu. Terima kasih telah memberi tahu saya.
Ovs
1
... dan batasannya telah dicabut, jadi -1 byte :)
Jonathan Allan
3

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

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

Port of @Arnauld 's JavaScript (ES6) menjawab , jadi pastikan untuk membesarkannya!

Cobalah online.

Penjelasan:

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
sumber