2의 거듭 제곱의 합


31

도전

x여기에 정수 입력 이 주어지면 합이 주어지면 1 <= x <= 2552의 거듭 제곱의 결과를 반환하십시오 x.

주어진 입력 :

86

프로그램은 다음을 출력해야합니다 :

64 16 4 2

입력:

240

산출:

128 64 32 16

입력:

1

산출:

1

입력:

64

산출:

64

합계에 특정 2의 거듭 제곱이 없으면 출력에 0이 포함될 수 있습니다.

예를 들어 input 65이 출력 될 수 있습니다 0 64 0 0 0 0 0 1.

채점

이것은 이므로 각 언어에서 가장 짧은 답변이 이깁니다.


5
목록을 가장 높은 순서로 정렬해야합니까?
Adám

2
여분의 0을 출력 할 수 있습니까?
Jonathan Allan

4
RE : "최고에서 최저로 정렬"왜 도전에 포함되지 않은 제한을 추가하고 대부분의 기존 답변을 무효화합니까? (또한 리틀 엔디안은 어떻습니까?!) + 세트에는 순서가 없으므로 파이썬 답변이 무효화됩니다.
Jonathan Allan

5
@JonathanAllan 제한을 제거했습니다. 다음에 또 다른 질문을 게시 할 때이 점을 명심하겠습니다. 저는 여전히이 문제에 대해 매우 익숙합니다. :)
SpookyGengar

6
2의 거듭 제곱은 한 번만 사용할 수 있다고 말하고 싶을 것입니다. 그렇지 않으면 누군가 입력 3에 대해 "1 1 1"을 출력 할 수 있습니다.
Black Owl Kai

답변:


38

자바 스크립트 (ES6), 28 바이트

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

온라인으로 사용해보십시오!


9
당신은 전 세계에서 유일하게 JavaScript 답변을지지 할 수있는 사람입니다!
sergiol

4
@sergiol, 왜 보통 JS 솔루션을 찬성하지 않습니까? 좋은 솔루션은 사용하는 언어 나 게시 한 사람에 관계없이 좋은 솔루션입니다.
얽히고 설킨

@Shaggy Arnauld가 그러한 자바 스크립트 솔루션을하는 유일한 사람인 것 같습니다. 그의 대답은 순수한 천재입니다!
sergiol

3
@sergiol 칭찬에 감사드립니다, 그러나 그것은 사실이 아닙니다. 나는 더 많은 영리한 답변으로 정기적으로 나가고 있습니다. 이것이 바로이 사이트의 모든 것입니다. ^^
Arnauld

@Oliver 확실하지 않습니다. 선행 0 (128 이전)은 금지 된 것 같습니다. 그렇지 않은 경우 다른 가능한 변형은 f=n=>n&&f(n&~-n)+[,n&-n]입니다.
Arnauld

12

순수한 배쉬 , 20

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

온라인으로 사용해보십시오!

설명

          {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

젤리 , 4 바이트

사용하지 않는 2의 힘 대신에 0을 출력 할 수 있기 때문에 -2 :)

Ḷ2*&

온라인으로 사용해보십시오!

방법?

Ḷ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

젤리 , 6 바이트

BUT’2*

온라인으로 사용해보십시오!

설명

그러나 여기에 설명이 있습니다 (참고 : 우리는 2 자체의 힘만 출력하고 다른 것은 출력 할 수 없다고 가정했습니다).

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]

제대로 작동하는지 "증명"하십시오. 밑이 2 인 정수 의 표준 표현은 . 여기서 과 같이 : 과 같은 지수 는 분명히 기여하지 않으므로 우리는 단지 관심이 있습니다 과 같은 것을 찾으십시오 . 에서 를 빼는 것이 편리하지 않기 때문에 (2의 거듭 제곱은 모두 형식의 지수를 갖습니다 . 여기서 는 인덱스입니다.X{x1,x2,x3,,xn}xi{0,1},i1,n¯

X=i=1nxi2ni
ixi=0xi=1innii1),이 목록에서 진지한 지수를 찾는 대신이를 뒤집고 "뒤로"를 찾습니다 . 이제 올바른 지수를 찾았으므로 를 그 위력으로 올리는 것입니다 .2UT2


1
"ASCII 전용"음흉 ...
아웃 골퍼 Erik

