Tường nhị phân suy yếu


21

Lấy cảm hứng từ Tạo một bức tường nhị phân

Đưa ra một danh sách các số nguyên dương, chúng ta có thể viết chúng ra trên tất cả các ví dụ như vậy, [2, 6, 9, 4]ví dụ:

0010
0110
1001
0100

Chúng ta có thể tưởng tượng đây là một bức tường:

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

Tuy nhiên, đây là một bức tường rất yếu, và nó đã sụp đổ! Mỗi 1( #) rơi xuống cho đến khi nó chạm "mặt đất" hoặc khác 1( #). Các 0( .s) có mặt trong các điểm còn lại của 1s di chuyển .

Điều này trở thành như sau:

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

Dịch trở lại:

0000
0000
0110
1111

Mà, như một danh sách các số, là [0, 0, 6, 15].

Một trường hợp thử nghiệm

[10, 17, 19, 23]

Điều này trở thành:

01010
10001
10011
10111

trở thành:

00000
10011
10011
11111

dịch lại:

[0, 19, 19, 31]

Thử thách

Đưa ra một danh sách các số nguyên dương, áp dụng phép biến đổi này vào danh sách. Đầu vào / đầu ra dưới dạng danh sách các số nguyên dương ở bất kỳ định dạng hợp lý nào. Tiêu chuẩn áp dụng.

Đây là một , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng!



1
Thêm thử nghiệm? Bạn biết đấy, testcase không vuông sẽ tốt.
Nữ tu bị rò rỉ

@LeakyNun Chắc chắn rồi. Tôi sẽ làm việc đó.
HyperNeutrino

Đó chỉ là một vấn đề sắp xếp cho mảng bit.
Marcus Müller

@ MarcusMüller Bạn nói đúng - Tôi nhận ra rằng sau câu trả lời MATL: P
HyperNeutrino

Câu trả lời:


29

MATL , 4 byte

BSXB

Dùng thử tại MATL Online

Giải trình

    % 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 Cách thức hoạt động của nó: o
HyperNeutrino

1
Có phải MATL chỉ ra ngoài Jelly Jelly 4 byte ? o_O
hoàn toàn là

5 byte ngay bây giờ :-p
Neak Leaky

Tôi chưa bao giờ nghĩ rằng sẽ có một công cụ tích hợp để di chuyển những cái đó xuống dưới cùng xD +1
HyperNeutrino

1
@totallyhuman tốt, đợi cho đến khi Dennis đến
JungHwan Min


5

JavaScript (ES6), 50 byte

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

Giải thích: Giả sử hai hàng tường giống như thế này:

0011
0101

Kết quả cần phải là:

0001
0111

Nói cách khác, hàng đầu tiên trở thành AND của hai hàng và hàng thứ hai trở thành OR của hai hàng. Điều này chỉ cần được lặp lại đủ số lần để tất cả các bit rơi xuống đáy.



2

Japt , 16 byte

m¤z3 ®¬n qÃz mn2

Hãy thử trực tuyến! sử dụng -Qcờ để định dạng kết quả mảng.

Giải trình

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

Tôi nghĩ bạn có thể lưu một byte bằngmì2 z3 mn z mì2
ETHproductions

@ETHproductions Có vẻ như xoay mảng 2D, thay vì xoay mảng chuỗi, đệm từng mảng bên trong nullthay vì khoảng trắng. Vì vậy, nó dường như không hoạt động. Và nullđược sắp xếp ở bên phải của 1s, không giống như khoảng trắng, được sắp xếp ở bên trái.
Justin Mariner

2

Toán học, 64 byte

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

\[Transpose]

Điều này chuyển đổi đầu vào (một danh sách các số) thành một danh sách các danh sách các chữ số, đệm nó thành một ma trận vuông, hoán vị nó, sắp xếp các hàng sao cho "1" rơi xuống dưới, chuyển trở lại, sau đó chuyển đổi thành số .



2

Octave, 29 25 byte

4 byte được lưu nhờ @Stewie

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

de2bi/bi2detiết kiệm 4 byte trong quãng tám. Hoạt động trên octave-online.net.
Stewie Griffin

@StewieGriffin Cảm ơn!
Suever

1

J , 13 byte

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

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

Giải trình

/:~"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

Có phần đệm trái nhị phân đó một lần nữa, +1. Ngoài ra, bạn có thể giải thích lý do tại sao bạn cần sử dụng nghịch đảo của chuyển vị, vì nó chỉ là chuyển vị?
Zacharý

@ Zacharý Các nghịch đảo được sử dụng để hoàn tác các hoạt động được sử dụng trước khi sắp xếp từng hàng. Đúng là nghịch đảo của chuyển vị chỉ là chuyển vị, nhưng một cách khác để thấy điều này là <convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M, trong đó hai hàm đầu tiên chỉ là nghịch đảo của hai hàm cuối.
dặm


1

APL Dyalog, 24 21 19 byte

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

Hãy thử trực tuyến! (đã sửa đổi để TryAPL chấp nhận nó là hợp lệ)

Làm sao?

  • đánh giá đầu vào (mảng được phân tách không gian)
  • 2⊥⍣¯1⊢ chuyển đổi từng đối số thành nhị phân (chuyển đổi những gì có trong câu hỏi)
  • biến một mảng 2D thành một vectơ
  • {⍵[⍋⍵]}¨ sắp xếp từng yếu tố của vectơ
  • biến vectơ của vectơ thành một mảng 2D một lần nữa
  • 2⊥ chuyển đổi từ nhị phân (vì nó chuyển đổi nó, chúng tôi đi đến kết quả chính xác)

1

APL Dyalog (23 ký tự)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. Chuyển đổi các đối số đầu vào thành một ma trận nhị phân
  2. Chia ma trận thành các cột
  3. Sắp xếp các cột theo thứ tự tăng dần
  4. Chuyển đổi các hàng được sắp xếp trở lại thành số thập phân

Thí dụ

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

Cảm ơn Zacharý đã sửa lỗi cho tôi về điều này.


Bạn có thể thay thế (⊥⍣¯1)⍵bằng ⊥⍣¯1⊢⍵. Ngoài ra, tôi không nghĩ rằng bạn cần thông số trục khi tách ( ↓[1]=> ).
Zacharý

Ồ, và bạn phải chuyển nó trở lại danh sách!
Zacharý

Điều này không hợp lệ.
Zacharý

Cảm ơn bạn, Zacharý, tôi đã làm việc vào tối qua và tôi nghĩ rằng tôi đã đọc sai vấn đề. Tôi đã sửa đổi giải pháp của tôi bây giờ.
James Heslip

1
Tốt, làm tốt lắm! ( ⊥⍣¯1thực sự cần phải là một dựng sẵn). Và cảm ơn bạn đã thực sự có được tên người dùng của tôi ngay.
Zacharý

0

JavaScript, 127 125 byte

a=>a[m='map'](_=>b[m]((n,i)=>n&&(b[i]--,d|=1<<i),d=0)&&d,b=[...Array(32)][m]((_,c)=>a[m](e=>d+=!!(2**c&e),d=0)&&d)).reverse()

Dùng thử trực tuyến

-2 byte nhờ quẻ bò


(1<<c)&ecó thể trở thành2**c&e
Kritixi Lithos

0

Python 2, 142 byte

... và vẫn đang chơi gôn ... hy vọng sẽ được đánh giá cao!

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

Một phần lớn của điều này là để đệm các số bằng số không.

Dễ đọc hơn:

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

Điều này tạo ra một mảng các biểu diễn chuỗi nhị phân, đệm nó, xoay nó 90 độ theo chiều kim đồng hồ, sắp xếp từng hàng, xoay nó 90 độ và sau đó tạo các số nguyên ra khỏi mỗi hàng.


142 byte , bạn có một số dấu ngoặc đơn dự phòng.
Ông Xcoder

@ Mr.Xcoder, ồ đúng là ngớ ngẩn
Daniel
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.