2の累乗の合計


31

チャレンジ

整数の入力を指定xすると1 <= x <= 255、を合計したときに与える2のべき乗の結果を返しますx

入力が与えられた場合:

86

プログラムは以下を出力するはずです。

64 16 4 2

入力:

240

出力:

128 64 32 16

入力:

1

出力:

1

入力:

64

出力:

64

特定の2のべき乗が合計に存在しない場合、出力にはゼロが含まれる場合があります。

たとえば、入力65はを出力する場合があります0 64 0 0 0 0 0 1

得点

これはであるため、各言語で最も短い回答が優先されます。


5
リストは最高から最低にソートする必要がありますか?
アダム

2
冗長なゼロを出力できますか?
ジョナサンアラン

4
RE:「最高から最低にソート」チャレンジの一部ではない制限を追加し、既存の回答のほとんどを無効にするのはなぜですか?(また、リトルエンディアンはどうですか?)+セットには順序がないため、Pythonの回答が無効になります。
ジョナサンアラン

5
@JonathanAllan制限を削除しました。次回別の質問を投稿するときに、このことを念頭に置いておくことにします。:)
SpookyGengar

6
2の累乗は1回しか使用できないと述べたいと思うかもしれません。そうでなければ誰かでし入力3の出力「1 1 1」
ブラックフクロウカイ

回答:


38

JavaScript(ES6)、28バイト

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

オンラインでお試しください!


9
あなたは私にJavaScriptの答えを賛成させることができる全世界で唯一の人です!
セルジョール

4
@sergiol、なぜあなたは通常JSソリューションに賛成しないのですか?使用する言語や投稿者に関係なく、優れたソリューションは優れたソリューションです。
シャギー

@Shaggy ArnauldがそのようなJavascriptソリューションを実行する唯一の人のようだからです。彼の答えは純粋な天才です!
セルジョール

3
@sergiolお世辞に感謝しますが、そうではありません。私は定期的にもっと賢い答えに打ち負かされています-それがこのサイトのすべてです。^^
アーナウド

@Oliverよく分からない。先行ゼロ(128以前)は禁止されているようです。それ以外の場合、別の可能なバリアントはf=n=>n&&f(n&~-n)+[,n&-n]です。
アーナウルド



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]

正しく動作することを「証明」します。整数の標準表現Xベース2にリストされ{x1,x2,x3,,xn}、ここで、xi{0,1},i1,n¯、よう:

X=i=1nxi2ni
指標i、このようなxi=0我々はそれだけで、このようなものを見つけることに興味を持っているので、明らかに何の貢献をしていないxi=1nからiを引くのは便利ではないため(2の累乗はすべて n iの形式の指数を持ちます。ここで、 iはaのインデックスです)nnii1)、このリストで真実のインデックスを見つける代わりに、それを逆にして、で「後方」に見つけますUT。正しいインデックスが見つかったので、2べき乗するだけです。


1
「ASCIIのみ」そこ
にこっそり

1
@EriktheOutgolferでもうまくいくと思うBUT2*H
Xcoder氏

1
これは302231454903657293676544.の入力で動作することはかなり印象
マイケル・カラス



8

スレッジハンマー0.2、3バイト

⡔⡸⢣

に解凍し{intLiteral[2],call[NumberExpand,2]}ます。

Sledgehammerは、点字をコードページとして使用するWolfram言語コードの圧縮プログラムです。上記の実際のサイズは2.75バイトですが、メタに関する現在の規則により、最も近いバイトへのパディングはコードサイズにカウントされます。


2
えっ!きちんとした小さな言語、およびすべての文字は実際に印刷可能です。
LegionMammal978

そして今、私はピーター・ガブリエル得ることができない歌を ...私の心の外に
デジタルトラウマ

8

05AB1E、3 バイト

Ýo&

@JonathanAllanのJelly answerのポートですので、必ず彼に投票してください!

ゼロを含む(末尾のゼロの-loadsを含む)。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Ý      # 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 andにosabieで使用されているのを見たことがない。良いですね。
マジックタコOct

@MagicOctopusUrn私は確かにあまり頻繁に使用しません。私が使っ&た他の答えすら見つけることができません。xDビットワイズXORを数回使用しました。ここここ、ビットワイズNOTを一度使用しました。私はJavaでビットワイズAND、XOR、OR、NOT、SHIFTなどをかなり頻繁に使用しますが、05AB1Eではあまり使用しません。:)
ケビン・クルーッセン



