Tổng quyền hạn của 2


31

Các thách thức

Cho một đầu vào số nguyên xtrong đó 1 <= x <= 255, trả về kết quả của lũy thừa của hai mà khi tổng cộng đưa ra x.

Ví dụ

Đưa ra đầu vào:

86

Chương trình của bạn sẽ xuất ra:

64 16 4 2

Đầu vào:

240

Đầu ra:

128 64 32 16

Đầu vào:

1

Đầu ra:

1

Đầu vào:

64

Đầu ra:

64

Đầu ra có thể chứa các số không nếu công suất nhất định của hai không có trong tổng.

Ví dụ, đầu vào 65có thể đầu ra 0 64 0 0 0 0 0 1.

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.


5
Có phải danh sách phải được sắp xếp cao nhất đến thấp nhất?
Adám

2
Chúng ta có thể xuất một số số không?
Jonathan Allan

4
RE: "được sắp xếp từ cao nhất đến thấp nhất" tại sao lại thêm một hạn chế không phải là một phần của thách thức và làm mất hiệu lực hầu hết các câu trả lời hiện có? (Ngoài ra còn về endian nhỏ?!) + Nó làm mất hiệu lực câu trả lời Python của tôi vì các bộ không có bất kỳ thứ tự nào.
Jonathan Allan

5
@Jonathan ALLan Tôi đã xóa giới hạn. Tôi sẽ ghi nhớ điều đó vào lần tới khi tôi đăng một câu hỏi khác - tôi vẫn còn khá mới với điều này. :)
SpookyGengar

6
Tôi nghĩ rằng bạn có thể muốn nói rằng bất kỳ sức mạnh của hai chỉ có thể được sử dụng một lần. Nếu không, ai đó có thể xuất "1 1 1" cho đầu vào 3.
Black Owl Kai

Câu trả lời:


38

JavaScript (ES6), 28 byte

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

Hãy thử trực tuyến!


9
Bạn là người duy nhất trên toàn thế giới có thể khiến tôi đưa ra các câu trả lời JavaScript!
sergiol

4
@sergiol, tại sao bạn thường không đưa ra giải pháp JS? Một giải pháp tốt là một giải pháp tốt bất kể ngôn ngữ được sử dụng hoặc ai đã đăng nó.
Xù xì

@Shaggy Bởi vì Arnauld dường như là người duy nhất thực hiện các giải pháp Javascript như vậy. Câu trả lời của ông là thiên tài thuần túy!
sergiol

3
@sergiol Cảm ơn lời khen, nhưng điều đó không hoàn toàn đúng. Tôi thường xuyên bị ruồng bỏ bởi những câu trả lời thông minh hơn - và đó là những gì trang web này hướng tới. ^^
Arnauld

@Oliver Tôi không chắc chắn. Có vẻ như các số 0 đứng đầu (trước 128) bị cấm. Mặt khác, một biến thể có thể là f=n=>n&&f(n&~-n)+[,n&-n].
Arnauld

12

Bash thuần khiết , 20

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

Hãy thử trực tuyến!

Giải trình

          {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

Thạch , 4 byte

-2 vì chúng ta có thể xuất số không thay cho quyền hạn không sử dụng là 2 :)

Ḷ2*&

Hãy thử trực tuyến!

Làm sao?

Ḷ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

Thạch , 6 byte

BUT’2*

Hãy thử trực tuyến!

Giải trình

NHƯNG đây là một lời giải thích (lưu ý: Tôi đã giả định rằng chúng ta chỉ có thể tự tạo ra sức mạnh của 2 và không có gì khác):

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]

X{x1,x2,x3,,xn}xi{0,1},i1,n¯

X=i=1nxi2ni
ixi=0xi=1innii1UT2


1
"Chỉ có ASCII" Lén lút ở đó ...
Erik the Outgolfer

1
@EriktheOutgolfer Tôi đoán BUT2*Hsẽ làm việc mặc dù.
Ông Xcoder

1
Khá ấn tượng khi nó hoạt động với đầu vào 302231454903657293676544.
Michael Karas



8

Sledgehammer 0,2, 3 byte

⡔⡸⢣

Giải nén thành {intLiteral[2],call[NumberExpand,2]}.

Sledgehammer là một máy nén cho mã Wolfram Language sử dụng chữ nổi làm trang mã. Kích thước thực tế ở trên là 2,75 byte, nhưng do các quy tắc hiện hành về meta, việc đệm vào byte gần nhất được tính theo kích thước mã.


