Zayıflamış İkili Duvar


21

İlham Verici bir duvar oluşturun

Olumlu tamsayıların bir listesi göz önüne alındığında, [2, 6, 9, 4]örneğin birbirlerinin üzerine yazabiliriz, örneğin:

0010
0110
1001
0100

Bunu bir duvar olarak hayal edebiliriz:

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

Ancak, bu çok zayıf bir duvar ve çöktü! Her 1( #) "toprağa" ya da başka bir 1( #) isabet edene kadar düşer . 0S ( .lar) hareket bıraktığı noktalar mevcut 1s.

Bu şu şekilde olur:

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

Hangi geri dönüş yapar:

0000
0000
0110
1111

Sayıların bir listesi olarak [0, 0, 6, 15].

Başka bir test durumu

[10, 17, 19, 23]

Bu olur:

01010
10001
10011
10111

Bu olur:

00000
10011
10011
11111

geri çeviri:

[0, 19, 19, 31]

Meydan okuma

Olumlu tamsayıların bir listesi göz önüne alındığında, bu dönüşümü listeye uygulayın. Herhangi bir makul formatta pozitif tamsayıların listesi olarak Giriş / Çıkış. Standart boşluklar uygulanır.

Bu bir , yani bayt cinsinden en kısa cevap kazanır!



1
Daha fazla test çantası? Bilirsin, kare olmayan testisler iyi olurdu.
Leaky Nun

@LeakyNun Tabii. Bunu yapacağım.
HyperNeutrino,

Bu sadece bit dizileri için bir sıralama problemi.
Marcus Müller

@ MarcusMüller Haklısın - MATL'nin cevabından sonra şunu fark ettim: P
HyperNeutrino

Yanıtlar:


29

MATL , 4 bayt

BSXB

MATL Online'da deneyin

açıklama

    % 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 Bu nasıl çalışır: o
HyperNeutrino

1
MATL, Jelly'i 4 byte aştı mı ? o_O
totallyhuman

5 bayt şimdi :-p
Leaky Nun

Bunları dibe taşımak için bir yerleşik olacağını hiç düşünmedim xD +1
HyperNeutrino

1
@tallyhuman iyi, Dennis gelene kadar bekleyin
JungHwan Min


5

JavaScript (ES6), 50 bayt

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

Açıklama: Duvarın iki sırasının şöyle olduğunu varsayalım:

0011
0101

Sonuç şöyle olmalı:

0001
0111

Başka bir deyişle, ilk satır iki satırın AND değeri ve ikinci satır iki satırın OR'si olur. Bu sadece tüm bitlerin dibe düşmesi için yeterince tekrarlanmalı.



2

Japt , 16 bayt

m¤z3 ®¬n qÃz mn2

Çevrimiçi deneyin! -Qdizi sonucunu biçimlendirmek için bayrağı kullanarak .

açıklama

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

Ben düşünüyorum Eğer bir byte kaydedebilirsinizmì2 z3 mn z mì2
ETHproductions

@ETHproductions Dizilerin dizisini döndürmek yerine 2B diziyi döndürmek nullyerine, boşlukları yerine her bir iç diziyi doldurur. Yani bu işe görünmüyor. Ve sola göre sıralanmış boşlukların aksine null, 1s'nin sağına göre sıralanır.
Justin Mariner

2

Mathematica, 64 bayt

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

\[Transpose]

Bu, girdiyi (sayıların bir listesini) basamakların bir listesine dönüştürür, bir kare matris olarak doldurur, satırları sıralar, 1'in "düşmesini" aşağıya çevirir, sonra tekrar sayılara dönüştürür. .



2

Octave, 29 25 bayt

@Stewie sayesinde 4 bayt kaydedildi

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

de2bi/bi2deoktavda 4 bayt kaydeder. Octave-online.net sitesinde çalışır.
Stewie Griffin,

@StewieGriffin Teşekkürler!
Suever,

1

J , 13 bayt

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

Çevrimiçi deneyin!

açıklama

/:~"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

Yine o ikili ikili doldurma, +1. Ayrıca, sadece devrik olduğu için neden devriklerin tersini kullanmanız gerektiğini açıklayabilir misiniz?
Zacharý

@ Zacharý Tersler, her satırı sıralamadan önce kullanılan işlemleri geri almak için kullanılır. Devriklerin tersinin sadece devrik olduğu doğrudur, ancak bunu görmenin bir başka yolu <convert from binary> <transpose> <sort each row> <transpose> <convert to binary> M, ilk iki fonksiyonun sadece son ikisinin tersi olduğu gibidir.
mil


1

Dyalog APL, 24 21 19 bayt

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

Çevrimiçi deneyin! (TryAPL geçerli olduğu için değiştirildi)

Nasıl?

  • değerlendirilen girdi (diziler boşlukla ayrılmıştır)
  • 2⊥⍣¯1⊢ Argümanların her birini ikiliye dönüştürür (söz konusu olanın çevrilmesi)
  • 2B diziyi vektörlerin vektörüne dönüştürür
  • {⍵[⍋⍵]}¨ vektörün öğelerinin her birini sıralar
  • vektörlerin vektörünü tekrar 2D diziye dönüştürür
  • 2⊥ binary'den dönüştürebilir (onu bir türden dönüştürdüğü için doğru sonuca varırız)

1

Dyalog APL (23 karakter)

{2⊥¨↓⍉↑{⍵[⍋⍵]}¨↓2⊥⍣¯1⊢⍵}
  1. Giriş bağımsız değişkenlerini bir ikili matrise dönüştürün
  2. Matrisi sütunlara bölme
  3. Sütunları artan düzende sırala
  4. Sıralanan satırları tekrar ondalık basamağa dönüştürün

Örnek

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

Beni bu konuda düzelttiği için Zacharý'ya teşekkürler.


Sen ile değiştirebilirsiniz (⊥⍣¯1)⍵ile ⊥⍣¯1⊢⍵. Ayrıca, ayrık ( ↓[1]=> ) eksen belirtimine ihtiyacınız olduğunu sanmıyorum .
Zacharý

Oh, ve onu bir listeye dönüştürmelisin!
Zacharý

Bu geçersiz.
Zacharý

Teşekkürler Zacharý, dün gece geç saatlerde çalışıyordum ve sanırım sorunu yanlış anladım. Şimdi çözümümü değiştirdim.
James Heslip

1
Peki, iyi iş! ( ⊥⍣¯1gerçekten bir yerleşik olması gerekir). Kullanıcı adımı doğru aldığınız için teşekkür ederim.
Zacharý

0

JavaScript, 127 125 bayt

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

Çevrimiçi deneyin

İnekler quack sayesinde -2 bayt


(1<<c)&eolabilir2**c&e
Kritixi Lithos

0

Python 2, 142 bayt

... ve hala golf ... umarım –– Herhangi bir yardım takdir!

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

Bunun büyük bir kısmı, sayıları sıfırla doldurmak içindir.

Daha okunabilir:

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

Bu, ikili dizi gösterimlerinin bir dizisini oluşturur, onu doldurur, saat yönünde 90º döndürür, her satırı sıralar, geri döndürür, 90º döndürür ve ardından her satırdan tam sayıları oluşturur.


142 byte , fazladan paranteziniz var.
Bay Xcoder

@ Mr.Xcoder, oh evet bu saçma
Daniel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.