ผลรวมของพลังของ 2


31

ความท้าทาย

ได้รับการป้อนข้อมูลจำนวนเต็มxที่กลับผลของผู้มีอำนาจของทั้งสองว่าเมื่อสรุปให้1 <= x <= 255x

ตัวอย่าง

รับอินพุต:

86

โปรแกรมของคุณควรส่งออก:

64 16 4 2

การป้อนข้อมูล:

240

เอาท์พุท:

128 64 32 16

การป้อนข้อมูล:

1

เอาท์พุท:

1

การป้อนข้อมูล:

64

เอาท์พุท:

64

เอาท์พุทอาจมีค่าศูนย์ถ้ากำลังสองที่ไม่ได้อยู่ในผลรวม

ยกตัวอย่างเช่นการป้อนข้อมูลการส่งออกเดือนพฤษภาคม650 64 0 0 0 0 0 1

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะเป็นผู้ชนะ


5
รายการต้องเรียงลำดับจากมากไปน้อยหรือไม่
อดัม

2
เราสามารถส่งออกศูนย์ที่ซ้ำซ้อนได้ไหม
Jonathan Allan

4
RE: "เรียงลำดับสูงสุดไปต่ำสุด" ทำไมเพิ่มข้อ จำกัด ที่ไม่ได้เป็นส่วนหนึ่งของความท้าทายและทำให้คำตอบที่มีอยู่ส่วนใหญ่ไม่ถูกต้อง (เช่นเดียวกับเด็กเล็ก ๆ ?!) + มันทำให้คำตอบ Python ของฉันเป็นโมฆะเนื่องจากชุดไม่มีคำสั่งใด ๆ
Jonathan Allan

5
@JonathanAllan ฉันได้ลบข้อ จำกัด แล้ว ฉันจะจำไว้ในครั้งต่อไปที่ฉันโพสต์คำถามอื่น - ฉันยังค่อนข้างใหม่กับเรื่องนี้ :)
SpookyGengar

6
ฉันคิดว่าคุณอาจต้องการระบุว่าพลังของสองอย่างใด ๆ สามารถใช้ได้เพียงครั้งเดียว ไม่เช่นนั้นจะมีใครบางคนสามารถเอาท์พุท "1 1 1" สำหรับอินพุท 3 ได้
Black Owl Kai

คำตอบ:


38

JavaScript (ES6), 28 ไบต์

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

ลองออนไลน์!


9
คุณเป็นคนเดียวในโลกที่สามารถให้คำตอบ JavaScript ให้กับฉันได้!
sergiol

4
@sergiol ทำไมคุณไม่ปกติโหวตโซลูชัน JS? ทางออกที่ดีคือทางออกที่ดีโดยไม่คำนึงถึงภาษาที่ใช้หรือผู้โพสต์ไว้
Shaggy

@Shaggy เพราะ Arnauld ดูเหมือนจะเป็นคนเดียวที่ทำโซลูชัน Javascript ได้ คำตอบของเขาคืออัจฉริยะบริสุทธิ์!
sergiol

3
@ sergiol ขอบคุณสำหรับคำชม แต่นั่นไม่จริงเลย ฉันมักจะตอบโต้ด้วยคำตอบที่ฉลาดกว่านี้อย่างสม่ำเสมอ - และนั่นคือสิ่งที่เว็บไซต์นี้เกี่ยวข้อง ^^
Arnauld

@Oliver ฉันไม่แน่ใจ ดูเหมือนว่าห้ามนำหน้าศูนย์ (ก่อนหน้า 128) f=n=>n&&f(n&~-n)+[,n&-n]มิฉะนั้นอีกตัวแปรที่เป็นไปได้คือ
Arnauld


12

เยลลี่ขนาด 4 ไบต์