2
Huh! Ngôn ngữ gọn gàng, và tất cả các ký tự thực sự có thể in được.
LegionMammal978

Và bây giờ tôi không thể lấy bài hát Peter Gabriel ra khỏi tâm trí mình ...
Digital Trauma

8

05AB1E , 3 byte

Ýo&

Cảng @JonathanAllan 's Jelly câu trả lời , vì vậy hãy chắc chắn để upvote anh ta!

Chứa các số không (bao gồm cả các số không theo sau).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Ý      # 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
... gì?! Không bao giờ nhìn thấy trung thực được bitwise andsử dụng trong osabie. Đẹp một.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Tôi thực sự cũng không sử dụng nó rất thường xuyên. Thậm chí không thể tìm thấy bất kỳ câu trả lời nào khác mà tôi đã sử dụng &. XD Tôi đã sử dụng Bitwise-XOR một vài lần, như ở đây hoặc ở đây và Bitwise-KHÔNG một lần ở đây (mà sau đó tôi đã xóa lại sau khi chơi gôn thêm ..). Tôi thường sử dụng Bitwise-AND, XOR, OR, NOT, SHIFT, v.v. khá thường xuyên trong Java, nhưng trong 05AB1E thì không nhiều lắm. :)
Kevin Cruijssen



7

R , 27 23 byte

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

Hãy thử trực tuyến!

Mã không được kiểm soát và giải thích:

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 nhờ @Kirill L

1
23 byte với bitwise và.
Kirill L.

@KirillL.: Rực rỡ!
digEmAll

7

C # (Trình biên dịch tương tác Visual C #) , 29 byte

Chứa 5 ký tự không thể in.

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

Giải trình

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

Hãy thử trực tuyến!


Nhưng chúng ta cần loại bỏ các số không, như n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)Phần trước Wherengắn hơn năm byte btw
polfosol _ఠ

@polfosolThe output may contain zeros
Jo King

2
@JoKing Tuy nhiên, n=>new int[8].Select((j,i)=>1<<i&n)dài 35 byte và chúng tôi sẽ không cần thêm cờ và mã hóa văn bản.
polfosol ఠ_

1
Sử dụng các ký tự ascii 0-7 nên ngắn hơn, ví dụ: n=>"INSERT ASCII HERE".Select(a=>1<<a&n)Nhưng tôi đang ở trên một thiết bị di động không thể hiển thị hoặc nhập không thể in được, vì vậy tôi sẽ phải đợi đến khi về nhà để cập nhật câu trả lời
Hiện thân của sự thờ ơ

6

C # (Trình biên dịch tương tác Visual C #) , 38 byte

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

Hãy thử trực tuyến!



1
Thất bại vì những đóng góp 1, 2, 4, 8, 16, vv (các x>ynên x>=ythay).
Kevin Cruijssen

1
@ASCIIOnly - Tôi đang nói với bạn, nhà điều hành phạm vi sẽ trở nên ngọt ngào :)
dana

@ Chỉ ASCII Có nghĩa là trong khi, bạn có thể sử dụng cờ /u:System.Linq.Enumerablevà thử điều này trong 31 byte
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance chắc chắn. nhưng tôi không muốn liệt kê ngôn ngữ là "C # /u:System.Linq.Enumerable": P
ASCII - chỉ


5

05AB1E, 7 byte

2вRƶ<oò

giải trình:

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

Hãy thử trực tuyến!


Cũng hoạt động với đầu vào 302231454903657293676544
Michael Karas



5

C (tiếng kêu) , 133 110 63 58 byte

Giải pháp 58 byte nhờ @ceilingcat .

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

Hãy thử trực tuyến!


Trong C89, bạn có thể khai báo like main(){}và kiểu trả về mặc định cho int. Tương tự cho các biến ở phạm vi toàn cầu. Ngoài ra, ít nhất là trên các triển khai bình thường như clang, printf và scanf hoạt động mà không có nguyên mẫu. Bạn nhận được cảnh báo tất nhiên, nhưng nó vẫn còn hiệu lực C89 (có thể) hoặc ít nhất là K & R C để chúng được khai báo ngầm. Các loại đối tượng C mà bạn truyền qua như đối số xác định cách chúng được truyền, vì vậy a char*int*sẽ chỉ hoạt động mà không cắt ngắn con trỏ thành 32 bit trên x86-64 hoặc bất cứ điều gì. (Các chương trình khuyến mãi đối số mặc định xảy ra, tương tự như đối với các hàm matrixdic mà chúng vẫn có.)
Peter Cordes

