Försvagade binära väggar

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

Inspirerad av Skapa en binär vägg

Med en lista över positiva heltal kan vi skriva dem ut över varandra som så, för [2, 6, 9, 4] som ett exempel:

0010
0110
1001
0100 

Vi kan föreställa oss detta som en vägg:

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

Men det här är en mycket svag vägg, och den har kollapsat! Varje 1 ( # ) faller ner tills den träffar "marken" eller en annan 1 ( # ). 0 s (s) finns i fläckar kvar av flyttad 1 s.

Detta blir följande:

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

Som översätts tillbaka till:

0000
0000
0110
1111 

Vilket som en lista med siffror är [0, 0, 6, 15] .

Ett annat testfall

[10, 17, 19, 23] 

Detta blir:

01010
10001
10011
10111 

som blir:

00000
10011
10011
11111 

översätta tillbaka till:

[0, 19, 19, 31] 

Utmaning

Med tanke på en lista med positiva heltal, tillämpa denna transformation på listan. Input / Output som listor med positiva heltal i alla rimliga format. Standard smutthål gäller.

Detta är en , så det kortaste svaret i byte vinner!

5 Comments
1 Leaky Nun 07/29/2017
Fler testkassar? Du vet att icke-kvadratiska provkroppar skulle vara bra.
HyperNeutrino 07/29/2017
@LeakyNun Sure. Det ska jag göra.
Marcus Müller 07/30/2017
Det är bara ett sorteringsproblem för bitraderingar.
HyperNeutrino 07/30/2017
@ MarcusMüller Du har rätt - jag insåg att efter MATL-svaret: P

14 Answers


Suever 07/29/2017.

MATL , 4 byte

BSXB 

Prova det på 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 Hur fungerar det här: o
1 totallyhuman 07/29/2017
Fick MATL bara golfgelé med 4 bytes ? o_O
Leaky Nun 07/29/2017
5 byte nu :-p
HyperNeutrino 07/29/2017
Jag trodde aldrig att det skulle vara en inbyggd för att flytta dem till botten xD +1
1 JungHwan Min 07/29/2017
@totallyhuman bra, vänta tills Dennis kommer

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

Prova det 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 

Förklaring: Antag att två rader av väggen var så här:

0011
0101 

Resultatet måste vara så här:

0001
0111 

Med andra ord blir den första raden AND av de två raderna och den andra raden blir OR av de två raderna. Detta behöver bara upprepas tillräckligt många gånger för att alla bitar ska falla till botten.


Leaky Nun 07/29/2017.

Gelé , 9 byte

BUz0Ṣ€ZUḄ 

Prova det online!


Justin Mariner 07/29/2017.

Japt , 16 bytes

m¤z3 ®¬n qÃz mn2 

Prova det online! med -Q flaggan för att formatera matrisresultatet.

Förklaring

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
Jag think du kan spara en byte med mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHproductions Det verkar som att rotera 2D-arrayen, istället för att rotera arrayen av strängar, lägger varje inre matris med null istället för mellanslag. Så det verkar inte fungera. Och null sorteras till höger om 1 s, till skillnad från mellanslag, som sorteras till vänster.

DanTheMan 07/30/2017.

Mathematica, 64 byte

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

 är \[Transpose]

Detta omvandlar inmatningen (en lista med siffror) till en lista med listor med siffror, paderar den för att vara en kvadratisk matris, överför den, sorterar raderna så att 1-talet "faller" till botten, transponerar tillbaka och omvandlar sedan tillbaka till siffror .


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) 

Prova det online!

Tar inmatning som f(2, 6, 9, 4) . Antag att ingången är tomt. Använder mycket tupelpackning .


Suever 07/30/2017.

Oktav, 29 25 byte

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de sparar 4 byte i oktav. Fungerar på octave-online.net.
Suever 07/30/2017
@StewieGriffin Tack!

miles 07/29/2017.

J , 13 byte

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

Prova det online!

Förklaring

/:~"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
Det finns den binära vänstra kudden igen, +1. Och kan du också förklara varför du skulle behöva använda omvänt omvandling, eftersom det bara transponeras?
miles 08/01/2017
@ Zacharý Inverserna används för att ångra de funktioner som används innan sortering av varje rad. Det är sant att omvandlingen av transponering bara transponeras, men ett annat sätt att se detta är som M , där de två första funktionerna bara är de inverser från de två sista.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 byte

bí0ζR€{øC 

Prova det online!

Annan algoritm från Magic.

3 comments
Magic Octopus Urn 07/31/2017
ζ , damnit. Raderad min, ta min +1.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Varför tog du bort din? Behövs inte.
Magic Octopus Urn 07/31/2017
Det är inte riktigt annorlunda (i form av algoritm) och det var 25% bättre.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 byte

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

Prova det online! (modifierat så TryAPL accepterar det som giltigt)

Hur?

  • utvärderad ingång (arrays är mellanseparerade)
  • 2⊥⍣¯1⊢ konverterar var och en av argumenten till binär (införlivad med vad som står i frågan)
  • förvandlar en 2D-grupp till en vektor av vektorer
  • {⍵[⍋⍵]}¨ sorterar varje element i vektorn
  • vrider vektorn av vektorer i en 2D-array igen
  • 2⊥ konvertera från binär (eftersom det sorts omvandlar det, kommer vi fram till rätt resultat)

James Heslip 07/30/2017.

Dyalog APL (23 tecken)

NO 
  1. Konvertera inmatningsargumenten till en binär matris
  2. Dela matrisen i kolumner
  3. Sortera kolumnerna i stigande ordning
  4. Konvertera de sorterade raderna tillbaka till decimal

Exempel

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

Tack till Zacharý för att korrigera mig på den här.

5 comments
Zacharý 07/30/2017
Du kan ersätta med (⊥⍣¯1)⍵ med ⊥⍣¯1⊢⍵ . Dessutom tror jag inte att du behöver axelspecifikationen på split ( ↓[1] => ).
Zacharý 07/30/2017
Åh, och du ska konvertera den till en lista!
Zacharý 07/30/2017
Detta är ogiltigt.
James Heslip 07/30/2017
Tack, Zacharý, jag arbetade på det här igår kväll och jag tror att jag har felat problemet. Jag har ändrat min lösning nu.
1 Zacharý 07/30/2017
Tja, bra jobb! ( ⊥⍣¯1 behöver verkligen vara inbyggd). Och tack för att du faktiskt får mitt användarnamn rätt.

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

Prova det online

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1< kan bli 2**c&e

Dopapp 07/30/2017.

Python 2, 142 byte

... och fortfarande golf ... förhoppningsvis - någon hjälp uppskattad!

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

En stor bit av detta är att fylla numren med nollor.

Mer läsbar:

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

Detta skapar en uppsättning binära strängrepresentationer, puter den, roterar den 90º medurs, sorterar varje rad, roterar den 90º, och skapar sedan heltal ur varje rad.

2 comments
Mr. Xcoder 07/30/2017
142 byte , du har lite redundant parentes.
Dopapp 07/30/2017
@ Mr.Xcoder, åh ja det var dumt

Related questions

Hot questions

Language

Popular Tags