-2 เนื่องจากเราอาจเอาท์พุทเลขศูนย์แทนพลังที่ไม่ได้ใช้ของ 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 คือรายการ , โดยที่เช่นนั้น: ดัชนีที่นั้นเห็นได้ชัดว่าไม่มีส่วนร่วมดังนั้นเราจึงสนใจ หาเหล่านั้นว่า 1 เนื่องจากการลบจากไม่สะดวก (พลังของสองทั้งหมดมีเลขชี้กำลังของฟอร์มโดยที่คือดัชนีใด ๆ ของX{x1,x2,x3,,xn}xi{0,1},i1,n¯

X=i=1nxi2ni
ixi=0xi=1innii1) แทนการหาดัชนี truthy ในรายการนี้เรากลับมันแล้วพบพวกเขา "ย้อนกลับ" กับ ตอนนี้เราได้พบดัชนีที่ถูกต้องทั้งหมดที่เราต้องทำคือเพิ่มให้กับพลังเหล่านั้น2UT2


1
"ASCII-only" ส่อเสียดที่นั่น ...
Erik the Outgolfer

1
@EriktheOutgolfer ฉันคิดว่าBUT2*Hคงใช้ได้
นาย Xcoder

1
น่าประทับใจมากที่ใช้กับอินพุต 302231454903657293676544
Michael Karas


8

APL (Dyalog Extended) , 7 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ ต้องใช้การจัดทำดัชนี 0 ( ⎕IO←0)

2*⍸⍢⌽⍤⊤

ลองออนไลน์!

2 สอง
* ยกกำลังของɩ ndices ที่แท้จริง ในขณะที่ ตรงกันข้าม ของ แทน binary





8

Sledgehammer 0.2, 3 ไบต์

⡔⡸⢣

{intLiteral[2],call[NumberExpand,2]}คลายลงไป

Sledgehammer เป็นคอมเพรสเซอร์สำหรับรหัสภาษา Wolfram โดยใช้อักษรเบรลล์เป็นหน้ารหัส ขนาดจริงของด้านบนคือ 2.75 ไบต์ แต่เนื่องจากกฎปัจจุบันเกี่ยวกับเมตาการขยายไปยังไบต์ที่ใกล้ที่สุดจะถูกนับเป็นขนาดรหัส


2
ฮะ ภาษาเล็ก ๆ เรียบร้อยและตัวละครทั้งหมดสามารถพิมพ์ได้จริง
LegionMammal978

และตอนนี้ฉันไม่สามารถเอาเพลงของปีเตอร์กาเบรียลออกมาจากใจของฉัน ...
Digital Trauma

8

05AB1E , 3 ไบต์

Ýo&

พอร์ตของ@JonathanAllanคำตอบของ Jellyให้แน่ใจว่าได้ upvote เขา!

มีศูนย์ (รวมถึง - โหลดของ - ต่อท้ายศูนย์)

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Ý      # 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ใช้ในโอซาบิ ทำได้ดีนี่.
Magic Octopus Urn

@ MagicOctopusUrn แน่นอนฉันก็ไม่ได้ใช้บ่อยนัก ไม่สามารถแม้แต่จะหาคำตอบอื่น ๆ ที่ผมเคยใช้&ใน. xD ฉันได้ใช้ Bitwise-XOR สองสามครั้งเช่นที่นี่หรือที่นี่และ Bitwise-ไม่ได้ครั้งเดียวที่นี่ (ซึ่งผมมารู้ทีหลังลบออกอีกครั้งหลังจากที่เล่นกอล์ฟต่อไป .. ) ฉันใช้ Bitwise-AND, XOR, OR, NOT, SHIFT และอื่น ๆ ค่อนข้างบ่อยใน Java แต่ใน 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)
  • 4 ไบต์ต้องขอบคุณ @Kirill L.

1
23 ไบต์ที่มีค่าบิตและ
คิริลล์แอล

@ KirillL .: ยอดเยี่ยม!
digEmAll

7

