อ่อนแอกำแพงไบนารี


21

แรงบันดาลใจจากสร้างกำแพงไบนารี

รับรายการของจำนวนเต็มบวกเราสามารถเขียนพวกมันออกมาเหมือน[2, 6, 9, 4]กันตัวอย่างเช่น:

0010
0110
1001
0100

เราสามารถจินตนาการสิ่งนี้ว่าเป็นกำแพง:

..#.
.##.
#..#
.#..

อย่างไรก็ตามนี่เป็นกำแพงที่อ่อนแอมากและมันทรุดลง! แต่ละ1( #) ต่ำลงจนฮิตว่า "ดิน" หรืออีก1( #) 0s ( .s) ที่มีอยู่ในจุดซ้ายโดยย้าย1s

สิ่งนี้จะกลายเป็นสิ่งต่อไปนี้:

....
....
.##.
####

ซึ่งแปลกลับเป็น:

0000
0000
0110
1111

[0, 0, 6, 15]ซึ่งเป็นรายการของตัวเลขเป็น

อีกกรณีทดสอบ

[10, 17, 19, 23]

สิ่งนี้กลายเป็น:

01010
10001
10011
10111

ซึ่งกลายเป็น:

00000
10011
10011
11111

แปลกลับไปที่:

[0, 19, 19, 31]

ท้าทาย

รับรายการของจำนวนเต็มบวกใช้การแปลงนี้กับรายการ อินพุต / เอาต์พุตเป็นรายการของจำนวนเต็มบวกในรูปแบบที่เหมาะสม ช่องโหว่มาตรฐานใช้

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!



1
ทดสอบเพิ่มเติมหรือไม่ คุณรู้ไหมว่าการทดสอบที่ไม่เป็นสแควร์จะดี
Leun Nun

@LeakyNun Sure ฉันจะทำอย่างนั้น.
HyperNeutrino

นั่นเป็นเพียงปัญหาการเรียงลำดับสำหรับบิตอาร์เรย์
Marcus Müller

@ MarcusMüllerคุณพูดถูก - ฉันรู้ว่าหลังจากคำตอบของ
MATL

คำตอบ:


29

MATL , 4 ไบต์

BSXB

ลองใช้ที่MATL Online

คำอธิบาย

    % Implicitly grab input as an array 
    %   STACK: [10, 17, 19, 23]
B   % Convert each element to binary where each decimal number results in a row
    %   STACK: [0 1 0 1 0;
    %           1 0 0 0 1;
    %           1 0 0 1 1;
    %           1 0 1 1 1]
S   % Sort each column, placing all of the 1's at the bottom of each column
    %   STACK: [0 0 0 0 0;
    %           1 0 0 1 1;
    %           1 0 0 1 1;
    %           1 1 1 1 1] 
XB  % Convert each row from its binary representation to its decimal number
    %   STACK: [0, 19, 19, 31]
    % Implicitly display the result

o_O ทำงานอย่างไร: o
HyperNeutrino

1
MATL เพิ่งออกจากสนามกอล์ฟโดย4 ไบต์หรือไม่? o_O
มนุษย์โดยรวม

5 ไบต์ตอนนี้ :-p
แม่ชี Leaky

ฉันไม่เคยคิดเลยว่าจะมีบิวท์อินติดตั้งเพื่อย้ายอันไปด้านล่าง xD +1
HyperNeutrino

1
@ ทรัลลีมนุษย์ดีรอจนกว่า Dennis จะมาถึง
JungHwan Min


5

JavaScript (ES6), 50 ไบต์

f=a=>a.map(_=>a.map((e,i)=>a[a[i]|=a[--i],i]&=e))&&a

คำอธิบาย: สมมติว่ากำแพงสองแถวเป็นเช่นนี้:

0011
0101

ผลลัพธ์ต้องเป็นดังนี้:

0001
0111

กล่าวอีกนัยหนึ่งแถวแรกจะกลายเป็น AND ของสองแถวและแถวที่สองกลายเป็น OR ของสองแถว สิ่งนี้จะต้องทำซ้ำครั้งพอสำหรับบิตทั้งหมดจะลดลงไปด้านล่าง



2

Japt , 16 ไบต์

m¤z3 ®¬n qÃz mn2

ลองออนไลน์! ใช้-Qแฟล็กเพื่อจัดรูปแบบผลลัพธ์อาร์เรย์

คำอธิบาย

m¤z3 ®¬n qÃz mn2    Implicit: U = input array.
                        [10, 17, 19, 23]
m¤z3                Map U to binary strings and rotate the array left 90°
                         1010       0111
                        10001   ->  1011
                        10011       0001
                        10111       1000
                                     111
®¬n qà              Sort each binary string, putting 0s and spaces at the start
                        0111
                        0111
                        0001
                        0001
                         111
z mn2               Rotate right 90° and convert each back to a number
                         0000       0
                        10011   ->  19
                        10011       19
                        11111       31
                    Implicit output of resulting array

ฉันคิดว่าคุณสามารถบันทึกไบต์ด้วยmì2 z3 mn z mì2
ETHproductions

@ETHproductions ดูเหมือนว่าการหมุนอาร์เรย์ 2 มิติแทนที่จะหมุนอาร์เรย์ของสตริงวางแผ่นภายในแต่ละอาร์เรย์ด้วยnullแทนที่จะเว้นวรรค ดังนั้นดูเหมือนจะไม่ทำงาน และnullจัดเรียงทางด้านขวาของ1s ซึ่งแตกต่างจากช่องว่างซึ่งจัดเรียงไปทางซ้าย
Justin Mariner

2

Mathematica, 64 ไบต์

#~FromDigits~2&/@(Sort/@(PadLeft[#~IntegerDigits~2&/@#]))&

คือ \[Transpose]

สิ่งนี้จะแปลงอินพุต (รายการตัวเลข) ไปยังรายการของตัวเลข, เสริมให้เป็นเมทริกซ์จตุรัส, แปลงสัญญาณ, เรียงลำดับแถวเพื่อให้ "ตกลง" ที่ด้านล่าง, แปลงกลับจากนั้นแปลงกลับเป็นตัวเลข .



2

อ็อกเทฟ29 29ไบต์

บันทึกได้ 4 ไบต์ด้วย @Stewie

@(x)bi2de(sort(de2bi(x)))

de2bi/bi2deบันทึก 4 ไบต์ในระดับแปดเสียง ทำงานบน octave-online.net
Stewie Griffin

@ StewieGriffin ขอบคุณ!
Suever

1

J , 13 ไบต์

/:~"1&.|:&.#:

ลองออนไลน์!

คำอธิบาย

/:~"1&.|:&.#:  Input: array M
           #:  Convert each in M to binary with left-padding
       |:&     Transpose
/:~"1&         Sort each row
     &.|:      Inverse of transpose (which is just transpose)
         &.#:  Inverse of converting to binary

มีการเว้นระยะห่างแบบไบนารีที่ +1 อีกครั้ง และคุณสามารถอธิบายได้หรือไม่ว่าทำไมคุณถึงต้องใช้ค่าอินเวอร์สของทรานสโพสเพราะมันเป็นแค่ทรานสโพส
Zacharý

@ Zacharýผู้รุกรานใช้เพื่อเลิกทำการดำเนินการที่ใช้ก่อนที่จะเรียงลำดับแต่ละแถว มันเป็นความจริงที่อินเวอร์สของทรานสเป็นเพียงทรานสโพสต์ แต่วิธีอื่นในการดูนี่ก็คือ<convert from binary> <transpose> <sort each row> <transpose> <convert to binary> Mโดยที่ทั้งสองฟังก์ชั่นแรกเป็นเพียงผกผันของสองอันสุดท้าย
ไมล์

1

05AB1E , 9 ไบต์

bí0ζR€{øC

ลองออนไลน์!

ขั้นตอนวิธีที่แตกต่างจาก Kinda ของวิเศษ


ζ, Damnit ลบฉันแล้วลอง +1 ของฉัน
Magic Octopus Urn

@MagicOctopusUrn ทำไมคุณถึงลบคุณออก? ไม่ต้องการ.
Erik the Outgolfer

มันไม่ได้แตกต่างกันมากนัก (ในแง่ของอัลกอริทึม) และนี่ดีกว่า 25%
Magic Octopus Urn

1

Dyalog APL, 24 21 19 ไบต์

2⊥↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⎕

ลองออนไลน์! (แก้ไขเพื่อให้ TryAPL ยอมรับว่าถูกต้อง)

อย่างไร?

  • อินพุตที่ประเมินค่า (อาร์เรย์คั่นด้วยช่องว่าง)
  • 2⊥⍣¯1⊢ แปลงแต่ละข้อโต้แย้งให้เป็นเลขฐานสอง (เปลี่ยนจากสิ่งที่อยู่ในคำถาม)
  • เปลี่ยนอาร์เรย์ 2D เป็นเวกเตอร์ของเวกเตอร์
  • {⍵[⍋⍵]}¨ จำแนกองค์ประกอบของเวกเตอร์แต่ละรายการ
  • เปลี่ยนเวกเตอร์ของเวกเตอร์เป็นอาร์เรย์ 2 มิติอีกครั้ง
  • 2⊥ แปลงจากไบนารี่ (เนื่องจากเป็นการเรียงสลับของมันเราจึงไปถึงผลลัพธ์ที่ถูกต้อง)

1

Dyalog APL (23 ตัวอักษร)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. แปลงอาร์กิวเมนต์ที่ป้อนเข้าเป็นเมทริกซ์ไบนารี
  2. แยกเมทริกซ์ออกเป็นคอลัมน์
  3. เรียงลำดับคอลัมน์ตามลำดับจากน้อยไปหามาก
  4. แปลงแถวที่เรียงกลับเป็นทศนิยม

ตัวอย่าง

  {2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}10 17 19 23
      0 19 19 31

ขอบคุณZacharýสำหรับการแก้ไขฉันในอันนี้


คุณสามารถแทนที่ด้วยกับ(⊥⍣¯1)⍵ ⊥⍣¯1⊢⍵นอกจากนี้ฉันไม่คิดว่าคุณต้องการข้อมูลจำเพาะของแกนแยก ( ↓[1]=> )
Zacharý

โอ้และคุณควรแปลงมันกลับเป็นรายการ!
Zacharý

สิ่งนี้ไม่ถูกต้อง
Zacharý

ขอบคุณZacharýฉันทำงานนี้เมื่อคืนที่ผ่านมาและฉันคิดว่าฉันผิดปัญหา ฉันได้แก้ไขโซลูชันของฉันตอนนี้
James Heslip

1
ดีมาก! ( ⊥⍣¯1จริงๆต้องเป็นตัวภายใน) และขอบคุณที่ทำให้ชื่อผู้ใช้ของฉันถูกต้อง
Zacharý


0

Python 2, 142 ไบต์

... และยังคงเล่นกอล์ฟ ... หวังว่า - ความช่วยเหลือใด ๆ ที่ชื่นชม!

def c(l):b=[bin(n)[2:]for n in l];print[int(n,2)for n in map(''.join,zip(*map(sorted,zip(*['0'*(len(max(b,key=len))-len(x))+x for x in b]))))]

อันยิ่งใหญ่ของสิ่งนี้คือการเติมตัวเลขด้วยเลขศูนย์

อ่านเพิ่มเติมได้:

def collapse(nums):
    bins = [bin(n)[2:] for n in nums]
    bins = [('0'*(len(max(bins, key = len)) - len(x))) + x for x in bins]
    print [int(n, 2) for n in map(''.join, zip(*map(sorted, zip(*bins))))]

สิ่งนี้จะสร้างอาร์เรย์ของการเป็นตัวแทนสตริงไบนารีรองมันหมุนมันตามเข็มนาฬิกา90ºเรียงลำดับแต่ละแถวหมุนกลับ90ºแล้วสร้างจำนวนเต็มออกจากแต่ละแถว


142 ไบต์คุณมีวงเล็บที่ซ้ำซ้อน
นาย Xcoder

@ Mr.Xcoder โอ้ใช่นั่นมันงี่เง่า
Daniel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.