Grid biner 16-bit

29

Dengan bilangan bulat 16 bit yang tidak ditandatangani, konversikan bentuk desimalnya (yaitu, basis-10) menjadi kisi ASCII 4x4 bitnya, dengan bit paling signifikan (MSB) di kiri atas, bit paling tidak signifikan (LSB) di kanan bawah, baca seberang lalu ke bawah (seperti teks bahasa Inggris).

Contohnya

Input: 4242

+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Input: 33825

+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Persyaratan Khusus

  1. Input harus dalam desimal (basis-10), namun Anda dapat mengonversi ke biner dengan cara apa pun yang Anda inginkan (termasuk menggunakan bahasa bawaan, jika tersedia).

  2. Format tabel output harus sama persis . Ini berarti Anda harus menggunakan karakter ASCII spesifik ( -,, +dan |) untuk garis-garis kotak tabel seperti yang ditunjukkan, masing-masing interior sel adalah 3 karakter, dan bit benar diwakili oleh #sedangkan false diwakili oleh spasi ( ).

  3. Ruang putih terkemuka atau tertinggal tidak diizinkan. Baris baru final diperlukan .

  4. Pesanan bit harus sesuai dengan contoh seperti yang dijelaskan.

Tunjangan

  1. Input harus berupa angka dasar-10 pada baris perintah, input standar, atau input pengguna, tetapi tidak boleh dikodekan ke dalam kode sumber Anda.

Semoga jelas menang kode terpendek! :-)

type_outcast
sumber
1
Terkait
Sp3000
2
Kalimat pertama terdengar membingungkan bagi saya, di mana ia mengatakan "konversi bentuk desimalnya ". Berdasarkan sisa posting dan contoh, sepertinya input diberikan dalam bentuk desimal, tetapi Anda harus mengubah bentuk biner dari nilai menjadi kisi-kisi.
Reto Koradi
1
@RetoKoradi Anda pada dasarnya benar, tetapi pertanyaannya mengharuskan Anda untuk mengubah angka desimal menjadi kotak biner . Tidak ada persyaratan eksplisit untuk bekerja dengan nomor biner, hanya detail implementasi yang mungkin.
type_outcast
Apakah menulis fungsi dengan nomor basis-10 sebagai argumen fungsi dihitung sebagai input pengguna?
Alex A.
2
Karena Anda mengatakan bahwa angka yang diberikan adalah " integer 16 bit yang tidak ditandai ", itu adalah definisi dalam bentuk biner. Ketika saya pertama kali membaca ini, sebenarnya terdengar seperti input akan diberikan dalam bentuk biner. Semuanya menjadi jelas menjelang akhir. Tapi setidaknya bagi saya, paragraf pertama benar-benar tidak menangkap masalah sama sekali.
Reto Koradi

Jawaban:

21

J, 26 byte

