Buat dinding biner


33

Diberikan array bilangan bulat positif di basis 10, di mana n > 0, menampilkan representasi mereka dari dinding biner.

Bagaimana cara kerjanya?

  1. Ubah setiap angka menjadi representasi binernya.
  2. Pad representasi dengan memimpin nol sampai yang terpanjang yaitu 1, 2-> 1, 10-> 01, 10.
  3. Buat dinding di mana 1s adalah batu bata dan 0s adalah batu bata yang hilang.

Dinding adalah blok karakter di mana setiap karakter yang dapat dicetak mewakili batu bata dan spasi ( 32) mewakili batu bata yang hilang. Anda dapat memilih karakter apa pun untuk batu bata, itu tidak harus berbeda di dinding selama itu bukan karakter ruang putih. Karakter bata yang hilang harus berupa spasi. Untuk contoh di bawah ini saya gunakan *untuk batu bata.

Contoh

Memasukkan:

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

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

Aturan

  • Masukan harus diambil dalam basis 10, jika bahasa Anda menerima basis lain Anda mungkin tidak menggunakannya.
  • Memimpin dan mengikuti garis baru diperbolehkan.
  • Masukan dapat diambil sebagai daftar bilangan bulat, argumen terpisah atau format apa pun yang masuk akal.
  • Output mungkin dalam format apa pun yang wajar: string yang dipisahkan baris baru, array baris, array 2d, dll.
  • Celah standar tidak diijinkan.

Uji Kasus

Perhatikan bahwa dalam kasus uji pertama semua lapisan memiliki batu bata kosong di ujungnya.

[ 14, 4, 6, 2 ]

*** 
 *  
 ** 
  * 

[ 1, 2, 4, 8, 16 ]

    *
   * 
  *  
 *   
*

[ 15, 11, 15, 15 ]

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

[ 11, 10, 9, 8 ]

* **
* * 
*  *
*   

Ini golf kode sehingga kode terpendek menang!


Bisakah output berupa array baris atau array karakter 2d?
Ovs

@ovs Maaf pikir saya telah menentukan itu, ya Anda dapat menampilkan array atau array 2d dll. Format yang masuk akal.
TheLethalCoder

Dalam hal array 2D, dapatkah kita menggunakan angka untuk batu bata alih-alih karakter? mis[[1, " ", 1, " "], ...]
Arnauld

@Arnauld Ya itu sepertinya baik-baik saja.
TheLethalCoder

1
@Giuseppe Baris baru saja, kalau tidak akan bingung untuk batu bata kosong.
TheLethalCoder

Jawaban:


13

MATL , 5 byte

B42*c

Cobalah online!

Penjelasan

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

Anda dapat memilih karakter apa pun untuk batu bata, itu tidak harus berbeda di dinding selama itu bukan karakter ruang putih. ya itu berarti Anda mungkin tidak perlu 42*atau sesuatu ...
Erik the Outgolfer

@EriktheOutgolfer Saya bisa memilih nomor lain, tapi saya pikir saya butuh tiga byte.
Luis Mendo

Bagaimana jika ada builtin 1-byte untuk 100atau nomor lain?
Erik the Outgolfer

11

J , 8 byte

' *'{~#:

Cobalah online!

Penjelasan

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

Oh, jadi #:inilah mengapa ini mengalahkan Jelly.
Erik the Outgolfer


8

Oktaf, 22 byte

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

Cobalah online

Penjelasan:

Menyimpan beberapa byte berkat Luis Mendo! Juga, saya tidak menyadari bahwa saya dapat memilih karakter mana yang akan dibangun, tidak hanya *.

@(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.

Atau dengan de2bi:

Penjelasan:

@(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),''])

Berikut ini berfungsi pada TIO, untuk 7 byte lebih:

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

Coba di sini


5

Python 3 , 88 84 71 74 72 byte

Lambda yang mengembalikan daftar string, mewakili setiap baris.

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

Cobalah online! (tautan ke versi yang dipisahkan baris baru)

Penjelasan

  • lambda n:- Membuat lambda (anonim), dengan parameter n. Mengembalikan secara implisit.

  • [...] - Membuat pemahaman daftar.

  • bin(x)[2:] - Mendapat representasi biner dari angka-angka.

  • .replace(*'0 ')- Mengganti semua kemunculan 0dengan spasi.

  • .rjust(len(bin(max(n)))-2) - Pads representasi biner dengan panjang yang terpanjang.

  • for x in n- Berputar melalui n, dengan variabel x.


Changelog

  • - 1 - 3 byte berkat @Rod, -(...)+2= 2-(...), penggunaanrjust()

  • Menambahkan versi dengan bin(), yang tidak valid karena tidak bekerja untuk 1dan 2.

  • Memperbaiki bug di atas menggunakan format().

  • Mengubah jenis kembali ke daftar Strings, karena diizinkan oleh OP.

  • Memperbaiki bug lain yang menggunakan rjust()dan beralih kembali ke bin(), terlihat dan diperbaiki oleh @Rod.