C # (Visual C # Interactive คอมไพเลอร์) , 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นี้คือ btw ที่สั้นลงห้าไบต์
polfosol ఠ_ఠ

@polfosolThe output may contain zeros
Jo King

2
@JoKing Still n=>new int[8].Select((j,i)=>1<<i&n)มีความยาว 35 ไบต์และเราไม่ต้องการแฟล็กและการเข้ารหัสข้อความเพิ่มเติม
polfosol ఠ_ఠ

1
การใช้ ascii อักขระ 0-7 ควรสั้นกว่าเช่นn=>"INSERT ASCII HERE".Select(a=>1<<a&n)แต่ฉันอยู่บนอุปกรณ์พกพาที่ไม่สามารถแสดงหรือพิมพ์ unprintables ได้ดังนั้นฉันจะต้องรอจนกว่าฉันจะถึงบ้านเพื่ออัปเดตคำตอบ
ศูนย์รวมความรู้

6

C # (Visual C # Interactive คอมไพเลอร์) , 38 ไบต์

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

ลองออนไลน์!



1
ล้มเหลวสำหรับปัจจัยการผลิต1, 2, 4, 8, 16ฯลฯ (คนx>yควรจะx>=yแทน)
Kevin Cruijssen

1
@ ASCIIOnly - ฉันบอกคุณแล้วโอเปอเรเตอร์กำลังจะหวาน :)
dana

@ ASCII-only Mean ขณะที่คุณสามารถใช้การตั้งค่าสถานะ/u:System.Linq.Enumerableและลองสิ่งนี้เป็นเวลา 31 ไบต์
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance แน่นอน แต่ฉันไม่ต้องการแสดงรายการภาษาเป็น "C # /u:System.Linq.Enumerable": P
ASCII- เท่านั้น





5

C (เสียงดังกราว) , 133 110 63 58 ไบต์

58 ไบต์วิธีการแก้ปัญหาต้องขอบคุณ @ceilingcat

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

ลองออนไลน์!


ใน C89 คุณสามารถประกาศ like main(){}และค่าเริ่มต้นของประเภท return เป็น int เช่นเดียวกับตัวแปรที่ขอบเขตทั่วโลก นอกจากนี้อย่างน้อยในการใช้งานปกติเช่นเสียงดังกราว, printf และ scanf ทำงานโดยไม่ต้องต้นแบบ คุณได้รับคำเตือนแน่นอน แต่ก็ยังคงใช้ได้ C89 (อาจจะ) หรืออย่างน้อย K&R C เพื่อให้พวกเขาได้รับการประกาศโดยปริยาย ประเภทของวัตถุ C ที่คุณผ่านเป็น args จะกำหนดวิธีการส่งผ่านดังนั้น a char*และint*จะทำงานได้โดยไม่ต้องตัดทอนพอยน์เตอร์เป็น 32 บิตใน x86-64 หรืออะไรก็ได้ (การโปรโมตอาร์กิวเมนต์เริ่มต้นเกิดขึ้นเช่นเดียวกับฟังก์ชั่น Variadic ที่เป็นอยู่)
Peter Cordes

หรือสิ่งนี้มีวัตถุประสงค์เพื่อเป็น C11 ที่ถูกต้องโดยไม่มีพฤติกรรมที่ไม่ได้กำหนดหรือไม่? ถ้าเป็นเช่นนั้นประกาศอย่างภาคภูมิใจ :) และ BTW การเขียนฟังก์ชั่นที่ใช้อาเรย์เอาท์พุทเป็นหาเรื่องอาจจะเล็กกว่า อย่างไรก็ตามดูเคล็ดลับสำหรับการเล่นกอล์ฟใน C
Peter Cordes

