Bir ikili duvar oluşturun


33

10 tabanındaki bir pozitif tamsayı dizisi verildiğinde, burada n > 0bir ikili duvarı temsil ettiklerini gösterir.

Bu nasıl çalışıyor?

  1. Her sayıyı ikili gösterime dönüştürün.
  2. Önde gelen sıfırlarla gösterimi en uzun olanın uzunluğuna kadar doldurun yani 1, 2-> 1, 10-> 01, 10.
  3. 1S tuğla ve 0eksik tuğla olduğu bir duvar oluşturun .

Bir duvar, basılabilir herhangi bir karakterin bir tuğlayı temsil ettiği ve bir boşluğun ( 32) eksik tuğlayı temsil ettiği bir karakter bloğudur . Tuğla için herhangi bir karakter seçebilirsiniz, beyaz boşluk karakteri olmadığı sürece duvarda farklı olması gerekmez. Kayıp tuğla karakteri bir boşluk olmalıdır. Aşağıdaki örnekte *tuğlaları kullandım.

Örnek

Giriş:

[ 15, 7, 13, 11 ]
  1. [ 1111, 111, 1101, 1011 ]
  2. [ 1111, 0111, 1101, 1011 ]
  3. Çıktı:

    ****
     ***
    ** *
    * **
    

kurallar

  • Eğer diliniz diğer üsleri kabul ederse, giriş 10 bazında yapılmalıdır.
  • Önde gelen ve takip eden yeni hatlara izin verilir.
  • Giriş bir tamsayı listesi, ayrı argümanlar veya herhangi bir makul formatta alınabilir.
  • Çıktı, herhangi bir makul biçimde olabilir: yeni satır ayrılmış dize, satır dizisi, 2d dizi vb.
  • Standart boşluklara izin verilmez.

Test Kılıfları

İlk test durumunda tüm katmanların sonunda boş bir tuğla olduğuna dikkat edin.

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

****
* **
****
****

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

Bu kod golf yani en kısa kod kazanır!


Çıktı bir satır dizisi veya 2d karakter dizisi olabilir mi?
ovs

@ Üzgünüm Düşündüm ki, evet, bir dizi ya da 2d dizi vb. çıktılar.
TheLethalCoder

2B dizi durumunda, karakterler yerine tuğlalar için sayılar kullanabilir miyiz? eg[[1, " ", 1, " "], ...]
Arnauld

@Arnauld Evet, iyi görünüyor.
TheLethalCoder

1
@Giuseppe Sadece yeni hatlar, aksi takdirde boş tuğlalar için kafası karışır.
TheLethalCoder

Yanıtlar:


13

MATL , 5 bayt

B42*c

Çevrimiçi deneyin!

açıklama

B     % Implicitly input an array of numbers. Convert to binary. 
      % Gives a matrix with each row corresponding to a number
42    % Push 42 (ASCII code of '*')
*     % Multiply
c     % Convert to char. Char 0 is displayed as space. Implicitly display

Tuğla için herhangi bir karakter seçebilirsiniz, beyaz boşluk karakteri olmadığı sürece duvarda farklı olması gerekmez. evet bu muhtemelen ihtiyacınız yok demektir 42*ya da bir şey ...
Outgolfer Erik

@EriktheOutgolfer Başka bir numara seçebilirdim, ancak sanırım bu üç bayta ihtiyacım var.
Luis Mendo

Ya 1 baytlık bir yerleşik 100veya başka bir numara varsa?
Outgolfer Erik,

11

J , 8 bayt

