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

HyperNeutrino 18/08/2017. 14 answers, 1.278 views
code-golf number binary binary-matrix

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 thứ khác như vậy, cho [2, 6, 9, 4] làm ví dụ:

0010
0110
1001
0100 

Chúng ta có thể tưởng tượng điều này như 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 vào "mặt đất" hoặc 1 ( # ) khác. 0 s ( . S) hiện diện ở các điểm còn lại bằng cách di chuyển 1 s.

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

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

Mà dịch trở lại:

0000
0000
0110
1111 

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

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

[10, 17, 19, 23] 

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

01010
10001
10011
10111 

trở thành:

00000
10011
10011
11111 

dịch trở 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 chuyể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. Các sơ hở chuẩn áp dụng.

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

5 Comments
1 Leaky Nun 29/07/2017
Thêm testcases? Bạn biết đấy, testcase không vuông sẽ là tốt.
HyperNeutrino 29/07/2017
@LeakyNun Chắc chắn rồi. Tôi sẽ làm việc đó.
Marcus Müller 30/07/2017
Đó chỉ là một vấn đề phân loại cho mảng bit.
HyperNeutrino 30/07/2017
@ MarcusMüller Bạn nói đúng - tôi nhận ra rằng sau câu trả lời MATL: P

14 Answers


Suever 29/07/2017.

MATL , 4 byte

BSXB 

Hãy thử nó tại MATL Online

Explanation

% 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 
5 comments
HyperNeutrino 29/07/2017
o_O Làm thế nào để làm việc này: o
1 totallyhuman 29/07/2017
MATL có phải ngoài chơi gôn với 4 bytes không? o_O
Leaky Nun 29/07/2017
5 byte bây giờ :-p
HyperNeutrino 29/07/2017
Tôi không bao giờ nghĩ rằng có một built-in để di chuyển những người đến phía dưới xD +1
1 JungHwan Min 29/07/2017
@totallyhuman tốt, chờ cho đến khi Dennis đến

Anders Kaseorg 29/07/2017.

Python , 68 byte

 f=lambda a:a and[x|y&a[0]for x,y in zip([0]+f(a[1:]),f(a[1:])+[-1])] 

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


Neil 29/07/2017.

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 của bức 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 đi lặp lại đủ thời gian cho tất cả các bit rơi xuống đáy.


Leaky Nun 29/07/2017.

Jelly , 9 byte

BUz0Ṣ€ZUḄ 

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


Justin Mariner 29/07/2017.

Japt , 16 byte

m¤z3 ®¬n qÃz mn2 

Hãy dùng thử trực tuyến! sử dụng cờ -Q để đị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 
2 comments
ETHproductions 30/07/2017
Tôi think bạn có thể lưu một byte với mì2 z3 mn z mì2
Justin Mariner 30/07/2017
@ETHproductions Có vẻ như xoay mảng 2D, thay vì xoay mảng dây, hãy đệm từng mảng bên trong bằng null thay vì dấu cách. Vì vậy, điều đó dường như không hoạt động. Và null được sắp xếp bên phải của 1 s, không giống như dấu cách, được sắp xếp bên trái.

DanTheMan 30/07/2017.

Mathematica, 64 byte

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

 là \[Transpose]

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


xnor 30/07/2017.

Python 3,5 , 60 byte

 def f(a,*t):
 if t:b,*r=f(*t);t=f(a|b,*r);a&=b
 return(a,*t) 

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

Đưa đầu vào như f(2, 6, 9, 4) . Giả định đầu vào không trống. Sử dụng rất nhiều giải nén tuple .


Suever 30/07/2017.

Octave, 29 25 byte

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 30/07/2017
de2bi/bi2de tiết kiệm 4 byte trong quãng tám. Hoạt động trên octave-online.net.
Suever 30/07/2017
@StewieGriffin Cảm ơn!

miles 29/07/2017.

J , 13 byte

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

Hãy dùng 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 
2 comments
Zacharý 30/07/2017
Còn lại một lần nữa, +1. Và ngoài ra, bạn có thể giải thích lý do tại sao bạn sẽ cần phải sử dụng nghịch đảo của transpose, vì nó chỉ là transpose?
miles 01/08/2017
@ 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 transpose chỉ là transpose, nhưng cách khác để thấy điều này là M , trong đó hai hàm đầu tiên chỉ là inverses của hai người cuối cùng.

Erik the Outgolfer 30/07/2017.

05AB1E , 9 byte

bí0ζR€{øC 

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

Kinda thuật toán khác nhau từ Magic's.

3 comments
Magic Octopus Urn 31/07/2017
ζ , chết tiệt. Đã xóa của tôi, hãy +1 của tôi.
Erik the Outgolfer 31/07/2017
@MagicOctopusUrn Tại sao bạn xóa của bạn? Không cần.
Magic Octopus Urn 31/07/2017
Nó không thực sự khác nhiều (về thuật toán) và điều này tốt hơn 25%.

Zacharý 30/07/2017.

Dyalog APL, 24 21 19 byte

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

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

Làm sao?

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

James Heslip 30/07/2017.

Dyalog APL (23 ký tự)

NO 
  1. Chuyển đổi các đối số đầu vào thành ma trận nhị phân
  2. Chia ma trận thành cột
  3. Sắp xếp các cột thành 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 cho tôi cái này.

5 comments
Zacharý 30/07/2017
Bạn có thể thay bằng (⊥⍣¯1)⍵ bằng ⊥⍣¯1⊢⍵ . Ngoài ra, tôi không nghĩ rằng bạn cần đặc tả trục trên phân chia ( ↓[1] => ).
Zacharý 30/07/2017
Ồ, và bạn phải chuyển nó trở lại danh sách!
Zacharý 30/07/2017
Điều này không hợp lệ.
James Heslip 30/07/2017
Cảm ơn bạn, Zacharý, tôi đã làm việc vào cuối đêm qua và tôi nghĩ rằng tôi đã hiểu sai vấn đề. Tôi đã sửa đổi giải pháp của tôi ngay bây giờ.
1 Zacharý 30/07/2017
Vâng, công việc tốt! ( ⊥⍣¯1 thực sự cần phải là một nội trang). Và cảm ơn bạn đã thực sự nhận được tên người dùng của tôi đúng.

ThePirateBay 29/07/2017.

JavaScript, 127 125 byte

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

Dùng thử trực tuyến

-2 bytes thanks to Cows quack

1 comments
Cows quack 29/07/2017
(1< có thể trở thành 2**c&e

Dopapp 30/07/2017.

Python 2, 142 byte

... và vẫn chơi golf ... hy vọng - Bất kỳ sự giúp đỡ nào đượ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 con số với 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ủa 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 mỗi hàng, xoay nó trở lại 90º, và sau đó tạo ra các số nguyên trong mỗi hàng.

2 comments
Mr. Xcoder 30/07/2017
142 byte , bạn có một số dấu ngoặc đơn dư thừa.
Dopapp 30/07/2017
@ Mr.Xcoder, oh yes đó là ngớ ngẩn

Related questions

Hot questions

Language

Popular Tags