Pareti binarie indebolite

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

Ispirato da Crea un muro binario

Dato un elenco di interi positivi, possiamo scriverli tutti uno sopra l'altro in questo modo, per [2, 6, 9, 4] come esempio:

0010
0110
1001
0100 

Possiamo immaginarlo come un muro:

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

Tuttavia, questo è un muro molto debole, ed è crollato! Ogni 1 ( # ) cade verso il basso fino a quando non colpisce il "terreno" o un altro 1 ( # ). Gli 0 s (s) sono presenti negli spot lasciati spostati di 1 s.

Questo diventa il seguente:

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

Che si traduce in:

0000
0000
0110
1111 

Quale, come una lista di numeri, è [0, 0, 6, 15] .

Un altro test case

[10, 17, 19, 23] 

Questo diventa:

01010
10001
10011
10111 

che diventa:

00000
10011
10011
11111 

traduzione di nuovo a:

[0, 19, 19, 31] 

Sfida

Dato un elenco di numeri interi positivi, applica questa trasformazione all'elenco. Input / Output come elenchi di numeri interi positivi in ​​qualsiasi formato ragionevole. Si applicano le scappatoie standard.

Questo è un , quindi vince la risposta più breve in byte!

5 Comments
1 Leaky Nun 07/29/2017
Altri test? Sai, le prove non quadrate sarebbero buone.
HyperNeutrino 07/29/2017
@ LeakyNun Certo. Lo farò.
Marcus Müller 07/30/2017
Questo è solo un problema di ordinamento per i bit array.
HyperNeutrino 07/30/2017
@ MarcusMüller Hai ragione - ho capito che dopo la risposta MATL: P

14 Answers


Suever 07/29/2017.

MATL , 4 byte

BSXB 

Provalo su 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 Come funziona: o
1 totallyhuman 07/29/2017
MATL è appena uscito da golf Jelly da 4 bytes ? o_O
Leaky Nun 07/29/2017
5 byte ora :-p
HyperNeutrino 07/29/2017
Non avrei mai pensato che ci fosse un built-in per spostare quelli in fondo xD +1
1 JungHwan Min 07/29/2017
@ Totalmente umano, aspetta che arrivi Dennis

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

Provalo 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 

Spiegazione: Supponiamo che due file del muro fossero così:

0011
0101 

Il risultato deve essere questo:

0001
0111 

In altre parole, la prima riga diventa l'AND delle due righe e la seconda riga diventa l'OR delle due righe. Questo deve solo essere ripetuto abbastanza volte affinché tutti i bit cadano sul fondo.


Leaky Nun 07/29/2017.

Jelly , 9 byte

BUz0Ṣ€ZUḄ 

Provalo online!


Justin Mariner 07/29/2017.

Japt , 16 byte

m¤z3 ®¬n qÃz mn2 

Provalo online! usando il flag -Q per formattare il risultato dell'array.

Spiegazione

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
think che puoi salvare un byte con mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHproductions Sembra che ruoti l'array 2D, invece di ruotare l'array di stringhe, per riempire ogni array interno con null invece di spazi. Quindi non sembra funzionare. E null è ordinato alla destra dei 1 s, a differenza degli spazi, che sono ordinati a sinistra.

DanTheMan 07/30/2017.

Mathematica, 64 byte

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

 è \[Transpose]

Converte l'input (una lista di numeri) in una lista di liste di cifre, le riempie di una matrice quadrata, la traspone, ordina le righe in modo che le "1" si abbassino verso il basso, si trasformino di nuovo in numeri .


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) 

Provalo online!

Accetta input come f(2, 6, 9, 4) . Presume che l'input non è vuoto. Usa un sacco di disimpegno tuple .


Suever 07/30/2017.

Octave, 29 25 byte

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de salva 4 byte in ottava. Funziona su octave-online.net.
Suever 07/30/2017
@StewieGriffin Grazie!

miles 07/29/2017.

J , 13 byte

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

Provalo online!

Spiegazione

/:~"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
C'è di nuovo quel binario sinistro, +1. E inoltre, puoi spiegare perché dovresti usare l'inverso della trasposizione, poiché è solo una trasposizione?
miles 08/01/2017
@ Zacharý Le inverse vengono utilizzate per annullare le operazioni utilizzate prima di ordinare ogni riga. È vero che l'inverso della trasposizione è solo trasposizione, ma un altro modo per vedere questo è come M , dove le prime due funzioni sono solo il inversioni degli ultimi due.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 byte

bí0ζR€{øC 

Provalo online!

Un algoritmo diverso da quello di Magic.

3 comments
Magic Octopus Urn 07/31/2017
dam, dannazione. Cancellato il mio, prendi il mio +1.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Perché hai eliminato il tuo? Non c'è bisogno.
Magic Octopus Urn 07/31/2017
Non è molto diverso (in termini di algoritmo) e questo era migliore del 25%.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 byte

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

Provalo online! (modificato in modo che TryAPL lo accetti come valido)

Come?

  • input valutato (gli array sono separati spazio)
  • 2⊥⍣¯1⊢ converte ciascuno degli argomenti in binario (trasposto di ciò che è nella domanda)
  • trasforma un array 2D in un vettore di vettori
  • {⍵[⍋⍵]}¨ ordina ciascuno degli elementi del vettore
  • gira di nuovo il vettore di vettori in un array 2D
  • 2⊥ converti da binario (dal momento che lo traspone in qualche modo, arriviamo al risultato corretto)

James Heslip 07/30/2017.

Dyalog APL (23 caratteri)

NO 
  1. Converti gli argomenti di input in una matrice binaria
  2. Dividi la matrice in colonne
  3. Ordina le colonne in ordine crescente
  4. Converti nuovamente le righe ordinate in decimali

Esempio

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

Grazie a Zacharý per avermi corretto su questo.

5 comments
Zacharý 07/30/2017
Puoi sostituire con (⊥⍣¯1)⍵ con ⊥⍣¯1⊢⍵ . Inoltre, non penso che tu abbia bisogno della specifica dell'asse su split ( ↓[1] => ).
Zacharý 07/30/2017
Oh, e dovresti convertirlo in una lista!
Zacharý 07/30/2017
Questo non è valido
James Heslip 07/30/2017
Grazie, Zacharý, stavo lavorando a questa scorsa notte e penso di aver letto male il problema. Ho modificato la mia soluzione ora.
1 Zacharý 07/30/2017
Bene, buon lavoro! ( ⊥⍣¯1 davvero bisogno di essere un built-in). E grazie per aver effettivamente ottenuto il mio nome utente giusto.

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

Provalo online

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1< può diventare 2**c&e

Dopapp 07/30/2017.

Python 2, 142 byte

... e ancora golfing ... si spera - Qualsiasi aiuto apprezzato!

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

Una grande fetta di questo è per riempire i numeri con zeri.

Più leggibile:

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

Questo crea una matrice delle rappresentazioni di stringa binaria, le riempie, la ruota di 90º in senso orario, ordina ogni riga, la ruota di 90º, e quindi crea numeri interi da ogni riga.

2 comments
Mr. Xcoder 07/30/2017
142 byte , hai una parentesi ridondante.
Dopapp 07/30/2017
@ Mr.Xcoder, oh sì, era stupido

Related questions

Hot questions

Language

Popular Tags