คุณสามารถใช้ค่าบิต&เพื่อตรวจสอบว่ามีการตั้งค่าบิต กดy&(1<<x)&&printf("%d ",1<<x);ไลค์ printf("%d ", y&(1<<x))หรือจะไม่ข้ามศูนย์เพียง หรือแทนที่จะนับตำแหน่งบิตให้ใช้x=256และx>>=1เพื่อเลื่อนมาสก์ main(y){int x=256;for(scanf("%d",&y);x>>=1;)printf("%d ",y&x);}63 ไบต์ ลองออนไลน์! เสียงดังกราวจะรวบรวมแม้แต่กับ-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

Perl 6 , 16 12 ไบต์

-4 ไบต์ขอบคุณ Jonathan Allan

*+&2**all ^8

ลองออนไลน์!

ส่งคืน All Junction ด้วย 8 องค์ประกอบ นี่เป็นวิธีที่ค่อนข้างไม่ได้มาตรฐานในการส่งคืน แต่โดยทั่วไป Junctions สามารถทำตามคำสั่ง (อย่างน้อยก็จนกว่าจะมีการใช้การเติมข้อความอัตโนมัติ) และสามารถดึงค่าจากหนึ่ง

คำอธิบาย:

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

ทางเลือก

แนะนำโดยOliverเพื่อหลีกเลี่ยง0s ในเอาต์พุตโดยใช้-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การหลีกเลี่ยง0s
โอลิเวอร์

4

05AB1E , 9 ไบต์

Ýoʒ›}æʒOQ

ลองออนไลน์!


สิ่งนี้ถูกต้องสำหรับ 6 ไบต์ด้วย แต่ก็ไม่เสร็จทันเวลาใน TIO สำหรับ 86:

05AB1E , 6 ไบต์

ÝoæʒOQ

ลองออนไลน์!


1
ทั้งคำตอบของคุณให้ชุดที่ว่าง15แทนแทนที่จะเป็น[1,2,4,8]
Kevin Cruijssen

1
@KevinCruijssen ต้องการ2**0จับได้ดี มากกว่าÝ L
Magic Octopus Urn

1
อาฉันรู้ถึงความรู้สึก ยังมีคำตอบของฉันLแทนในÝตอนแรก
Kevin Cruijssen



4

K (oK) , 19 16 ไบต์

-3 ไบต์ด้วย ngn!

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

ลองออนไลน์!

oK ไม่มีpowerโอเปอเรเตอร์นั่นคือสาเหตุที่ฉันต้องการฟังก์ชันตัวช่วย{*/x#2}(คัดลอก 2 xครั้งและลดรายการผลลัพธ์ด้วยการคูณ)


คุณสามารถละเว้น{ x}
NGN

@ngn ขอบคุณ! ฉันลองแล้วใช้งานได้ แต่ฉันไม่แน่ใจว่ามันจะยอมรับได้
Galen Ivanov

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

ลองออนไลน์!

หรือ38 ที่ไม่มี>>=โอเปอเรเตอร์ที่สนุกและ PHP 5.6+:

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

หรือ36 ที่มีเอาท์พุตน้อย ("0 2 4 0 16 0 64 0"):

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 ไบต์

ไม่พบโซลูชันแฟนซีที่สั้นกว่าดังนั้นนี่คือลูปมาตรฐาน -4 ไบต์ขอบคุณ MickyT และ KirillL

DECLARE @y int=255

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

ลองดู


โดยใช้ค่าที่เหมาะสมและ (&) ,@ int=128s:print @y&@ set @/=2IF @>0GOTO sคุณสามารถบันทึกไม่กี่ที่มีดังต่อไปนี้ นี่คือคำใบ้โดย @KirillL สำหรับคำตอบ R
MickyT

@MickyT ที่ใช้งานได้อย่างมีเสน่ห์ ขอบคุณมาก
t-clausen.dk


3

C # (Visual C # Interactive Compiler), 33 ไบต์

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

คำตอบของ JavaScript (ES6)ของพอร์ตของ@Arnauld ดังนั้นอย่าลืมอัปเกรดเขา!

ลองออนไลน์

คำอธิบาย:

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.