7

R27 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
ビット単位のandを使用した23バイト
キリルL.

@KirillL .:素晴らしい!
digEmAll

7

C#(Visual C#Interactive Compiler)、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)

オンラインでお試しください!


しかし、ゼロを取り除く必要があります。n=>new int[8].Select((j,i)=>1<<i&n).Where(i=>i!=0)Where
たとえば、

@polfosolThe output may contain zeros
ジョーキング

2
@JoKingそれでも、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#Interactive Compiler)、38バイト

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

オンラインでお試しください!



1
失敗した入力に対して124816、など(x>yでなければならないx>=y代わりに)。
ケビンクルーッセン

1
@ASCIIOnly-私はあなたに言っています、範囲演算子は甘いものになるでしょう:)
ダナ

ASCIIのみの平均しばらく@、あなたはフラグを使用することができる/u:System.Linq.Enumerableとしてみてください、これを 31バイトのために
無知の実施の形態

@EmbodimentofIgnorance確かに。しかし、私は言語を「C#/u:System.Linq.Enumerable」としてリストに載せたくない:P
ASCIIのみ





5

C(clang)133 110 63 58バイト

@ceilingcatによる58バイトのソリューション

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

オンラインでお試しください!


In C89, you can declare like main(){} and the return type defaults to int. Same for variables at global scope. Also, at least on normal implementations like clang, printf and scanf work without prototypes. You get warnings of course, but it's still valid C89 (maybe) or at least K&R C for them to be implicitly declared. The types of the C objects you pass as args defines how they're passed, so a char* and int* will Just Work without truncating pointers to 32-bit on x86-64 or anything. (Default argument promotions happen, same as for variadic functions which they are anyway.)
Peter Cordes

Or is this aiming to be valid C11 with no undefined behaviour? If so, proudly proclaim it. :) And BTW, writing a function that takes an output array as an arg would probably be smaller. Anyway, see Tips for golfing in C
Peter Cordes

You can use bitwise & to check if a bit is set. Like y&(1<<x)&&printf("%d ",1<<x);. Or to not skip zeros, just printf("%d ", y&(1<<x)). Or instead of counting bit positions, use x=256 and x>>=1 to shift the mask. main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);} 63 bytes Try it online! clang will even compile that with -std=c11
Peter Cordes


4

MATL, 5 bytes

BPfqW

Try it online!

Explanation

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

Perl 6の16 12 bytes

ジョナサンアランのおかげで-4バイト

*+&2**all ^8

オンラインでお試しください!

8つの要素を持つAll Junctionを返します。これはかなり非標準的な戻り方法ですが、通常、Junctionは順序付けられたリストとして機能し(少なくとも自動スレッドが実装されるまで)、リストから値を抽出できます。

説明:

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

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

代替案

Oliver0は、-mfフラグを使用して出力のs を回避することを提案しました。

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
Nice one. You can do N&2pU with -mf to avoid the 0s
Oliver




4

K (oK), 19 16 bytes

-3 bytes thanks to ngn!

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

Try it online!

oK does not have power operator, that's why I need a helper function {*/x#2} (copy 2 x times and reduce the resulting list by multiplication)


you can omit the { x}
ngn

@ngn Thanks! I tried it and it worked, but I wasn't sure it is acceptible.
Galen Ivanov

4

Alchemist, 125 bytes

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

Try it online! or Test every input!

Explanation

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

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

Try it online!

Or 38 with no fun >>= operator and PHP 5.6+:

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

Or 36 with little-endian ("0 2 4 0 16 0 64 0") output:

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

Really I just wanted to use the >>= operator, so I'm sticking with the 39.

Tests:

$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 bytes

Can't find a shorter fancy solution, so here is a standard loop. -4 bytes thanks to MickyT and KirillL

DECLARE @y int=255

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

Try it out


using the bitwise and (&) you can save a few with the following ,@ int=128s:print @y&@ set @/=2IF @>0GOTO s. This is hinted by @KirillL for the R answer
MickyT

@MickyT that worked like a charm. Thanks a lot
t-clausen.dk


3

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

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

Port of @Arnauld's JavaScript (ES6) answer, so make sure to upvote him!

Try it online.

Explanation:

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.