Pareti binarie indebolite


21

Ispirato da Crea un muro binario

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

0010
0110
1001
0100

Possiamo immaginarlo come un muro:

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

Tuttavia, questo è un muro molto debole, ed è crollato! Ciascuno 1( #) cade finché non colpisce il "terreno" o un altro 1( #). Le 0s .sono presenti nei punti lasciati dalle mosse 1.

Questo diventa il seguente:

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

Il che si traduce in:

0000
0000
0110
1111

Che, come un elenco di numeri, è [0, 0, 6, 15].

Un altro caso di test

[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 scappatoie standard.

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



1
Altre prove? Sai, le prove non quadrate sarebbero buone.
Leaky Nun,

@LeakyNun Certo. Lo farò.
HyperNeutrino,

Questo è solo un problema di ordinamento per array di bit.
Marcus Müller,

@ MarcusMüller Hai ragione - mi sono reso conto che dopo la risposta MATL: P
HyperNeutrino,

Risposte:


29

MATL , 4 byte

BSXB

Provalo su MATL Online

Spiegazione

    % 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

o_O Come funziona: o
HyperNeutrino,

1
MATL ha appena superato il campo da golf di 4 byte ? o_O
totalmente umano il

5 byte ora :-p
Leaky Nun,

Non avrei mai pensato che ci fosse un built-in per spostare quelli in basso xD +1
HyperNeutrino

1
@totallyhuman bene, aspetta che arrivi Dennis
JungHwan Min


5

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 AND delle due righe e la seconda riga diventa OR delle due righe. Questo deve solo essere ripetuto abbastanza volte perché tutti i bit cadano verso il basso.



2

Japt , 16 byte

m¤z3 ®¬n qÃz mn2

Provalo online! usando il -Qflag 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

Io penso che è possibile salvare un byte conmì2 z3 mn z mì2
ETHproductions

@ETHproductions Sembra ruotare l'array 2D, invece di ruotare l'array di stringhe, riempie ogni array interno nullinvece di spazi. Quindi non sembra funzionare. Ed nullè ordinato a destra della 1s, a differenza degli spazi, che sono ordinati a sinistra.
Justin Mariner,

2

Mathematica, 64 byte

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

 è \[Transpose]

Questo converte l'input (un elenco di numeri) in un elenco di elenchi di cifre, lo inserisce in una matrice quadrata, lo traspone, ordina le righe in modo che la "caduta" dell'1 in basso, trasponi indietro, quindi converta nuovamente in numeri .



2

Ottava, 29 25 byte

4 byte salvati grazie a @Stewie

@(x)bi2de(sort(de2bi(x)))

de2bi/bi2desalva 4 byte in ottava. Funziona su octave-online.net.
Stewie Griffin,

@StewieGriffin Grazie!
Suever,

1

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

C'è ancora quel riempimento binario sinistro, +1. Inoltre, puoi spiegare perché dovresti usare l'inverso del recepimento, dal momento che è solo trasposizione?
Zacharý,

@ Zacharý Le inversioni vengono utilizzate per annullare le operazioni utilizzate prima di ordinare ogni riga. È vero che l'inverso della trasposizione è solo trasporre, ma un altro modo di vederlo è come <convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M, dove le prime due funzioni sono solo le inversioni delle ultime due.
miglia


1

Dyalog APL, 24 21 19 byte

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

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

Come?

  • input valutato (le matrici sono separate da 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
  • trasforma di nuovo il vettore dei vettori in un array 2D
  • 2⊥ converti da binario (dal momento che lo traspone, arriviamo al risultato corretto)

1

Dyalog APL (23 caratteri)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  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 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.


È possibile sostituire con (⊥⍣¯1)⍵con ⊥⍣¯1⊢⍵. Inoltre, non penso che sia necessaria la specifica dell'asse su split ( ↓[1]=> ).
Zacharý,

Oh, e dovresti riconvertirlo in un elenco!
Zacharý,

Questo non è valido
Zacharý,

Grazie, Zacharý, stavo lavorando a questa sera tardi e penso di aver letto male il problema. Ho modificato la mia soluzione ora.
James Heslip,

1
Bene, ottimo lavoro! (ha ⊥⍣¯1davvero bisogno di essere integrato). E grazie per aver effettivamente corretto il mio nome utente.
Zacharý,

0

JavaScript, 127 125 byte

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

Provalo online

-2 byte grazie al ciarlatano Cows


(1<<c)&epuò diventare2**c&e
Kritixi Lithos il

0

Python 2, 142 byte

... e ancora giocando a golf ... speriamo –– Ogni 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]))))]

Un grosso pezzo di questo è per riempire i numeri con zero.

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 un array di rappresentazioni di stringhe binarie, lo riempie, lo ruota di 90º in senso orario, ordina ogni riga, lo ruota indietro di 90º e quindi crea numeri interi da ogni riga.


142 byte , hai delle parentesi ridondanti.
Mr. Xcoder,

@ Mr.Xcoder, oh sì, era sciocco
Daniel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.