1
@EriktheOutgolfer BUT2*H그래도 작동 할 것 같습니다 .
Mr. Xcoder

1
이 입력이 302231454903657293676544의 입력으로 작동한다는 점이 매우 인상적입니다.
Michael Karas



8

슬레지 해머 0.2, 3 바이트

⡔⡸⢣

로 압축 해제합니다 {intLiteral[2],call[NumberExpand,2]}.

Sledgehammer는 점자를 코드 페이지로 사용하는 Wolfram 언어 코드의 압축기입니다. 위의 실제 크기는 2.75 바이트이지만 메타의 현재 규칙으로 인해 가장 가까운 바이트로 채워지는 코드 크기로 계산됩니다.


2
응! 깔끔한 작은 언어로 모든 문자를 실제로 인쇄 할 수 있습니다.
LegionMammal978

그리고 지금 나는 피터 가브리엘 노래 를 내 마음에서 꺼낼 수 없습니다 ...
Digital Trauma

8

05AB1E , 3 바이트

Ýo&

@JonathanAllan 의 젤리 답변 포트 , 그래서 그를 투표해야합니다!

0을 포함합니다 (-loads of- trailing 0).

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Ý      # 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
... 뭐?! bitwise andosabie에서 정직하게 사용 된 적이 없습니다. 좋은데
매직 문어 Urn

@MagicOctopusUrn 실제로도 자주 사용하지는 않습니다. 심지어 내가 사용했던 다른 답변을 찾을 수 없습니다 &에 있습니다.의 xD 내가 좋아하는, 비트 단위 XOR 몇 번을 사용하고 여기여기 와 비트 단위가 아니라 한 번 여기에 (나중에 더 골프 후 다시 제거하는 ..). Java에서는 Bitwise-AND, XOR, OR, NOT, SHIFT 등을 자주 사용하지만 05AB1E에서는별로 사용하지 않습니다. :)
Kevin Cruijssen



7

R , 27 23 바이트

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

온라인으로 사용해보십시오!

풀린 코드 및 설명 :

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)
  • @Kirill L 덕분에 4 바이트

1
비트 단위로 23 바이트 .
Kirill L.

@KirillL .: 훌륭합니다!
digEmAll

7

C # (Visual C # 대화식 컴파일러) , 29 바이트

인쇄 할 수없는 문자 5 개가 들어 있습니다.

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

설명

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

온라인으로 사용해보십시오!


그러나 우리는 0을 제거해야합니다. n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)이전의 부분 Where은 5 바이트 짧습니다. btw
polfosol ఠ_ఠ

@polfosolThe output may contain zeros
조왕

2
@JoKing Still n=>new int[8].Select((j,i)=>1<<i&n)은 길이가 35 바이트이므로 추가 플래그 및 텍스트 인코딩이 필요하지 않습니다.
polfosol ఠ_ఠ

1
0-7 예를 들어, 짧은해야 ASCII 문자를 사용 n=>"INSERT ASCII HERE".Select(a=>1<<a&n)하지만 집에 답을 업데이트 할 얻을 때까지 기다려야 그래서, unprintables를 표시하거나 입력 할 수 없습니다 모바일 장치에있어
무지의 실시 예

6

C # (Visual C # 대화식 컴파일러) , 38 바이트

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

온라인으로 사용해보십시오!



1
실패 입력에 대해 1, 2, 4, 8, 16, 등합니다 (이 x>y되어야 x>=y하는 대신).
케빈 크루이 ssen

1
@ASCIIOnly-당신에게 말하고 있습니다, 범위 연산자 는 달콤합니다 :)
dana

@ ASCII 전용 평균 동안, 당신은 플래그를 사용하여 /u:System.Linq.Enumerable시도 31 바이트
예 무지의

@ 무지의 구현입니다. 하지만 언어를 "C # /u:System.Linq.Enumerable" 으로 표시하고 싶지 않습니다 . : P
ASCII 전용





5

C (연타) , 133 (110) 63 58 바이트

@ceilingcat 덕분에 58 바이트 솔루션 .

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

온라인으로 사용해보십시오!


