Dinding Biner Terlemah

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

Terinspirasi oleh Buat dinding biner

Dengan daftar bilangan bulat positif, kita dapat menulis semuanya di atas satu sama lain seperti halnya, untuk [2, 6, 9, 4] sebagai contoh:

0010
0110
1001
0100 

Kita bisa membayangkan ini sebagai dinding:

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

Namun, ini adalah dinding yang sangat lemah, dan telah runtuh! Setiap 1 ( # ) jatuh sampai menyentuh "tanah" atau 1 lainnya ( # ). 0 s ( . S) ada di titik yang ditinggalkan oleh pindah 1 s.

Ini menjadi berikut:

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

Yang diterjemahkan kembali ke:

0000
0000
0110
1111 

Yang, sebagai daftar angka, adalah [0, 0, 6, 15] .

Kasus uji lain

[10, 17, 19, 23] 

Ini menjadi:

01010
10001
10011
10111 

yang menjadi:

00000
10011
10011
11111 

menerjemahkan kembali ke:

[0, 19, 19, 31] 

Tantangan

Diberikan daftar bilangan bulat positif, terapkan transformasi ini ke daftar. Input / Output sebagai daftar bilangan bulat positif dalam format yang wajar. Celah standar berlaku.

Ini adalah , jadi jawaban terpendek dalam byte menang!

5 Comments
1 Leaky Nun 07/29/2017
Lebih banyak testcase? Anda tahu, testcases non-persegi akan baik.
HyperNeutrino 07/29/2017
@LeakyNun Tentu. Saya akan melakukannya.
Marcus Müller 07/30/2017
Itu hanya masalah pemilahan untuk array bit.
HyperNeutrino 07/30/2017
@ MarcusMüller Anda benar - saya menyadari bahwa setelah jawaban MATL: P

14 Answers


Suever 07/29/2017.

MATL , 4 byte

BSXB 

Cobalah di 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 07/29/2017
o_O Bagaimana cara kerjanya: o
1 totallyhuman 07/29/2017
Apakah MATL hanya keluar-golf Jelly dengan 4 bytes ? o_O
Leaky Nun 07/29/2017
5 byte sekarang :-p
HyperNeutrino 07/29/2017
Saya tidak pernah berpikir akan ada built-in untuk memindahkan yang ke bawah xD +1
1 JungHwan Min 07/29/2017
@totallyhuman baik, tunggu sampai Dennis datang

Anders Kaseorg 07/29/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])] 

Coba online!


Neil 07/29/2017.

JavaScript (ES6), 50 byte

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

Penjelasan: Misalkan dua baris dinding seperti ini:

0011
0101 

Hasilnya harus seperti ini:

0001
0111 

Dengan kata lain, baris pertama menjadi AND dari dua baris dan baris kedua menjadi OR dari dua baris. Ini hanya perlu diulang berkali-kali untuk semua bit jatuh ke bawah.


Leaky Nun 07/29/2017.

Jelly , 9 byte

BUz0Ṣ€ZUḄ 

Coba online!


Justin Mariner 07/29/2017.

Japt , 16 byte

m¤z3 ®¬n qÃz mn2 

Coba online! menggunakan tanda -Q untuk memformat hasil array.

Penjelasan

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 07/30/2017
Saya think Anda dapat menyimpan byte dengan mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHProductions Tampaknya berputar array 2D, bukannya memutar array string, bantalan setiap array dalam dengan null bukan spasi. Jadi sepertinya itu tidak berhasil. Dan null diurutkan di sebelah kanan 1 s, tidak seperti spasi, yang disortir ke kiri.

DanTheMan 07/30/2017.

Mathematica, 64 byte

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

 adalah \[Transpose]

Ini mengubah input (daftar angka) ke daftar daftar digit, bantalan itu menjadi matriks persegi, transposes, menyortir baris sehingga 1 "jatuh" ke bawah, transpos kembali, kemudian mengkonversi kembali menjadi angka-angka .


xnor 07/30/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) 

Coba online!

Mengambil input seperti f(2, 6, 9, 4) . Asumsikan input tidak kosong. Menggunakan banyak tuple unpacking .