('   ';' # '){~4 4$_16{.#:

Kata kerja anonim. Syukurlah, J sangat pandai menggambar kotak. Mari kita coba:

   f =. ('   ';' # '){~4 4$_16{.#:
   f 4242
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Seperti disebutkan oleh beberapa komentator, cara J menggambar kotak bergantung pada sistem: pada beberapa platform, kode ini akan bekerja di bawah pengaturan default, tetapi pada yang lain, kotak akan digambar menggunakan karakter menggambar garis Unicode. (Perintah 9!:6dan9!:7 memungkinkan Anda untuk meminta dan mengatur karakter masing-masing untuk menggambar nilai kotak.)

Lynn
sumber
Apakah Anda (atau orang lain) tahu apakah ada konsensus pada perintah menggambar kotak untuk mencetak gol golf, maka? Saya pribadi berpikir asumsi dengan kode golf adalah bahwa solusi bekerja pada mayoritas sistem yang menggunakan bahasa solusi, kan? Apa yang akan terlihat seperti solusi yang menampilkan kotak yang benar pada semua (atau hampir semua) instalasi J? Omong-omong, saya sangat menyukai solusi Anda! Otak saya masih bekerja, yang persis seperti apa yang saya sukai tentang kode golf.
type_outcast
5
@type_outcast Kami tidak memerlukan portabilitas untuk tantangan kode golf. Selama itu bekerja dengan beberapa implementasi pada satu platform, itu valid.
Dennis
Terima kasih atas tanggapan @Dennis. Saya senang anggapan saya salah, kalau begitu, karena saya (masih) sangat menyukai solusi Mauris! :-)
type_outcast
14

JavaScript (ES6), 102

... atau 96 menggunakan returnsebagai gantinya console.log.

Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6.

f=n=>{for(o=h=`
+---+---+---+---+
`,z=16;z--;n/=2)o=(z&3?'':h+'|')+` ${' #'[n&1]} |`+o;console.log(o)}

// TEST
console.log=x=>O.innerHTML=x+O.innerHTML

function test(n) { f(n); console.log(n); }
<input id=I value=4680><button onclick='test(+I.value)'>-></button>
<pre id=O></pre>

edc65
sumber
6
Apakah "JavaScripy" adalah javascript / python mashup yang aneh? ;-)
Trauma Digital
6
@DigitalTrauma tentu saja. Tetapi karena dunia belum siap ( tvtropes.org/pmwiki/pmwiki.php/Main/TheWorldIsNotReady ) untuk evolusi baru ini, saya akan kembali ke JavaScript
edc65
Keren, ini bekerja di Edge!
Arturo Torres Sánchez
Harus ... jangan ... klik ... tvtropes ...
RK.
14

Befunge -93, 196 218 byte

&00p12*v>>4>"---+",v v <
v*:*:*:<   | :-1,,,< #
>:*2/10p^  >"+",25*,10g|
     > #v^#         $< @
 25*,^  >4" |",,v ,*<>
v>"#",00g10g-00p 10g
 |`-1g01g00     <>48^
v>" ",10g
>2/10p>"| ",,1-:#^_$>^

Untuk menjalankan program ...

  1. Pergi ke penerjemah online .
  2. Rekatkan kode ini di kotak teks besar.
  3. Klik Show.
  4. Masukkan nomor yang diinginkan di dalam Inputkotak.
  5. Klik Run. (Atau ubah Slowmenjadi sekitar 5 milidetik lalu klik Show.)
  6. Ta-da!

Output untuk 4242:

+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+

Output untuk 33825:

+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Penjelasan

Ya ampun, apa yang sudah saya dapatkan? Baiklah, ini dia! (Kode yang tidak relevan diganti dengan .s.)

Bagian 1: Dapatkan input (simpan dalam 0,0) dan hitung 32768 (simpan dalam 1,0).

&00p12*v>
v*:*:*:< 
>:*2/10p^

Bagian 2: Cetak "+ --- + --- + --- + ---".

>4>"---+",v
  | :-1,,,<

Bagian 3: Cetak "+" dan baris baru dan periksa untuk melihat apakah (1,0) adalah 0 (yaitu kita selesai). Jika demikian, akhiri. Kalau tidak, lanjutkan.

 ........... v <
   | ....... # 
   >"+",25*,10g|
v.#         $< @
>4" |",,v ...

Bagian 4: Dapatkan digit input biner, perbarui (0,0) dan (1,0) saat kita melanjutkan. Cetak hal yang benar. Saya mengambil keuntungan dari perilaku Befunge.

 .....  >4" |",,v ,*<.
v>"#",00g10g-00p 10g
 |`-1g01g00     <>48^
v>" ",10g
>2/10p>"| ",,1-:#^_...

Bagian 5: Cetak baris baru dan kembali ke bagian yang mencetak "+ --- + --- + --- + --- +". Trik wrap-around digunakan.

     > #.^.         .. .
 25*,^  ......... ...>
................ ...
 .........      .....
........
.................._$>^

Ta-da!

El'endia Starman
sumber
10

Julia, 156 143 byte

n->(p=println;l="+"*"---+"^4;for i=1:4 p(l,"\n| ",join([j>"0"?"#":" "for j=reshape(split(lpad(bin(n),16,0),""),4,4)[:,i]]," | ")," |")end;p(l))

Tidak Terkumpul:

function f(n::Int)
    # Convert the input to binary, padded to 16 digits
    b = lpad(bin(n), 16, 0)

    # Split b into a 4x4 matrix
    m = reshape(split(b, ""), 4, 4)

    # Store the line separator for brevity
    l = "+" * "---+"^4

    # Print each column of the matrix as a row
    for i = 1:4
        println(l, "\n| ", join([j > "0" ? "#" : " " for j = m[:,i]], " | "), " |")
    end

    # Print the bottom of the table
    println(l)
end

Cobalah online

Alex A.
sumber
10

Python 2, 157 153 151 146 byte

J=''.join;R='+---'*4;i=format(input(),'016b')
print J(R+'+\n|'+J(' '+('#'if int(l)else' ')+' |'for l in i[n*4:-~n*4])+'\n'for n in range(4)),R+'+'

Terima kasih kepada Morgan Thrapp karena menyimpan 4 byte, dan kepada Jonathan Frech karena menyimpan 5.

Pemakaian

$ python test.py
33825
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
Zach Gates
sumber
Anda dapat menyimpan dua byte jika Anda menarik '+---'*4ke dalam variabel dan dua lagi jika Anda melakukannyaj=''.join
Morgan Thrapp
Tidak masalah! Saya sebenarnya sedang mengerjakan solusi yang sangat mirip.
Morgan Thrapp
@ downvoter Peduli menjelaskan?
Zach Gates
Karena Anda tidak menggunakan Python 3, Anda bisa mengganti int(input())dengan input()dan menyimpan lima byte.
Jonathan Frech
9

Ruby, 118 114

b="%016b"%gets
l=?++"---+"*4
1.upto(16){|i|puts l if i%4==1
print"| #{b[i-1]==?0?' ':?#} "
puts ?|if i%4<1}
puts l

terima kasih untuk @ w0lf untuk menyimpan beberapa karakter

Mhmd
sumber
1
Anda dapat menyimpan beberapa byte jika Anda menulis karakter literal menggunakan ?notasi (mis: ?|alih-alih '|'). Ini bekerja untuk semuanya kecuali ruang.
Cristian Lupascu
@ w0lf Saya telah menemukan bahwa ?\sberfungsi untuk ruang, namun sebenarnya tidak membantu di sini.
Mhmd
7

GNU sed + dc, 116

Skor termasuk +1 untuk -r bendera ke sed:

s/.*/dc -e2o&p/e
:
s/^.{,15}$/0&/;t
s/./| & /g
s/.{16}/\n+---+---+---+---+\n&|/g
y/01/ #/
s/\n([-+]+)(.*)/\1\2\n\1/

Output tes:

$ { echo 4242 ; echo 33825 ; } | sed -rf 16bitgrid.sed
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| # |   |   | # |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

Kalau tidak:

Sed murni, 146

Anda mungkin berpikir itu curang untuk menggunakan sedekstensi GNU untuk mengevaluasi suatu dcperintah. Dalam hal ini, kita dapat melakukan ini sedikit berbeda, menurut meta-jawaban ini . Tentu saja pertanyaannya dengan jelas menyatakan bahwa input harus ada di basis 10, tetapi di sini saya mencoba untuk mengklaim bahwa kita dapat menimpanya untuk sedjawaban dan menggunakan unary (basis 1) sebagai gantinya.

:
s/11/</g
s/<([ #]*)$/< \1/
s/1/#/
y/</1/
t
:a
s/^.{,15}$/0&/;ta
s/./| & /g
s/.{16}/\n+---+---+---+---+\n&|/g
y/01/ #/
s/\n([-+]+)(.*)/\1\2\n\1/

Uji keluaran

Menggunakan printfuntuk menghasilkan string unary yang diperlukan:

$ printf "%33825s" | tr ' ' 1 | sed -rf 16bitgrid.sed 
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 
Trauma Digital
sumber
Bagus Ini terlihat agak mirip dengan solusi Perl saya datang dengan sebagai bukti (pribadi) konsep sementara memperbaiki pertanyaan.
type_outcast
@type_outcast BTW, OK saja untuk mengirim solusi Anda sendiri sebagai jawaban :)
Digital Trauma
Saya tahu :-) Saya tidak menghabiskan banyak waktu bermain golf, karena saya lebih fokus pada mengajukan pertanyaan yang bagus, tetapi saya mungkin belum mengunjungi lagi dan mempostingnya jika saya bisa golf itu menjadi sesuatu yang setidaknya setengah terhormat. Saat ini aku terlalu senang mengoceh jawaban orang lain.
type_outcast
6

C ++ 11, 193 191 190 176 172 byte

Solusi pertama saya tentang codegolf, jadi jangan salahkan saya.

#include<iostream>
int n,j,i=65536;int main(){std::cin>>n;for(;j<9;){for(int k:{0,0,0,0})if(j%2)printf("| %s",n&(i/=2)?"# ":"  ");else printf("+---");puts(j++%2?"|":"+");}}

Tidak disatukan

#include <iostream>
int n, i = 65536, j;

int main()
{
    std::cin >> n;

    for (; j < 9;)
    {
        for(int k:{0,0,0,0})
        {
            if (j % 2)
            {
                printf("| %s", n & (i /= 2) ? "# " : "  ");
            }
            else
            {
                printf("+---");
            }
        }
        puts(j++ % 2 ? "|" : "+");
    }
}

Versi sebelumnya

#include <iostream>
using namespace std;

int n, i = 65536, j;
int main()
{
    cin >> n;

    for (; j < 9;)
    {
        for(int k:{0,0,0,0})
        {
            if (j % 2)
            {
                cout << "| " << (n & (i /= 2) ? "# " : "  ");
            }
            else
            {
                cout << "+---";
            }
        }
        cout << (j++ % 2 ? "|\n" : "+\n");
    }
}
Zereges
sumber
Petunjuk: 0x10000 adalah 65536, memiliki awalan '0x', hex selalu lebih panjang dari desimal
edc65
Petunjuk 2: Anda harus menghindari using namespace stddalam kode produksi. Dan itu juga tidak berguna di sini.
edc65
@ edc65 dec-> hex ide bagus, saya selalu berpikir hex memiliki representasi lebih pendek, tetapi lupakan 0x. using namespace stdmenghemat beberapa byte, karena saya tidak perlu awalan coutdan cindengan std::. Bahkan menggunakan hanya using std::cout;tidak akan membantu.
Zereges
Hai Zereges. Anda dapat menghapus ruang antara menyertakan dan perpustakaan .. dan menghapus jenis kembali untuk fungsi utama.
wendelbsilva
C++tidak mendukung int otomatis.
Zereges
6

Pyth, 37 byte

Jj*3\-*5\+JVc4_m@" #".>Qd16jd.i*5\|NJ

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

Jj*3\-*5\+J
  *3\-                       the string "---"
      *5\+                   the string "+++++"
 j                           join second by first string: 
                                "+---+---+---+---+"
J                            save in J
          J                  print J

Vc4_m@" #".>Qd16jd.i*5\|NJ
    m         16             map each d in [0, 1, ..., 15] to:
          .>Qd                 input number Q shifted to the right by d
     @" #"                     and take the ^th char in " #" (modulo 2)
   _                         reverse this list of chars
 c4                          split into 4 groups
V                            for each group N in ^:
                    *5\|       the string "|||||"
                  .i    N      interleave ^ with N
                jd             join chars with spaces and print
                         J     print J
Jakube
sumber
5

CJam, 43 41 byte

'+5*'-3**N+ri2bG0e[4/{" #"f='|5*.\S*N2$}/

Pasti golf, tapi saya rasa ini awal. Menghasilkan baris atas, kemudian untuk setiap 4 bit itu menciptakan baris genap dan menyalin baris aneh sebelumnya.

Cobalah online .

Sp3000
sumber
4

Python 2, 122 121 120 byte

n=bin(4**8+input())[3:]
i=0
exec"print'| %s |'%' | '.join(' #'[x>'0']for x in n[:4])*i or'+---'*4+'+';n=n[4*i:];i^=1;"*9

-1 byte terima kasih kepada @ xnor 4**8+trik yang rapi Pencetakan utama dilakukan dengan mengulang sebanyak 9 kali, memilih baris yang sesuai untuk odd / even.

Sp3000
sumber
Saya pikir itu bin(4**8+input())[3:]menyimpan byte lebihformat
xnor
@xnor Oh, itu rapi :)
Sp3000
4

Python 2, 94

n=input()
s=();exec"s=(' #'[n%2],)+s;n/=2;"*16
a='+---'*4+'+\n'
print(a+'| %s '*4+'|\n')*4%s+a

Idenya adalah untuk mengambil polanya

+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+
| _ | _ | _ | _ |
+---+---+---+---+

kecuali dengan %s di tempat kosong dan melakukan substitusi tuple. Tupelnya terlihat seperti

('#', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#')

Itu dibuat dengan mengambil digit dari input dalam biner dan menambahkan simbol yang sesuai ke depan tuple. Ekspresi dengan tuple eksplisit memberikan panjang yang sama.

%tuple(' #'[c>'0']for c in bin(input()+4**8)[3:])

Terima kasih kepada Sp3000 untuk 2 byte.

Tidak
sumber
4

PowerShell, 203 188 182 Bytes

param($a)$l="+---+---+---+---+";$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');@(1..16|%{if($b[$_-1]-eq'1'){"| # "}else{"|   "};if($_%4-eq0){"|`n$l`n"}})-join''

Edit - menyimpan 15 byte dengan mengubah urutan yang |digambar, sehingga kita dapat membuang .TrimEnd("|")output dan alih-alih mengonversi for-loop menjadi blok subcode yang menghasilkan array

Sunting2 - menyimpan 6 byte lain dengan menghilangkan kebutuhan untuk menyimpan ke dalam $ovariabel dan hanya keluaran dengan-join'' langsung.

Ooooooooof.

Menggambar di PowerShell sulit . Bekerja dengan digit biner di PowerShell sulit .

Menggunakan built-in ke [convert]integer input ke representasi string dalam biner, kemudian melemparkan kembali ke [int64]sehingga kita dapat menelepon kembali .ToString()untuk menambah / menambah jumlah nol yang sesuai. (Perhatikan bahwa membuat array string dan menggabungkannya @(,"0"*16)-join''adalah 1 karakter lebih pendek dari string literal"0000000000000000" )

Kemudian, ambil for-loop sederhana untuk 1..16|%{...}memeriksa setiap digit untuk membangun susunan keluaran kami, lalu akhirnya -join''kembali bersama.


Sebelumnya, 188

param($a)$l="+---+---+---+---+";$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');$o=@(1..16|%{if($b[$_-1]-eq'1'){"| # "}else{"|   "};if($_%4-eq0){"|`n$l`n"}});$o-join''

Sebelumnya-er, 203

param($a)$l="+---+---+---+---+`n|";$o=$l;$b=([int64][convert]::ToString($a,2)).ToString(@(,"0"*16)-join'');1..16|%{if($b[$_-1]-eq'1'){$o+=" # |"}else{$o+="   |"};if($_%4-eq0){$o+="`n$l"}};$o.TrimEnd('|')
AdmBorkBork
sumber
1
Saya harap itu "menyenangkan keras". :-) +1 untuk penjelasan Anda; itu membantu pemahaman saya yang terbatas tentang PowerShell.
type_outcast
3

Javascript (ES6), 216 207 byte

Menentukan fungsi anonim.

i=>(","+("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4<1?"| "+a.slice(l,l+4).map(v=>v?"#":" ").join` | `+" |":"").filter(v=>!!v).join`,`+",").replace(/,/g, `
+---+---+---+---+
`).slice(1)

Terima kasih kepada ETHproduk untuk tips!

adroit whiz
sumber
Kerja bagus! Karena Anda menggunakan ES6, berikut adalah beberapa tips: 1. Kapan pun Anda perlu menggunakan string sebagai satu-satunya parameter fungsi, Anda dapat menggunakan string template, seperti: .join` | `​2. Anda juga dapat menggunakan string template untuk nilai interpolasi: i=>`,${"0".repeat....join`,`},`.replace...3 Anda dapat menemukan lebih banyak tips ES6 di utas ini .
ETHproduksi
Ini tampaknya telah berhenti bekerja, tetapi dengan bermain golf sedikit lebih, saya bisa mendapatkan 197 dengan hasil yang benar:i=>`,${("0".repeat(16)+i.toString(2)).slice(-16).split``.map((v,l,a)=>l%4?"":"| "+a.slice(l,l+4).map(v=>' #'[v]).join` | `+" |").filter(v=>v).join`,`},`.replace(/,/g,`<line break>+---+---+---+---+<line break>`).slice(1)
ETHproduksi
2
("0".repeat(16)+i.toString(2)).slice(-16) ->(65536|i).toString(2).slice(1)
edc65
Menjaga logika Anda dengan tepat, ini dapat di-golf hingga 169, lihat jsfiddle.net/76fp7aw6
edc65
2

CJam, 62 byte

"+---|   "4/{4*_c+N+}%4*_0=]sqi2bG0e[ee{~{_9*\4%5*-K+'#t0}&;}/

Cobalah online .

Andrea Biondo
sumber
2

Pyth, 50 byte

j.i*5]<3*5"+---"ms.i*5\|dc4mj@" #"qd\1*2\ .[Z16.BQ

Penjelasan harus menunggu sampai waktu lain, saya memposting ini di ponsel saya!

Sok
sumber
2

Ruby, 102

n=gets.to_i
print j="+---"*4+"+
" 
19.downto(0){|i|print i%5>0?"| #{((n>>i*4/5)%2*3+32).chr} ":"|
"+j}

Algoritma

Cetak pembagi horizontal

Loop 20 kali (19..0)

Jika nomor loop tidak dibagi dengan 5, konversikan menjadi angka dalam kisaran 16..0 dengan mengalikannya dengan 4/5. Cetak spasi (ascii 32) atau #(ascii 32 + 3 = 35) didahului oleh| dan diikuti oleh spasi.

Jika nomor lingkaran dibagi 5, cetak penghentian |, baris baru, dan pembagi horizontal yang identik dengan yang pertama.

Level River St
sumber
2

Perl, 103 byte

$_=(($l='+---'x4 .'+
').'| x 'x4 .'|
')x4 .$l;@n=(sprintf'%016b',<>)=~/./g;s/x/$n[$x++]?'#':$"/eg;print

Banyak string pengulangan untuk membuat grid xs, mengkonversi input ke biner dan kemudian s///yang xs ke #atau $"( ) tergantung pada bendera pada posisi yang ditentukan ( $x).

Dom Hastings
sumber
2

PHP, 159 byte

bingrid16.php:

<?$r=10;while(--$r){if($r%2){echo str_repeat('+---',4).'+';}else{$c=9;echo'|';while(--$c){echo' '.($c%2?'|':($argv[1]&pow(2,$r*2+$c/2-5)?'#':' '));}}echo"\n";}

Pemakaian:

php bingrid16.php 4242

Tidak ada yang mewah, hanya memaksa rendering.

Saya mencoba sudut lain menggunakan array bukan loop, tetapi lebih panjang pada 224 byte:

<?=implode(array_map(function($r)use($argv){return($r%2?str_repeat('+---',4).'+':'|'.implode(array_map(function($c)use($r,$argv){return' '.($c%2?'|':($argv[1]&pow(2,$r*2+$c/2-5)?'#':' '));},range(8,1))))."\n";},range(9,1)));
kacang zam
sumber
2

Perl 5 , 85 84 byte

84 83 byte kode + -pbendera

-1 byte setelah Dom mengingatkan saya untuk menggunakan baris baru

say$\='+'."---+"x4,"
| ",map y/01/ #/r.' | ',/./g for(sprintf"%016b",$_)=~/..../g}{

Cobalah online!

Xcali
sumber
Bagus, pendekatan yang jauh lebih baik daripada milikku! Baris baru literal juga akan menghemat byte ekstra $/!
Dom Hastings
1

c99 263 byte

golf:

main(int argc,char **argv){short i=atoi(argv[argc-1]);char *t="| # ", *f="|   ",*a[16],**p=a,*b="+---+---+---+---+\r\n";while(p<a+16){if((i|0x8000)==i)(*(p++))=t;else(*(p++))=f;i<<=1;}for(p=a;p<a+16;p+=4)printf("%s%s%s%s%s|\n",b,*p,p[1],p[2],p[3]);printf("%s",b);}

ungolfed:

main(int argc, char **argv)
{
    short i=atoi(argv[argc -1]);
    char *t ="| # ", *f="|   ",*a[16],**p=a,*b="+---+---+---+---+\r\n";

    while (p<a+16)
    {
        if((i|32768)==i)
            (*(p++))=t;
        else
            (*(p++))=f;

        i<<=1;
    }

    for (p=a;p<a+16;p+=4)
        printf("%s%s%s%s%s|\n",b,*p,p[1],p[2],p[3]);
    printf("%s",b);
}

Saya hanya suka menghadirkan varian yang sedikit bergeser dan merasa ini adalah pertama kalinya yang sesuai (bahkan harganya beberapa byte, tapi C tidak dapat menantang dalam byte bahkan dengan kesempatan jadi saya tidak peduli) untuk menggunakan argc / argv

Zaibis
sumber
1

Ruby, 95

Mengangguk ke Mhmd untuk konversi String yang ringkas, tetapi saya ingin mencoba menggunakan metode string alih-alih metode angka.

->i{puts g='+---'*4+?+;("%016b"%i).scan(/.{4}/){puts$&.gsub(/./){"| #{$&<?1?' ':?#} "}+"|
"+g}}
Bukan itu Charles
sumber
1

Ruby, 93

Versi yang sedikit lebih pendek hanya menggunakan operasi numerik.

->i{n=g='+---'*4+"+
";15.downto(0){|m|n+="| #{[' ',?#][1&i>>m]} "
n+="|
"+g if m%4<1}
puts n}
Bukan itu Charles
sumber
1

C # 227 Bytes

Golf:

class B{public static string G(short v){string s="",b=System.Convert.ToString(v,2).PadLeft(16,'0');for(int i=9;i>0;){s+=i--%2!=0?"+---+---+---+---+\n":"| "+b[i*2+1]+" | "+b[i*2]+" | "+b[i*2-1]+" | "+b[i*2-2]+" |\n";}return s;}}

Lekuk:

class B
{
    public static string G(short v)
    {
        string s="",b=System.Convert.ToString(v, 2).PadLeft(16,'0');
        for(int i=9;i>0;)
            s+=i--%2!=0?"+---+---+---+---+\n":"| "+b[i*2+1]+" | "+b[i*2]+" | "+b[i*2-1]+" | "+b[i*2-2]+" |\n";
        return s;
    }
}

Pertama kali saya mencoba sesuatu seperti ini, tipsnya akan disambut baik!

anthonytimmers
sumber
Pertama, saya menghitung 286 byte dan Anda dapat menghapus ruang lekukan.
Biru
Bagaimana tepatnya Anda menghitungnya? Saya sudah pergi ke properti untuk melihat ukuran file di sana, tapi saya tidak yakin apakah itu cara untuk melakukannya! Tanpa lekukan saya turun ke 230 byte!
anthonytimmers
Gunakan sesuatu seperti mothereff.in/byte-counter , atau jika Anda menggunakan linux, gunakan wcperintah
Blue
1

Python 3, 145 144 Bytes

Di barisan:

a="|";b="+"+"---+"*4+"\n";r=0,1,2,3;(lambda x:print(b+b.join(a+a.join(" %s "%'# '[x&2**(i+j*4)<1]for i in r)+a+"\n"for j in r)+b))(int(input()))

Dengan baris baru:

a="|"
b="+"+"---+"*4+"\n"
r=0,1,2,3
lambda x:print(b+b.join(a+a.join(" %s "%'# '[x&2**(i+j*4)<1]for i in r)+a+"\n"for j in r)+b)
x(int(input()))

Sunting: Tanks @ manatwork untuk menghemat 1 byte

Bassintag
sumber
1
Berdasarkan gnibbler 's ujung , hardcoding r=0,1,2,3adalah 1 karakter lebih pendek daripada menghasilkan dengan r=range(4).
manatwork
0

Kotlin , 192 byte

{val v=it.toString(2).padStart(16,'0')
fun p(){(0..3).map{print("+---")}
println("+")}
(0..3).map{p()
v.subSequence(it*4,(it+1)*4).map{print("| ${if(it>'0')'#' else ' '} ")}
println("|")}
p()}

Yg diperindahkan

{
    val v = it.toString(2).padStart(16, '0')
    fun p() {
        (0..3).map { print("+---") }
        println("+")
    }
    (0..3).map {
        p()
        v.subSequence(it *4, (it +1) *4).map {print("| ${if (it > '0') '#' else ' '} ")}
        println("|")
    }
    p()
}

Uji

var b:(Int) -> Unit =
{val v=it.toString(2).padStart(16,'0')
fun p(){(0..3).map{print("+---")}
println("+")}
(0..3).map{p()
v.subSequence(it*4,(it+1)*4).map{print("| ${if(it>'0')'#' else ' '} ")}
println("|")}
p()}

fun main(args: Array<String>) {
    b(255)
}
jrtapsell
sumber