Osłabione ściany binarne

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

Zainspirowany: Utwórz binarną ścianę

Biorąc pod uwagę listę dodatnich liczb całkowitych, możemy zapisać je wszystkie powyżej siebie, tak jak dla przykładu [2, 6, 9, 4] :

0010
0110
1001
0100 

Możemy to sobie wyobrazić jako ścianę:

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

Jest to jednak bardzo słaba ściana, która się zawaliła! Każdy 1 ( # ) upada, dopóki nie trafi "ziemi" lub innego 1 ( # ). 0 s (.s) są obecne w punktach po przesunięciu o 1 s.

Staje się to następujące:

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

Co przekłada się na:

0000
0000
0110
1111 

Które, jako lista liczb, wynosi [0, 0, 6, 15] .

Kolejny przypadek testowy

[10, 17, 19, 23] 

Staje się to:

01010
10001
10011
10111 

który staje się:

00000
10011
10011
11111 

tłumaczenia z powrotem na:

[0, 19, 19, 31] 

Wyzwanie

Biorąc pod uwagę listę dodatnich liczb całkowitych, zastosuj tę transformację do listy. Wejście / wyjście jako listy dodatnich liczb całkowitych w dowolnym rozsądnym formacie. Obowiązują standardowe luki prawne.

To jest , więc najkrótsza odpowiedź w bajtach wygrywa!

5 Comments
1 Leaky Nun 07/29/2017
Więcej testcases? Wiesz, niet kwadratowe testówki byłyby dobre.
HyperNeutrino 07/29/2017
@LeakyNun Sure. Zrobię to.
Marcus Müller 07/30/2017
To tylko kwestia sortowania dla tablic bitowych.
HyperNeutrino 07/30/2017
@ MarcusMüller Masz rację - zdałem sobie sprawę, że po odpowiedzi MATL: P

14 Answers


Suever 07/29/2017.

MATL , 4 bajty

BSXB 

Wypróbuj w 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 Jak to działa: o
1 totallyhuman 07/29/2017
Czy MATL właśnie galaretki out-golfa o 4 bytes ? o_O
Leaky Nun 07/29/2017
5 bajtów teraz: -p
HyperNeutrino 07/29/2017
Nigdy nie sądziłem, że będzie wbudowane, aby przenieść te na najniższy poziom XD +1
1 JungHwan Min 07/29/2017
Totallyhuman dobrze, poczekaj, aż pojawi się Dennis

Anders Kaseorg 07/29/2017.

Python , 68 bajtów

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

Wypróbuj online!


Neil 07/29/2017.

JavaScript (ES6), 50 bajtów

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

Explanation: Załóżmy, że dwa rzędy ściany wyglądają tak:

0011
0101 

Wynik musi być taki:

0001
0111 

Innymi słowy, pierwszy rząd staje się znakiem AND dwóch wierszy, a drugi wiersz staje się OR dwóch wierszy. To wystarczy powtórzyć wystarczająco długo, aby wszystkie bity spadły na dno.


Leaky Nun 07/29/2017.

Galaretka , 9 bajtów

BUz0Ṣ€ZUḄ 

Wypróbuj online!


Justin Mariner 07/29/2017.

Japt , 16 bajtów

m¤z3 ®¬n qÃz mn2 

Wypróbuj online! użycie flagi -Q do sformatowania wyniku tablicy.

Wyjaśnienie

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
Myślę think że możesz zapisać bajt za pomocą mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHprodukcje Wygląda na to, że obraca tablicę 2D, zamiast obracać tablicę ciągów, podkłada każdą wewnętrzną tablicę null zamiast spacji. Tak więc to nie działa. I null jest posortowane na prawo od 1 s, w przeciwieństwie do spacji, które są posortowane w lewo.

DanTheMan 07/30/2017.

Mathematica, 64 bajty

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

 to \[Transpose]

Konwertuje dane wejściowe (listę numerów) na listę list cyfr, umieszcza je w kwadratowej macierzy, transponuje je, sortuje wiersze, tak aby "spadły" na dno, przenosi je z powrotem, a następnie zamienia z powrotem w liczby .


xnor 07/30/2017.

Python 3.5 , 60 bajtów

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

Wypróbuj online!

Przyjmuje wejście takie jak f(2, 6, 9, 4) . Zakłada, że ​​dane wejściowe nie są puste. Używa rozpakowywania wielu krotek .


Suever 07/30/2017.

Oktawa, 29 25 bajtów

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de zapisuje 4 bajty w oktawie. Działa na octave-online.net.
Suever 07/30/2017
@StewieGriffin Dzięki!

miles 07/29/2017.

J , 13 bajtów

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

Wypróbuj online!

Wyjaśnienie

/:~"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
Znów ten binarny lewy dopełniacz +1. A także, czy możesz wyjaśnić, dlaczego musiałbyś użyć odwrotności transpozycji, skoro jest to po prostu transpozycja?
miles 08/01/2017
@ Zacharý Inwersja służy do cofania operacji używanych przed sortowaniem każdego wiersza. To prawda, że ​​odwrotność transpozycji jest po prostu transponowana, ale innym sposobem zobaczenia tego jest M , gdzie dwie pierwsze funkcje są po prostu odwrotności ostatnich dwóch.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 bajtów

bí0ζR€{øC 

Wypróbuj online!

Zupełnie inny algorytm niż Magic.

3 comments
Magic Octopus Urn 07/31/2017
ζ , cholera. Usunięto moje, weź moje +1.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Dlaczego usunąłeś swoje? Nie trzeba.
Magic Octopus Urn 07/31/2017
Nie różni się to zbytnio (pod względem algorytmu) i było o 25% lepsze.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 bajtów

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

Wypróbuj online! (zmodyfikowany tak, że TryAPL akceptuje go jako prawidłowy)

W jaki sposób?

  • ocenione dane wejściowe (tablice są oddzielone spacjami)
  • 2⊥⍣¯1⊢ konwertuje każdy z argumentów na binarny (przeniesiony na to, co jest w pytaniu)
  • zamienia tablicę 2D na wektor wektorów
  • {⍵[⍋⍵]}¨ sortuje każdy z elementów wektora
  • zamienia wektor wektorów na tablicę 2D
  • 2⊥ konwertuj z binarnego (ponieważ to rodzaj transpozycji, osiągamy poprawny wynik)

James Heslip 07/30/2017.

Dyalog APL (23 znaków)

NO 
  1. Konwertuj argumenty wejściowe na macierz binarną
  2. Podziel matrycę na kolumny
  3. Sortuj kolumny w kolejności rosnącej
  4. Konwertuj posortowane wiersze z powrotem na liczbę dziesiętną

Przykład

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

Dziękuję Zachariemu za poprawienie mnie w tej sprawie.

5 comments
Zacharý 07/30/2017
Możesz zamienić na (⊥⍣¯1)⍵ ⊥⍣¯1⊢⍵ . Ponadto, nie sądzę, abyś potrzebował specyfikacji osi w podziale ( ↓[1] => ).
Zacharý 07/30/2017
Aha, i powinieneś zamienić go z powrotem na listę!
Zacharý 07/30/2017
To jest nieprawidłowe.
James Heslip 07/30/2017
Dziękuję, Zacharý, pracowałem nad tą późną nocą i myślę, że źle odczytałem problem. Zmodyfikowałem teraz moje rozwiązanie.
1 Zacharý 07/30/2017
Cóż, dobra robota! ( ⊥⍣¯1 naprawdę musi być wbudowany). I dziękuję ci za poprawienie mojej nazwy użytkownika.

ThePirateBay 07/29/2017.

JavaScript, 127 125 bajtów

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

Wypróbuj online

-2 bytes thanks to Cows quack

1 comments
Cows quack 07/29/2017
(1< może zostać 2**c&e

Dopapp 07/30/2017.

Python 2, 142 bajty

... i wciąż gra w golfa ... mam nadzieję - Każda pomoc doceniona!

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

Dużą częścią tego jest wypełnianie liczb zerami.

Bardziej czytelny:

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

Tworzy to tablicę binarnych reprezentacji ciągów, nakłada ją, obraca o 90 ° zgodnie z ruchem wskazówek zegara, sortuje każdy wiersz, obraca go o 90 °, a następnie tworzy liczby całkowite z każdego rzędu.

2 comments
Mr. Xcoder 07/30/2017
142 bajty , masz trochę zbędnego nawiasu.
Dopapp 07/30/2017
@ Mr.Xcoder, o tak, to było głupie

Related questions

Hot questions

Language

Popular Tags