Svækkede binære vægge

HyperNeutrino 09/10/2017. 14 answers, 1.278 views
code-golf number binary binary-matrix

Inspireret af Opret en binær væg

Givet en liste over positive heltal, kan vi skrive dem ud over hinanden som sådan, for [2, 6, 9, 4] som et eksempel:

0010
0110
1001
0100 

Vi kan forestille os dette som en mur:

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

Men det er en meget svag mur, og det er kollapset! Hver 1 ( # ) falder ned, indtil den rammer "jorden" eller en anden 1 ( # ). 0 s ( . S) er til stede i pletter, der er flyttet af 1 s.

Dette bliver følgende:

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

Hvilket oversætter tilbage til:

0000
0000
0110
1111 

Hvilket som en liste over tal er [0, 0, 6, 15] .

En anden test sag

[10, 17, 19, 23] 

Dette bliver:

01010
10001
10011
10111 

som bliver:

00000
10011
10011
11111 

oversætte tilbage til:

[0, 19, 19, 31] 

Udfordring

Giv en liste over positive heltal, anvend denne transformation til listen. Input / Output som lister over positive heltal i ethvert rimeligt format. Standard smuthuller gælder.

Dette er en , så det korteste svar i bytes vinder!

5 Comments
1 Leaky Nun 07/29/2017
Flere testkasser? Du ved, ikke-kvadratiske testcases ville være gode.
HyperNeutrino 07/29/2017
@LeakyNun Sikker. Det gør jeg.
Marcus Müller 07/30/2017
Det er bare et sorteringsproblem for bitarrayer.
HyperNeutrino 07/30/2017
@ MarcusMüller Du har ret - jeg indså, at efter MATL svaret: P

14 Answers


Suever 07/29/2017.

MATL , 4 bytes

BSXB 

Prøv 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 Hvordan virker dette: o
1 totallyhuman 07/29/2017
Gjorde MATL bare golf-gelé med 4 bytes ? o_O
Leaky Nun 07/29/2017
5 bytes nu :-p
HyperNeutrino 07/29/2017
Jeg troede aldrig, at der ville være en indbygget til at flytte dem til bunden xD +1
1 JungHwan Min 07/29/2017
@totallyhuman godt, vent indtil Dennis kommer

Anders Kaseorg 07/29/2017.

Python , 68 bytes

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

Prøv det online!


Neil 07/29/2017.

JavaScript (ES6), 50 bytes

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

Forklaring: Antag to rækker af væggen var sådan:

0011
0101 

Resultatet skal være:

0001
0111 

Med andre ord bliver den første række AND af de to rækker, og den anden række bliver OR af de to rækker. Dette skal bare gentages nok gange for alle bitene at falde til bunden.


Leaky Nun 07/29/2017.

Gelé , 9 byte

BUz0Ṣ€ZUḄ 

Prøv det online!


Justin Mariner 07/29/2017.

Japt , 16 bytes

m¤z3 ®¬n qÃz mn2 

Prøv det online! ved hjælp af -Q flag for at formatere array resultatet.

Forklaring

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
Jeg think du kan gemme en byte med mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHproductions Det ser ud til at rotere 2D-arrayet, i stedet for at rotere arrayet af strenge, paster hver indre matrix med null stedet for mellemrum. Så det ser ikke ud til at fungere. Og null er sorteret til højre for 1 s, i modsætning til mellemrum, som er sorteret til venstre.

DanTheMan 07/30/2017.

Mathematica, 64 bytes

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

 er \[Transpose]

Dette konverterer indtastningen (en liste over tal) til en liste med cifre, paster den til en firkantet matrix, transponerer den, sorterer rækkerne, så 1'ens "falder" til bunden, transponerer tilbage og konverterer derefter tilbage til tal .


xnor 07/30/2017.

Python 3,5 , 60 bytes

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

Prøv det online!

Tager input som f(2, 6, 9, 4) . Antag, at input er tomt. Bruger en masse tuple udpakning .


Suever 07/30/2017.

Octave, 29 25 bytes

4 bytes saved thanks to @Stewie

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

miles 07/29/2017.

J , 13 bytes

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

Prøv det online!

Forklaring

/:~"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
Der er den binære venstre-padding igen, +1. Og kan du også forklare, hvorfor du skulle bruge den omvendte transponering, da den bare transponeres?
miles 08/01/2017
@ Zacharý De inverser bruges til at fortryde de anvendte operationer før sortering af hver række. Det er rigtigt, at den omvendte transponering bare transponeres, men en anden måde at se dette på er som M , hvor de to første funktioner er bare inverses af de sidste to.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 bytes

bí0ζR€{øC 

Prøv det online!

Kun anden algoritme fra Magic's.

3 comments
Magic Octopus Urn 07/31/2017
ζ , damnit. Slettet min, tag min +1.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Hvorfor har du slettet din? Ingen grund til.
Magic Octopus Urn 07/31/2017
Det er ikke rigtig meget anderledes (hvad angår algoritmen) og det var 25% bedre.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 bytes

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

Prøv det online! (ændret, så TryAPL accepterer det som gyldigt)

Hvordan?

  • evalueret input (arrays er )
  • 2⊥⍣¯1⊢ konverterer hver af argumenterne til binære (transponeret af hvad der er i spørgsmålet)
  • skifter et 2D array i en vektor af vektorer
  • {⍵[⍋⍵]}¨ sorterer hver af vektorens elementer
  • ændrer vektoren af ​​vektorer til et 2D array igen
  • 2⊥ konvertere fra binære (da det slags transponerer det, kommer vi til det korrekte resultat)

James Heslip 07/30/2017.

Dyalog APL (23 tegn)

NO 
  1. Konverter input argumenterne til en binær matrix
  2. Opdel matrixen i kolonner
  3. Sorter kolonnerne i stigende rækkefølge
  4. Konverter de sorterede rækker tilbage til decimaltal

Eksempel

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

Tak til Zacharý for at rette mig på denne.

5 comments
Zacharý 07/30/2017
Du kan erstatte med (⊥⍣¯1)⍵ med ⊥⍣¯1⊢⍵ . Jeg tror heller ikke, at du har brug for aksespecifikationen på split ( ↓[1] => ).
Zacharý 07/30/2017
Åh, og du skal konvertere den tilbage til en liste!
Zacharý 07/30/2017
Dette er ugyldigt.
James Heslip 07/30/2017
Tak, Zacharý, jeg arbejdede på dette sent i aftes, og jeg tror, ​​at jeg fejlede problemet. Jeg har ændret min løsning nu.
1 Zacharý 07/30/2017
Godt, godt arbejde! ( ⊥⍣¯1 virkelig være en indbygget). Og tak for at du faktisk får mit brugernavn rigtigt.

ThePirateBay 07/29/2017.

JavaScript, 127 125 bytes

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

Prøv det online

-2 bytes thanks to Cows quack

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

Dopapp 07/30/2017.

Python 2, 142 bytes

... og stadig golf ... forhåbentlig - enhver hjælp værdsat!

 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 del af dette er til polstring af tallene med nuller.

Mere læselig:

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

Dette skaber en række af binære strengrepræsentationer, pads den, roterer den 90º med uret, sorterer hver række, roterer den tilbage 90º, og opretter derefter heltal ud af hver række.

2 comments
Mr. Xcoder 07/30/2017
142 bytes , du har nogle overflødige parenteser.
Dopapp 07/30/2017
@ Mr.Xcoder, åh ja det var dumt

Related questions

Hot questions

Language

Popular Tags