C89에서는 like를 선언 할 수 main(){}있으며 반환 유형의 기본값은 int입니다. 전역 범위의 변수에 대해서도 동일합니다. 또한 최소한 clang, printf 및 scanf와 같은 일반적인 구현에서는 프로토 타입없이 작동합니다. 물론 경고 메시지가 표시되지만 암시 적으로 선언되는 것은 여전히 ​​유효한 C89 (아마도)이거나 최소한 K & R C입니다. 는 C의 유형은, 그래서 당신은 그들이 통과하고 어떻게 인수의 정의로 전달할 객체 char*int*x86-64에 또는 아무것도에 32 비트 포인터를 잘라 내지 않고는 것입니다 그냥 작업 할 수 있습니다. (기본 인수 승격은 어쨌든 다양한 기능과 동일합니다.)
Peter Cordes

또는 이것은 정의되지 않은 행동이없는 유효한 C11을 목표로합니까? 그렇다면 자랑스럽게 선포하십시오. :) 그리고 BTW, 출력 배열을 인수로 취하는 함수를 작성하는 것이 아마도 더 작을 것입니다. 어쨌든 C에서 골프 팁
Peter Cordes

비트 단위 &를 사용 하여 비트가 설정되어 있는지 확인할 수 있습니다 . 처럼 y&(1<<x)&&printf("%d ",1<<x);. 또는 0을 건너 뛰지 않으려면 그냥 printf("%d ", y&(1<<x)). 또는 비트 위치를 계산하는 대신 x=256x>>=1을 사용 하여 마스크를 이동하십시오. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 바이트 온라인으로 사용해보십시오! clang은 다음과 같이 컴파일 할 것입니다-std=c11
Peter Cordes


4

MATL , 5 바이트

BPfqW

온라인으로 사용해보십시오!

설명

86예를 들어 입력 을 고려하십시오 .

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

펄 6 , 16 12 바이트

Jonathan Allan 덕분에 -4 바이트

*+&2**all ^8

온라인으로 사용해보십시오!

8 개의 요소가있는 모든 접합을 반환합니다. 이것은 표준이 아닌 리턴 방식이지만, 일반적으로 Junction은 (적어도 자동 스레딩이 구현 될 때까지) 순서대로 작동 할 수 있으며 값을 추출 할 수 있습니다.

설명:

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

4

apt, 8 5 바이트

Æ&2pX

시도 해봐

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

대안

Oliver 가 플래그를 0사용하여 출력 에서 s 를 피하도록 제안합니다 -mf.

N&2pU

시도 해봐

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
좋은데 당신은 할 수 N&2pU-mf피하기 위해 0
올리버

4

05AB1E , 9 바이트

Ýoʒ›}æʒOQ

온라인으로 사용해보십시오!


이것은 6 바이트에도 맞지만 TIO에서 86 시간 동안 완료되지는 않습니다.

05AB1E , 6 바이트

ÝoæʒOQ

온라인으로 사용해보십시오!


1
모두 답을 출력 할 빈 세트 15대신에,[1,2,4,8]
케빈 Cruijssen

1
@KevinCruijssen 필요 2**0, 좋은 캐치. Ý이상 L.
매직 문어 Urn

1
아, 그 느낌 알아 또한 한 L대신 Ý내 대답에 처음.
케빈 크루이 ssen




4

연금술사 , 125 바이트

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

온라인으로 사용해보십시오! 또는 모든 입력을 테스트하십시오!

설명

_->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 바이트

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

온라인으로 사용해보십시오!

또는 재미있는 연산자와 PHP 5.6 이상이 없는 38>>= :

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

또는 리틀 엔디안 ( "0 4 0 16 0 64 0") 출력의 36 :

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

실제로 나는 단지 >>=연산자 를 사용하고 싶었 으므로 39를 고수하고 있습니다.

테스트 :

$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 바이트

더 짧은 멋진 솔루션을 찾을 수 없으므로 표준 루프가 있습니다. MickyT 및 KirillL 덕분에 -4 바이트

DECLARE @y int=255

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

사용해보십시오


비트 및 (&)를 사용하면 다음과 같이 몇 가지를 저장할 수 있습니다 ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. 이것은 R 답변에 대한 @KirillL에 의해 암시됩니다
MickyT

매력처럼 작동하는 @MickyT. 감사합니다
t-clausen.dk


3

C # (Visual C # 대화식 컴파일러), 33 바이트

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

@Arnauld 의 JavaScript (ES6) 응답 포트이므로 그를 찬성 해야합니다.

온라인으로 사용해보십시오.

설명:

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`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.