' *'{~#:

Çevrimiçi deneyin!

açıklama

' *'{~#:  Input: array of integers
      #:  Convert each to binary with left-padding
' *'{~    Use the digits to index into the string ' *'

Oh, bu #:yüzden Jelly'i yeniyor.
Outgolfer Erik,


8

Octave, 22 bayt

@(x)[dec2bin(x)-16,'']

Çevrimiçi deneyin

Açıklama:

Luis Mendo sayesinde bazı baytlar kaydedildi! Ayrıca, duvarı inşa etmek için hangi karakteri seçebileceğimi de fark etmedim, sadece değil *.

@(x)                    % Take the input as a column vector
    dec2bin(x)          % Convert each row of the input to a string with 1 and 0
                        % It gets automatically padded with zeros, to fit the longest number
    dec2bin(x)-16       % Subtract 16, to get from the ASCII-values of 1/0 (48/49)
                        % to 32/33 (space and !)
@(x)[dec2bin(x)-16,'']  % Concatenate with the empty string to convert it to a string.

Veya de2bi:

Açıklama:

@(x)                          % Take the input as a column vector
               de2bi(x)       % Convert each row of the input to a binary number.
                              % Gets automatically padded to fit the longest number
            42*de2bi(x)       % Multiply the matrix by 42, which is the ASCII-value for *
           [42*de2bi(x),'']   % Concatenate the matrix with the empty string to convert
                              % it to a string. 0 are automatically displayed as spaces
@(x)fliplr([42*de2bi(x),''])

Aşağıdakiler, TIO'da 7 bayt daha fazla çalışır:

@(x)fliplr([42*(dec2bin(x)>48),''])

Burada dene


5

Python 3 , 88 84 71 74 72 bayt

Her satırı temsil eden bir String listesi döndüren bir lambda.

lambda n:[bin(x)[2:].replace(*'0 ').rjust(len(bin(max(n)))-2)for x in n]

Çevrimiçi deneyin! (newline ayrılmış sürümüne bağlantı)

açıklama

  • lambda n:- Parametreli (anonim) bir lambda oluşturur n. Örtük olarak döndürür.

  • [...] - Bir liste anlama oluşturur.

  • bin(x)[2:] - Sayıların ikili gösterimlerini alır.

  • .replace(*'0 ')- Tüm oluşumlarını 0bir boşlukla değiştirir.

  • .rjust(len(bin(max(n)))-2) - İkili gösterimleri en uzun olanın uzunluğuna kadar doldurur.

  • for x in n- nDeğişkenle birlikte tekrar eder x.


Değişiklikler

  • - 1 - 3 bayt @Rod, -(...)+2= 2-(...), kullanımı sayesinderjust()

  • bin()Bunun yerine bir sürüm eklendi , 1ve çalışmadığı için geçersizdi 2.

  • Yukarıdaki hatayı kullanarak düzeltildi format().

  • OP'nin izin verdiği için Dizge listesine dönüş türü değiştirildi.

  • @Rod tarafından tespit edilip rjust()yeniden kullanılmaya bin()başlanan diğer hata giderildi , tespit edildi ve düzeltildi.


5

JavaScript (ES6), 81 79 bayt

Rick Hitchcock tarafından önerildiği gibi, tuğlalar için karakterler yerine sayıları kullanarak 2 bayt kaydedildi

Tuğlalar için 1'lerle 2B dizi döndürür.

f=(a,b=[],x=1)=>a.every(n=>n<x)?a.map(n=>b.map(i=>n&i?1:' ')):f(a,[x,...b],x*2)

Test durumları




4

Ruby, 63 59 bayt

Alexis Andersen yardımı ile -4 bayt

->*n{puts n.map{|i|("%#{('%b'%n.max).size}b"%i).tr'0',' '}}

Çevrimiçi deneyin!


1
string biçiminde 0'a ihtiyacınız yoktur. Eğer değiştirerek byte tıraş olabilir n.max.to_s(2).sizeile ('%b'%n.max).sizeve aslında değiştirmek gerekmez 1ile*
Alexis Andersen

@AlexisAndersen thanks :)
daniero

4

R , 87 88 bayt

Duvar blokları ile temsil edilen 8, çünkü çok fazla sekiz.

write(ifelse((I=sapply(scan(),intToBits))[(M=max(which(I>0,T)[,1])):1,],8,' '),1,M,,'')

Çevrimiçi deneyin!

Giriş tamsayı listesi, 0 biti kesilmiş ve ters çevrilmiş bit dizisine dönüştürülür.

Küçültülmüş dizi daha sonra writeve dizi kesildiğinde belirlenen bir sütun genişliği kullanılarak çıkarılır.

ifelse() ne yazık ki vektörlerde çalışan tek IF seçeneği.


@Vlo , çıktı dosyasındakiler 1yerine kullanabileceğinizi belirtti . ""write
Giuseppe

@Giuseppe bahşiş için teşekkürler
MickyT 12:18


3

APL (Dyalog) , 30 22 20 14 bayt

@ Adám sayesinde 6 bayt kaydedildi

' *'[⍉2⊥⍣¯1⊢⎕]

Çevrimiçi deneyin!

( ⎕IO←0bunun birçok makinede varsayılan olduğunu varsayar )

Bu, diziyi girdi olarak alır ve *s ve s ile bir matris döndürür .

açıklama

2⊥⍣¯1⊢⎕       Convert input to binary (returns a transposed matrix of 1s and 0s)
              Transpose
' *'[ ... ]    Index into this string

6 bayt ile kaydet' *'[⍉2⊥⍣¯1⊢⎕]
Adám

@ Adám Tavsiyeler için teşekkürler, kaldırabileceğimi bilmiyordum ¨.
Kritixi Lithos

3

T-SQL, 290 bayt

declare @ int;select @=max(log(a,2))+1from @i;with t as(select convert(varchar(max),a%2)b,a/2c,@-1m,ROW_NUMBER()over(order by(select 1))r from @i union all select convert(varchar(max),concat(c%2,b))b,c/2c,m-1,r from t where m>0)select replace(b,0,' ')from t where m=0group by r,b order by r

Kullanımları 1Tuğla parçası için , girdi tablodan geliyor varsayar@

Ungolfed, bir açıklama ile

-- assume input is presented in an input table
declare @input table (a int)
insert into @input values (15), (7), (13), (11)

---- start here

-- figure out how many characters are needed, by taking log2
declare @max int
select @max = max(log(a, 2)) + 1
from @input

-- recursive cte
-- will join against itself, recursively finding each digit in the binary string
;with cte as
(
    select 
        convert(varchar(max), a % 2) as b, -- is the least significant bit 1 or 0
        a / 2 as c, -- remove least significant bit, for the next run
        @max - 1 as max, -- keep track of iterations left
        ROW_NUMBER() over (order by (select 1)) as rn -- keep the order of the input
    from @input

    union all -- recursive loop
              -- below columns follow the same pattern

    select convert(varchar(max), 
        concat(cte.c % 2, cte.b)) as b, -- prepend the current binary string with the newest least significant bit
        cte.c / 2 as c, 
        cte.max - 1, 
        cte.rn
    from cte
    where cte.max > 0
)
select replace(b, 0, ' ') -- swap 0s for space
from cte
where max = 0 -- only take the last iteration
group by rn, b -- grab each unique input, 
               -- need to group by row number so it can be ordered by
               -- need to group by binary string, so it can be selected
order by rn -- sort by the order the input arrived in

3

Mathematica, 40 bayt

Grid@PadLeft@IntegerDigits[#,2]/. 0->""&

Tuğla 1s vardır

Mathematica, 48 bayt

Grid@PadLeft@IntegerDigits[#,2]/.{0->"",1->"#"}& 

Tuğlalar


Sadece tek bir eğik çizgiye ihtiyacınız var //.. ( /."bir kez değiştir" //.anlamına gelir, "şey değişmeyi bırakıncaya kadar değiştirmeyi sürdürmek " anlamına gelir.)
Bir ağaç değil

ok-fixed-thanks
J42161217

IntegerDigits işlevinde virgülden sonra boşluğa ihtiyacınız yoktur.
Mark S., 0:

evet, biliyorum, bu notebook.fixed'den kopyala / yapıştır yaptığınızda olur
J42161217

2

C # (.NET Core) , 112 + 18 = 130 86 + 41 = 127 bayt

a=>a.Select(n=>C.ToString(n,2).Replace("0"," ").PadLeft(C.ToString(a.Max(),2).Length))

Çevrimiçi deneyin!

Bayt sayısı gelen 41 bayt içerir using System.Linq;using C=System.Convert;. 1Duvar için karakter olarak kullanır . Bununla birlikte, bu C # için bile çok uzun ...


Place namespace System.Linq{}bazı bayt kaydedin. a.Max()Doğru olacağının garantisi var mı (eminim sadece ikili olan en zeki değilim: P)? Misiniz class Convert{}herhangi bayt kaydetmek?
TheLethalCoder

1
Programı belirli bir ad alanına yerleştirirsem, lambda yerine tüm programı sunmamalı mıyım? Bunun için kurallar konusunda emin değilim ...
Charlie,

Genellikle sadece lambda ile ad alanına yerleştirdim. Bunun hakkında bir soru olduğunu sanmıyorum ve C # ipuçları sayfasında.
TheLethalCoder

Bunun geçerli olduğunu sanmıyorum, çünkü statik alma kullanmadan derleyemezsiniz.
MetaColon

2
@MetaColon , kodun derlenmesi için gerekli olan using System.Linq;using C=System.Convert;iki usingdirektif gerektiğinden byte sayısını bayt sayımına eklememin nedeni budur .
Charlie,

2

Retina , 63 bayt

.+
$*#<
+`(#+)\1
$1 
 #
#
{T`<`_`^(<.+(¶|$))+$
m`^<
 <
(.)<
<$1

Çevrimiçi deneyin! Açıklama:

.+
$*#<

Birliğe dönüştürme ve son eki a <.

+`(#+)\1
$1 
 #
#

İkili dosyaya dönüştür.

{T`<`_`^(<.+(¶|$))+$

Hepsi <sola ulaştığında, hepsini silin.

m`^<
 <

Daha önce <sola ulaşmış olanlardan önce bir boşluk bırakın.

(.)<
<$1

Tüm <sola bir adım sola taşıyın . Durulayın ve tekrarlayın.


2

PowerShell , 100 bayt

$args|%{if(($c=($a=[convert]::ToString($_,2)).length)-gt$l){$l=$c}$a-replace0,' '}|%{$_.padleft($l)}

Çevrimiçi deneyin!

Ah, convertPowerShell'de ikili dosyaya girmek çok acı verici. Artı .lengthy çağrılar boşluklar, artı uzun olan çağrı hepsini aynı yapmak-replace0.padLeft().length tüm uzun bir boyun kadar ekler.

100'ü aşan golf önerileri kabul edilir.


2

PHP, 84 bayt

while(++$i<$argc)echo strtr(sprintf("\n%".-~log(max($argv),2).b,$argv[$i]),10,"* ");

Neyse ki, bit işlemi log sonucu int . şamandıra burada çalışmadı.

Çevrimiçi deneyin .


2

Clojure, 185 bayt

(fn[i](let[b(map #(Long/toBinaryString %)i)](map #(clojure.string/replace(clojure.string/replace(format(str"%0"(reduce(fn[l i](max l(count i)))0 b)"d")(read-string %))"1""#")"0"" ")b)))

Ungolfed versiyonu:

(fn [i]
    (let [b (map #(Long/toBinaryString %) i)]
        (map
            #(clojure.string/replace
                (clojure.string/replace
                    (format
                        (str "%0"
                            (reduce
                                (fn [l i] (max l(count i))) 0 b)
                            "d")
                        (read-string %))
                        "1"
                        "#")
                "0"
                " ")
        b)))

Argümanı liste olarak alan adsız işlev. Satırları liste olarak döndürür.

Diğer cevapları okumak, bahse girerim daha küçük olabilir. clojure.string/replacemüstehcen miktarda karakter yazmak için alır ..


2

Japt , 33 30 bayt

¡'0p(¡X¤lÃn o)-X¤l)+X¤)£" *"gX

Çevrimiçi deneyin!

@Justin Mariner sayesinde 3 bayt kurtarıldı

açıklama

¡                              // map input integers
    (¡X¤lÃn o)                 // longest binary string length
              -X¤l)            // minus current binary string length
 '0p                           // repeat zero
                   +X¤)        // concat with current binary string
                       £       // map chars of binary string
                        " *"gX // swap 0 and 1 with ' ' and '*'

Sadece bir dizge dizisi döndürmek için son 3 karakteri bırakabilir ve -Ryeni satırla birleştirilmiş çıktıyı görmek için bayrak (bayt sayısına eklenmemiş) kullanabilirsiniz: buraya .
Justin Mariner,

2

Python 3 , 92 90 bayt

lambda a:[' '*(len(bin(max(a)))-len(i)-2)+i for i in[bin(i)[2:].replace(*'0 ')for i in a]]

Çevrimiçi deneyin!

Satır listesini döndürür. Onları üst üste dizmek, gerçekten doğru bir şekilde hizalandıklarını gösterir.

['111 ', ' 1  ', ' 11 ', '  1 ']
>>>
 111 
  1  
  11 
   1 

Arıza

Temel olarak diziyi ikiliye dönüştürür, ardından tüm 0'ları boşluklarla değiştirir. NHer satırın önüne boşluk sayısı eklenir N = [length of longest line] - [length of line].

-1 bytes Bay Xoder'a teşekkürler

Çevrimiçi deneyin!


Çıktıda öncü veya iz bırakan boşluklara sahip olamazsınız.
TheLethalCoder

@TheLethalCoder Ah, kuralları yanlış okumuş olmalı! Onu yakaladığın için teşekkürler.
Graviton

90 bayt yerine '0',' 'ile *'0 '.
Bay Xcoder,

@ Bay Xcoder Ah ilginç, bunu asla düşünmezdim. Teşekkürler!
Graviton

2

Japt , 11 bayt

m¤z3 z ·r0S

Çevrimiçi deneyin!

açıklama

m¤z3 z ·r0S  Implicit input of array
m¤           Map the array to binary strings
  z3 z       Rotate right 270° and then right 90°. This adds left padding to each string
       ·r0S  Join with newlines and replace 0s with spaces

İle güzel sömürü z3 z. Neden y yorada çalışmadığından emin değilim, daha sonra inceleyeceğim ...
ETHproductions

2

Java 7, 130 108 88 bayt

@TheLethalCoder sayesinde 22 kayıtlı @Xanderhall sayesinde 20 tasarruflu

void a(int[]b){for(int i:b)System.out.println(Long.toBinaryString(i).replace('0',' '));}

Ungolfed:

void a(int[]b){
    for(int i:b)
        System.out.println(Long.toBinaryString(i).replace('0', ' '));       
}

1
Mesaj artım ide b[i]bir byte kaydedin. Çıktıyı saklayabilmeniz için 1ihtiyacı yoktur .replace('1','*'). Bunun yerine Java 8 kullanın ve baytları kaydetmek için bir lambda derleyin. Bunu yapmak istemiyorsanız int[]b, bir bayt kazandırır.
TheLethalCoder

Teşekkür ederim! Lütfen "Bayt artışı için i [b] 'deki artış sonrası i" yi açıklayabilir misiniz? anlamına geliyor?
Java Gonzar

i++değerlendirir, isonra onu artırır ( ++ibunun tersini yapar), böylece döngü i++dışına taşıyabilir forve b[i++]bunun yerine kullanabilirsiniz . Oh ve biz oradayken, ilmekiniz içinde sadece bir çizgi var böylece diş tellerine ihtiyaç duyulmaz.
TheLethalCoder

Doğru! Şaşırtıcı, teşekkür ederim
Java Gonzar

2
Döngünüzü foreach döngüsüne geçirerek birkaç bayt tasarruf edebilirsiniz. for(int x:i)Ayrıca, Long.toBinaryString3 bayt kaydetmek için Tamsayı sürümü yerine kullanabilirsiniz .
Xanderhall

1

Python 2,21 bayt

2 saatlik kodlamadan sonra karar verdim, bu numpy bunun için kötü bir fikir

import numpy as n
i=n.loadtxt("i")
o=[n.copy(i)]
o[0].fill(10)
while n.count_nonzero(i)>0:
 o.append(i%2+32)
 i=n.vectorize(lambda x:x//2)(i)
print n.fliplr(n.array(o).T).astype('uint8').view('c').tostring().decode()

Ubuntu'da Kullanım

Numpy yükleyin

python2 -m pip install numpy

iGiriş biçiminde dosya adı ile oluştur14 4 6 2

Koşmak

python2 prog.py

1

8 , 232 254 250 bayt

kod

0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop

Yorumlanmamış Ungolfed versiyonu

\ convert to binary and save longest string length
: f 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop ;

\ pad binary number with zero
: f1 a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop ;

\ replace every 0 with space
: f2 a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ;

\ replace every 1 with * and print each line of bricks
: f3 ( nip /1/ "*" s:replace! . cr ) a:each drop ;

Bu kelimeler sırayla çağrılmalıdır (örneğe bakınız)

Kullanım ve örnekler

ok> [15,7,13,11] 0 >r a:new swap ( nip 2 base drop >s decimal s:len r> n:max >r a:push ) a:each drop a:new swap ( nip '0 G:c# r@ G:#> s:fmt a:push ) a:each drop rdrop a:new swap ( nip /0/ " " s:replace! a:push ) a:each drop ( nip /1/ "*" s:replace! . cr ) a:each drop
****
 ***
** *
* **

Veya daha açık bir şekilde

ok> [15,11,15,15] f f1 f2 f3
****
* **
****
****


1

Excel VBA, 170 161 Bayt

golfed

1 2 3 .. nAralıktan format girişini alan [A1]ve ilgili ikili duvarı aralık üzerinden VBE Anlık penceresine çıkaran isimsiz VBE acil pencere işlevi[B1,C1,2:2]

n=Split([A1]):[A2].Resize(1,UBound(n)+1)=n:[C1]="=Int(1+Log(B1,2))":For Each i In n:[B1]=i:?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," "):Next

biçimlendirilmiş:

n=Split([A1])
[A2].Resize(1,UBound(n)+1)=n
[C1]="=Int(1+Log(B1,2))"
For Each i In n
[B1]=i
?Replace(Replace([Right(Rept(0,C1)&Dec2Bin(B1),C1)],1,"*"),0," ")
Next

Ungolfed

SubBiçimin girişini alan Array(1, 2, 3...)ve ilgili ikili duvarı aralık aracılığıyla VBE Acil Durum penceresine çıkaran tam yordam[A1,B1,2:2]

Sub a(ByRef n As Variant)
    Let Range("A1").Resize(1,UBound(n)+1) = n
    Let Range("C1").Value = "=Int(1+Log(A1,2))"
    Dim i As Integer
    For Each i In n
        Let Range("A1").Value = i
        Debug.Print Replace(
                            Replace(
                                    [Right( Rept( 0, C1) & Dec2Bin( B1), C1)],
                                    1,
                                    "*"
                            ),
                            0,
                            " "
                    )
    Next
End Sub

1

Kömür , 20 bayt

WS«⸿≔IιιWι«←§ *ι≧÷²ι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Her giriş numarasını ikiliye elle dönüştürerek çalışır, ancak sağdan sola doğru yazdırarak çalışır. Girişi bir satır sonlu dize olarak alırım, çünkü Kömür listesinin girişi için iyi bir yol yoktur, aksi halde şu anda 21 bayt alan bir şey yazarım:

WS⊞υIιW⌈υ«Eυ﹪κ²↓⸿≧÷²υ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Bu sürüm, giriş dizisi üzerinde vektörleşir; bununla birlikte, çıktısı -bir bayttan tasarruf eden s'ye kodlanmışdur .

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.