5

JavaScript (ES6), 81 79 byte

Menyimpan 2 byte dengan menggunakan angka, bukan karakter untuk batu bata, seperti yang disarankan oleh Rick Hitchcock

Mengembalikan array 2D dengan 1 untuk batu bata.

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)

Uji kasus




4

Ruby, 63 59 byte

-4 byte dengan bantuan dari Alexis Andersen

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

Cobalah online!


1
Anda tidak perlu 0 dalam format string. Anda bisa mencukur byte dengan mengganti n.max.to_s(2).sizedengan ('%b'%n.max).sizedan Anda tidak benar-benar perlu mengganti 1dengan*
Alexis Andersen

@AlexisAndersen terima kasih :)
daniero

4

R , 87 88 byte

Blok dinding diwakili oleh 8, karena, juga banyak delapan.

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

Cobalah online!

Input integer list dikonversi ke array bit yang dipangkas dari trailing 0 bit dan dibalik.

Array berkurang kemudian output menggunakan writedan lebar kolom yang ditentukan ketika array dipangkas.

ifelse() adalah satu-satunya opsi JIKA yang bekerja pada vektor sayangnya.


@Vlo menunjukkan Anda dapat menggunakan 1daripada ""untuk file output dalam write.
Giuseppe

@Giuseppe terima kasih atas tipnya
MickyT


3

APL (Dyalog) , 30 22 20 14 byte

Disimpan 6 byte berkat @ Adám

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

Cobalah online!

(menganggap ⎕IO←0ini default pada banyak mesin)

Ini mengambil input sebagai array dan mengembalikan matriks dengan *s dan s.

Penjelasan

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

Hemat 6 byte dengan' *'[⍉2⊥⍣¯1⊢⎕]
Adám

@ Adám Terima kasih atas tipsnya, saya tidak tahu saya bisa menghapusnya ¨.
Kritixi Lithos

3

T-SQL, 290 byte

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

Penggunaan 1untuk potongan bata, mengasumsikan input berasal dari tabel@

Tidak disatukan, dengan beberapa penjelasan

-- 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 byte

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

Batu bata adalah 1s

Mathematica, 48 byte

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

Batu bata adalah #


Anda hanya perlu satu tebasan di //.. ( /.Berarti "ganti sekali", //.berarti "terus melakukan penggantian sampai hal itu berhenti berubah".)
Bukan pohon

ok-diperbaiki-terima kasih
J42161217

Anda tidak perlu spasi setelah koma di fungsi IntegerDigits.
Mark S.

ya, saya tahu, ini terjadi ketika Anda menyalin / menempel dari notebook.fixed
J42161217

2

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

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

Cobalah online!

Jumlah byte termasuk 41 byte dari using System.Linq;using C=System.Convert;. Digunakan 1sebagai karakter untuk dinding. Meskipun demikian, ini terlalu lama bahkan untuk C # ...


Tempatkan namespace System.Linq{}untuk menyimpan beberapa byte. Apakah a.Max()dijamin benar (saya yakin itu bukan saya yang paling pintar dengan binary: P)? Apakah akan class Convert{}menghemat byte?
TheLethalCoder

1
Jika saya menempatkan program di namespace yang diberikan, tidakkah saya harus menyerahkan seluruh program, bukan hanya lambda? Saya tidak yakin tentang aturan untuk itu ...
Charlie

Saya biasanya baru saja ditempatkan di namespace dengan lambda. Saya tidak berpikir ada pertanyaan tentang itu dan itu ada di halaman tips C #.
TheLethalCoder

Saya rasa ini tidak valid, karena Anda tidak dapat mengompilasinya tanpa menggunakan impor statis.
MetaColon

2
@MetaColon itulah alasan mengapa saya menambahkan byte using System.Linq;using C=System.Convert;ke dalam jumlah byte, karena kedua usingarahan tersebut diperlukan untuk mengkompilasi kode.
Charlie

2

Retina , 63 byte

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

Cobalah online! Penjelasan:

.+
$*#<

Konversikan ke unary, dan suffix a <.

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

Konversi ke biner.

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

Setelah semua <mencapai kiri, hapus semuanya.

