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.


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!


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

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]

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.


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


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


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.


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)

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



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.

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!


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!



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

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!


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!


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


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]

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

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

1
Bagus Anda dapat melakukannya N&2pUdengan -mfmenghindari 0s
Oliver




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)



@ 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

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

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


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

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`
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.