Hoặc điều này nhằm mục đích là C11 hợp lệ không có hành vi không xác định? Nếu vậy, tự hào tuyên bố nó. :) Và BTW, viết một hàm lấy một mảng đầu ra làm đối số có thể sẽ nhỏ hơn. Dù sao, hãy xem Mẹo chơi gôn ở C
Peter Cordes

Bạn có thể sử dụng bitwise &để kiểm tra nếu một bit được đặt. Thích y&(1<<x)&&printf("%d ",1<<x);. Hoặc để không bỏ qua số không, chỉ printf("%d ", y&(1<<x)). Hoặc thay vì đếm các vị trí bit, sử dụng x=256x>>=1để dịch chuyển mặt nạ. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 byte Hãy thử trực tuyến! clang thậm chí sẽ biên dịch nó với-std=c11
Peter Cordes


4

MATL , 5 byte

BPfqW

Hãy thử trực tuyến!

Giải trình

Hãy xem xét đầu vào 86là một ví dụ.

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 nhờ Jonathan Allan

*+&2**all ^8

Hãy thử trực tuyến!

Trả về một All Junction với 8 phần tử. Đây là một cách quay trở lại không chuẩn, nhưng nhìn chung, các nút có thể hoạt động theo thứ tự (ít nhất là cho đến khi tự động đọc được thực hiện) liệt kê và có thể trích xuất các giá trị từ một.

Giải trình:

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

Thử nó

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

Thay thế

Được đề xuất bởi Oliver để tránh 0s trong đầu ra sử dụng -mfcờ.

N&2pU

Thử nó

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
Đẹp một. Bạn có thể làm N&2pUvới -mfđể tránh 0s
Oliver

4

05AB1E , 9 byte

Ýoʒ›}æʒOQ

Hãy thử trực tuyến!


Điều này cũng đúng với 6 byte, nhưng nó không hoàn thành đúng lúc trên TIO cho 86:

05AB1E , 6 byte

ÝoæʒOQ

Hãy thử trực tuyến!


1
Cả hai câu trả lời của bạn đều xuất ra một tập hợp trống 15, thay vì[1,2,4,8]
Kevin Cruijssen

1
@KevinCruijssen cần thiết 2**0, bắt tốt đẹp. Ýtrên L.
Bạch tuộc ma thuật Urn

1
Ah, tôi biết cảm giác. Cũng có Lthay vì Ýlúc đầu trong câu trả lời của tôi.
Kevin Cruijssen



4

K (oK) , 19 16 byte

-3 byte nhờ ngn!

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

Hãy thử trực tuyến!

oK không có powertoán tử, đó là lý do tại sao tôi cần một hàm trợ giúp {*/x#2}(sao chép 2 xlần và giảm danh sách kết quả bằng cách nhân)


bạn có thể bỏ qua{ x}
ngn

@ngn Cảm ơn! Tôi đã thử nó và nó hoạt động, nhưng tôi không chắc nó có thể chấp nhận được.
Galen Ivanov

4

Nhà giả kim , 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

Hãy thử trực tuyến! hoặc Kiểm tra mọi đầu vào!

Giải trình

_->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,' ';

Hãy thử trực tuyến!

Hoặc 38 không có >>=toán tử thú vị và PHP 5.6+:

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

Hoặc 36 với đầu ra little endian ("0 2 4 0 16 0 64 0"):

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

Thực sự tôi chỉ muốn sử dụng >>=toán tử, vì vậy tôi gắn bó với 39 .

Các xét nghiệm:

$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

Không thể tìm thấy một giải pháp ưa thích ngắn hơn, vì vậy đây là một vòng lặp tiêu chuẩn. -4 byte nhờ MickyT và KirillL

DECLARE @y int=255

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

Dùng thử


bằng cách sử dụng bitwise và (&) bạn có thể lưu một vài thứ sau đây ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. Điều này được gợi ý bởi @KirillL cho câu trả lời R
MickyT

@MickyT làm việc như một cơ duyên. Cảm ơn rất nhiều
t-clausen.dk


3

C # (Trình biên dịch tương tác Visual C #), 33 byte

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

Cảng @Arnauld JavaScript (ES6) câu trả lời 's , vì vậy hãy chắc chắn để upvote anh ta!

Hãy thử trực tuyến.

Giải trình:

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`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.