m`^<
 <

Masukkan spasi sebelum huruf apa pun <yang telah mencapai kiri.

(.)<
<$1

Pindahkan semua < tersisa satu langkah. Bilas dan ulangi.


2

PowerShell , 100 byte

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

Cobalah online!

Eh, convertbiner di PowerShell sangat menyakitkan. Ditambah .lengthpanggilan y ke -replacedalam 0dengan ruang, ditambah panjang.padLeft() panggilan untuk membuat mereka semua sama .length, semua menambahkan hingga pengajuan panjang.

Saran bermain golf untuk mendapatkan di bawah 100 dipersilahkan.


2

PHP, 84 byte

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

Untungnya, operasi bit melemparkan loghasilnya ke int. float tidak akan bekerja di sini.

Cobalah online .


2

Clojure, 185 byte

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

Versi tidak disatukan:

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

Fungsi anonim yang mengambil argumen sebagai daftar. Mengembalikan garis sebagai daftar.

Membaca jawaban yang lain, saya yakin bisa lebih kecil. clojure.string/replaceDibutuhkan sejumlah karakter cabul untuk menulis ..


2

Japt , 33 30 byte

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

Cobalah online!

Disimpan 3 byte berkat @Justin Mariner

Penjelasan

¡                              // 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 '*'

Anda dapat menjatuhkan 3 karakter terakhir untuk hanya mengembalikan array string, dan menggunakan -Rbendera (tidak ditambahkan ke jumlah byte) untuk melihat output yang bergabung dengan baris baru: di sini .
Justin Mariner

2

Python 3 , 92 90 byte

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

Cobalah online!

Mengembalikan daftar garis. Menumpuknya menunjukkan bahwa mereka memang benar-benar sejajar.

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

Kerusakan

Pada dasarnya mengubah array menjadi biner, lalu mengganti semua 0 dengan spasi. Njumlah spasi ditambahkan ke depan setiap baris tempat N = [length of longest line] - [length of line].

-1 bytes Terima kasih untuk Tn. Xoder

Cobalah online!


Anda tidak dapat memiliki spasi awal atau akhir pada output.
TheLethalCoder

@TheLethalCoder Oh, pasti salah membaca aturan! Terima kasih sudah menangkapnya.
Graviton

90 byte , ganti '0',' 'dengan *'0 '.
Tn. Xcoder

@ Mr.Xcoder Ah menarik, tidak akan pernah memikirkan itu. Terima kasih!
Graviton

2

Japt , 11 byte

m¤z3 z ·r0S

Cobalah online!

Penjelasan

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

Eksploitasi yang bagus dengan z3 z. Tidak yakin mengapa y ytidak bekerja di sana, saya akan memeriksanya nanti ...
ETHproduksi

2

Java 7, 130 108 88 byte

Disimpan 22 berkat @TheLethalCoder Disimpan 20 berkat @Xanderhall

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

Tidak Disatukan:

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

1
Poskan kenaikan ipada b[i]untuk menyimpan satu byte. Anda dapat menyimpan output dengan 1sehingga tidak perlu untuk .replace('1','*'). Gunakan Java 8 sebagai gantinya dan kompilasi ke lambda untuk menyimpan byte. Jika Anda tidak ingin melakukan itu int[]bmenghemat satu byte.
TheLethalCoder

Terima kasih! Bisakah Anda jelaskan apa yang "Pasang selisih i di b [i] untuk menyimpan byte." cara?
Java Gonzar

i++Mengevaluasi ikemudian menambahkannya (sedangkan ++isebaliknya) sehingga Anda dapat memindahkan i++keluar dari forloop dan menggunakan b[i++]sebagai gantinya. Oh dan sementara kami melakukannya Anda hanya memiliki satu baris di dalam loop Anda sehingga kawat gigi tidak diperlukan.
TheLethalCoder

Benar! Luar biasa, terima kasih
Java Gonzar

2
Anda dapat menyimpan beberapa byte dengan mengalihkan loop Anda ke loop foreach. for(int x:i)Selain itu, Anda dapat menggunakan Long.toBinaryStringbukan versi Integer untuk menghemat 3 byte.
Xanderhall

1

Python 2, 217 byte

Setelah 2 jam coding saya memutuskan, itu numpy adalah ide yang buruk untuk ini

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

Penggunaan di Ubuntu

Instal numpy

python2 -m pip install numpy

Buat nama file idengan input dalam format14 4 6 2

Menjalankan

python2 prog.py

1

8 , 232 254 250 byte

Kode

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

Versi tidak dikoleksi dengan komentar

\ 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 ;

Kata-kata ini harus dipanggil secara berurutan (lihat contoh)

Penggunaan dan contoh

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
****
 ***
** *
* **

Atau lebih jelas

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


1

Excel VBA, 170 161 Bytes

Golf

Fungsi jendela langsung VBE anonim yang mengambil input format 1 2 3 .. ndari rentang [A1]dan mengeluarkan dinding biner yang sesuai ke jendela Segera VBE melalui rentang[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

Diformat:

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

Tidak disatukan

SubRutin penuh yang mengambil input format Array(1, 2, 3...)dan mengeluarkan dinding biner yang sesuai ke jendela VBE Immediate via range[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

Arang , 20 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bekerja dengan mengonversi setiap nomor input menjadi biner secara manual tetapi mencetaknya dalam urutan kanan-ke-kiri. Saya mengambil input sebagai string yang diakhiri baris baru karena Charcoal tidak memiliki cara yang baik untuk memasukkan daftar jika tidak saya akan menulis sesuatu seperti ini yang sayangnya saat ini membutuhkan 21 byte:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Versi ini meng-vektor-kan array input, meskipun outputnya dikodekan ke -s yang menyimpan byte.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.