Zayıflamış İkili Duvarlar

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

Esinen: İkili bir duvar yarat

Pozitif tamsayıların bir listesi verildiğinde, bunları örnek olarak [2, 6, 9, 4] olduğu gibi birbirlerinin üstünde yazabiliriz:

0010
0110
1001
0100 

Bunu bir duvar olarak düşünebiliriz:

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

Ancak, bu çok zayıf bir duvar ve çöktü! Her 1 ( # ) yere "veya başka bir 1 ( # ) isabet edene kadar düşer. 0 s (s) hareketsiz 1 saniye bırakılan noktalarda bulunur.

Bu şu şekildedir:

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

Hangisinin çevirdiği:

0000
0000
0110
1111 

Bunlar, sayıların bir listesi olarak [0, 0, 6, 15] dır.

Başka bir test davası

[10, 17, 19, 23] 

Bu olur:

01010
10001
10011
10111 

olur ki:

00000
10011
10011
11111 

geri dönün:

[0, 19, 19, 31] 

Meydan okuma

Pozitif tam sayıların bir listesi verildiğinde, bu dönüşümü listeye uygulayın. Giriş / Çıkış, herhangi bir makul biçimde pozitif tam sayı listeleri olarak. Standart boşluklar geçerlidir.

Bu bir , bu nedenle en kısa cevap bayt kazanır!

5 Comments
1 Leaky Nun 07/29/2017
Daha testcase? Kare olmayan test kutuları iyi olurdu.
HyperNeutrino 07/29/2017
@LeakYNun Tabii. Bunu yapacağım.
Marcus Müller 07/30/2017
Bu sadece bit dizileri için sıralama problemidir.
HyperNeutrino 07/30/2017
@ MarcusMüller Haklısın - MATL'den sonra bunu anladım: P

14 Answers


Suever 07/29/2017.

MATL , 4 bayt

BSXB 

MATL Online'da deneyin

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 Bu nasıl çalışır: o
1 totallyhuman 07/29/2017
MATL sadece 4 bytes golf Jöle'si çıktı mıydı? o_O
Leaky Nun 07/29/2017
5 bayt şimdi :-p
HyperNeutrino 07/29/2017
Asla alttaki xD +1'e taşımak için dahili olacağını düşünmemiştim.
1 JungHwan Min 07/29/2017
@totallyhuman de, Dennis gelene kadar bekle

Anders Kaseorg 07/29/2017.

Python , 68 bayt

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

Çevrimiçi deneyin!


Neil 07/29/2017.

JavaScript (ES6), 50 bayt

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

Açıklama: Duvardaki iki sıra şöyle diyelim:

0011
0101 

Sonuç şu şekilde olmalıdır:

0001
0111 

Başka bir deyişle, ilk satır iki sıranın AND'ına dönüşür ve ikinci sıra iki sıranın OR'ına dönüşür. Bunun, tüm bitlerin en altına düşmesi için yeterince tekrarlanması gerekiyor.


Leaky Nun 07/29/2017.

Jöle , 9 bayt

BUz0Ṣ€ZUḄ 

Çevrimiçi deneyin!


Justin Mariner 07/29/2017.

Japt , 16 bayt

m¤z3 ®¬n qÃz mn2 

Çevrimiçi deneyin! dizi sonucunu biçimlendirmek için -Q bayrağını kullanın.

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 
2 comments
ETHproductions 07/30/2017
think bir mì2 z3 mn z mì2
Justin Mariner 07/30/2017
@ETHproductions Dizgiler dizisini döndürmek yerine 2D diziyi döndürmek gibi görünüyor, her iç diziyi null yerine null ile dolduruyor. Bu işe yaramıyor gibi görünüyor. Ve null boşlukların sola sıralandığı gibi, 1 saniyenin sağında sıralanır.

DanTheMan 07/30/2017.

Mathematica, 64 bayt

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

 is \[Transpose] Geçiş Yap \[Transpose]

Bu, girişi (sayıların bir listesini) bir sayı listesinin bir listesine dönüştürür, onu bir kare matris olarak yatırır, üst üste bindirir, satırları altına "son", böylece üst üste bindirir, sonra sayılara dönüştürür .


xnor 07/30/2017.

Python 3.5 , 60 bayt

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

Çevrimiçi deneyin!

f(2, 6, 9, 4) gibi girdi alır. Girişin boş olmadığını varsayalım. Bir sürü kümeyi açarak kullanır.


Suever 07/30/2017.

Octave, 29 25 bayt

4 bytes saved thanks to @Stewie

@(x)bi2de(sort(de2bi(x))) 
2 comments
Stewie Griffin 07/30/2017
de2bi/bi2de , oktavda 4 bayt kazandırır. Oktave-online.net'de çalışır.
Suever 07/30/2017
@StewieGriffin Teşekkürler!

miles 07/29/2017.

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 
2 comments
Zacharý 07/30/2017
Tekrar ikili bir sol dolgu var, +1. Ve ayrıca, sadece transpoze olduğu için, geçişin tersini neden kullanmanız gerektiğini açıklayabilir misiniz?
miles 08/01/2017
@ Zachariý Ters çevirmeler, her satırı sıralamadan önce kullanılan işlemleri geri almak için kullanılır. Geçişin tersinin sadece transpoze olduğu doğrudur, ancak bunu görmek için başka bir yol şu şekildedir: M olarak M , burada ilk iki işlev sadece son ikisinin tersini.

Erik the Outgolfer 07/30/2017.

05AB1E , 9 bayt

bí0ζR€{øC 

Çevrimiçi deneyin!

Sihirbazdan çok farklı bir algoritma.

3 comments
Magic Octopus Urn 07/31/2017
ζ , kahretsin Benimkini silin, benim +1'imi al.
Erik the Outgolfer 07/31/2017
@MagicOctopusUrn Neden sizinkini sildiniz? Gerek yok.
Magic Octopus Urn 07/31/2017
Gerçekten çok farklı değil (algoritma açısından) ve bu% 25 daha iyi.

Zacharý 07/30/2017.

Dyalog APL, 24 21 19 bayt

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

Çevrimiçi deneyin! (değiştirilip TryAPL geçerli olarak kabul eder)

Nasıl?

  • değerlendirilen girdi (diziler boşluklarla ayrılır)
  • 2⊥⍣¯1⊢ , argümanların her 2⊥⍣¯1⊢ ikili hale getirir (sorunun içindekinin yerini alır)
  • 2D bir diziyi vektörlerin bir vektörüne çevirir
  • {⍵[⍋⍵]}¨ vektörün her bir elemanını sıralar
  • vektörlerin vektörünü yine 2D bir diziye çevirir
  • 2⊥ convert (bunun 2⊥ için doğru sonuca ulaşırız)

James Heslip 07/30/2017.

Dyalog APL (23 karakter)

NO 
  1. Giriş değişkenlerini bir ikili matriste dönüştürün
  2. Matrisi sütunlara ayır
  3. Sütunları artan düzende sırala
  4. Sıralanmış satırları ondalık sıraya dönüştür

Örnek

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

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

5 comments
Zacharý 07/30/2017
(⊥⍣¯1)⍵ ile ⊥⍣¯1⊢⍵ (⊥⍣¯1)⍵ ile ⊥⍣¯1⊢⍵ . Ayrıca, split ( ↓[1] => ) eksen belirtimine ihtiyacınız olduğunu düşünmüyorum.
Zacharý 07/30/2017
Oh, ve bunu bir listeye geri dönüştürmeniz gerekiyor!
Zacharý 07/30/2017
Bu geçersiz.
James Heslip 07/30/2017
Teşekkürler, Zacharý, dün gece bu konuda çalışıyordum ve sanırım sorunu yanlış yönelttim. Şimdi çözümümü değiştirdim.
1 Zacharý 07/30/2017
Iyi iş çıkardın! ( ⊥⍣¯1 gerçekten bir yerleşik olmalı). Ve aslında kullanıcı adımı doğru almanız için teşekkür ederim.

ThePirateBay 07/29/2017.

JavaScript, 127 125 bayt

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

Çevrimiçi deneyin

-2 bytes thanks to Cows quack

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

Dopapp 07/30/2017.

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ı, numaraları sıfırlarla dolgu yapmak 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 dize gösterimlerinden oluşan bir dizi oluşturur, parantez yapar, saat yönünde 90º döndürür, her satırı sıralar, 90º geri döndürür ve her satırdan tamsayılar oluşturur.

2 comments
Mr. Xcoder 07/30/2017
142 bayt , fazladan paranteziniz var.
Dopapp 07/30/2017
@ Mr.Xcoder, ah evet aptalca

Related questions

Hot questions

Language

Popular Tags