Suever 07/30/2017.

Oktaf, 29 25 byte

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de menghemat 4 byte dalam oktaf. Bekerja pada oktafonline.net.
Suever 07/30/2017
@StewieGriffin Terima kasih!

miles 07/29/2017.

J , 13 byte

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

Coba online!

Penjelasan

/:~"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ý 07/30/2017
Ada lagi padding kiri biner, +1. Dan juga, bisakah Anda menjelaskan mengapa Anda perlu menggunakan kebalikan dari transpose, karena itu hanya transpose?
miles 08/01/2017
@ Zacharý Inversi digunakan untuk membatalkan operasi yang digunakan sebelum menyortir setiap baris. Memang benar bahwa kebalikan dari transpose hanya transpose, tetapi cara lain untuk melihat ini adalah seperti M , di mana dua fungsi pertama hanya invers dari dua yang terakhir.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 byte

bí0ζR€{øC 

Coba online!

Agak algoritma yang berbeda dari Magic.

3 comments
Magic Octopus Urn 07/31/2017
ζ , sial. Saya dihapus, ambil +1 saya.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Mengapa Anda menghapus milik Anda? Tidak perlu untuk.
Magic Octopus Urn 07/31/2017
Ini tidak terlalu berbeda (dalam hal algoritma) dan ini 25% lebih baik.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 byte

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

Coba online! (dimodifikasi jadi TryAPL menerimanya sebagai valid)

Bagaimana?

  • input yang dievaluasi (array terpisah spasi)
  • 2⊥⍣¯1⊢ mengkonversi masing-masing argumen ke biner (dialihkan dari apa yang ada dalam pertanyaan)
  • mengubah array 2D menjadi vektor vektor
  • {⍵[⍋⍵]}¨ mengurutkan masing-masing elemen dari vektor
  • mengubah vektor vektor menjadi susunan 2D lagi
  • 2⊥ mengkonversi dari biner (karena itu semacam transposes, kami tiba pada hasil yang benar)

James Heslip 07/30/2017.

Dyalog APL (23 karakter)

NO 
  1. Konversi argumen input ke dalam matriks biner
  2. Pisahkan matriks ke dalam kolom
  3. Urutkan kolom ke dalam urutan menaik
  4. Konversi baris yang diurutkan kembali menjadi desimal

Contoh

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

Terima kasih kepada Zacharý untuk mengoreksi saya yang satu ini.

5 comments
Zacharý 07/30/2017
Anda dapat mengganti dengan (⊥⍣¯1)⍵ dengan ⊥⍣¯1⊢⍵ . Juga, saya tidak berpikir Anda perlu spesifikasi sumbu pada split ( ↓[1] => ).
Zacharý 07/30/2017
Oh, dan Anda seharusnya mengubahnya kembali menjadi daftar!
Zacharý 07/30/2017
Ini tidak valid.
James Heslip 07/30/2017
Terima kasih, Zachary, saya sedang mengerjakan ini tadi malam dan saya pikir saya salah membaca masalahnya. Saya telah memodifikasi solusi saya sekarang.
1 Zacharý 07/30/2017
Yah, kerja bagus! ( ⊥⍣¯1 benar-benar perlu dibangun). Dan terima kasih telah benar-benar mendapatkan nama pengguna saya benar.

ThePirateBay 07/29/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() 

Coba online

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1< bisa menjadi 2**c&e

Dopapp 07/30/2017.

Python 2, 142 byte

... dan masih bermain golf ... semoga –– Setiap bantuan dihargai!

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

Sebagian besar dari ini adalah untuk melapisi angka dengan nol.

Lebih mudah dibaca:

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

Ini menciptakan larik representasi string biner, menindihnya, memutarnya 90º searah jarum jam, menyortir setiap baris, memutar kembali 90º, dan kemudian membuat bilangan bulat dari setiap baris.

2 comments
Mr. Xcoder 07/30/2017
142 byte , Anda memiliki beberapa tanda kurung yang redundan.
Dopapp 07/30/2017
@ Mr.Xcoder, oh ya itu konyol

Related questions

Hot questions

Language

Popular Tags