Lưới nhị phân 16 bit


29

Với bất kỳ số nguyên 16 bit không dấu nào, hãy chuyển đổi dạng thập phân (ví dụ, số cơ sở 10) thành lưới 4 x 4 ASCII của bit, với bit có ý nghĩa nhất (MSB) ở phía trên bên trái, bit có ý nghĩa thấp nhất (LSB) tại dưới cùng bên phải, đọc qua và sau đó xuống (như văn bản tiếng Anh).

Ví dụ

Đầu vào: 4242

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

Đầu vào: 33825

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

Yêu cầu cụ thể

  1. Đầu vào phải ở dạng thập phân (cơ số 10), tuy nhiên bạn có thể chuyển đổi thành nhị phân theo bất kỳ cách nào bạn muốn (bao gồm sử dụng ngôn ngữ tích hợp, nếu có).

  2. Định dạng bảng đầu ra phải khớp chính xác . Điều này có nghĩa là bạn phải sử dụng các ký tự ASCII cụ thể ( -, +|) cho các đường lưới của bảng như được hiển thị, bên trong mỗi ô là 3 ký tự và các bit thực được biểu thị #trong khi false được biểu thị bằng khoảng trắng ( ).

  3. Khoảng trắng hàng đầu hoặc dấu là không được phép. Dòng mới cuối cùng là bắt buộc .

  4. Thứ tự bit phải phù hợp với các ví dụ như mô tả.

Phụ cấp

  1. Đầu vào phải là số cơ sở 10 trên dòng lệnh, đầu vào tiêu chuẩn hoặc đầu vào của người dùng, nhưng không được mã hóa cứng vào mã nguồn của bạn.

Có thể mã ngắn nhất rõ ràng nhất giành chiến thắng! :-)



2
Câu đầu tiên nghe có vẻ khó hiểu với tôi, trong đó nó nói "chuyển đổi dạng thập phân của nó ". Dựa trên phần còn lại của bài đăng và ví dụ, có vẻ như đầu vào được đưa ra ở dạng thập phân, nhưng bạn phải chuyển đổi dạng nhị phân của giá trị thành lưới.
Reto Koradi

1
@RetoKoradi bạn về cơ bản là chính xác, nhưng câu hỏi yêu cầu bạn chuyển đổi một số thập phân thành lưới nhị phân . Không có yêu cầu rõ ràng để từng làm việc với một số nhị phân, chỉ có một chi tiết thực hiện có khả năng.
typeDefcast

Việc viết một hàm với số cơ sở 10 làm đối số hàm được tính là đầu vào của người dùng?
Alex A.

2
Vì bạn nói rằng số đã cho là " số nguyên 16 bit không dấu ", nên theo định nghĩa ở dạng nhị phân. Khi tôi lần đầu tiên đọc nó, nó thực sự nghe có vẻ như đầu vào sẽ được đưa ra ở dạng nhị phân. Tất cả trở nên rõ ràng cho đến cuối cùng. Nhưng ít nhất với tôi, đoạn đầu tiên thực sự không nắm bắt được vấn đề.
Reto Koradi

Câu trả lời:


21

J, 26 byte

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

Một động từ ẩn danh. Rất may, J rất giỏi vẽ hộp. Hãy thử xem:

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

Như một số nhà bình luận đã đề cập, cách J vẽ các hộp phụ thuộc vào hệ thống: trên một số nền tảng, mã này sẽ hoạt động theo cài đặt mặc định, nhưng trên các nền tảng khác, các hộp sẽ được vẽ bằng các ký tự vẽ dòng Unicode. (Các lệnh 9!:69!:7 cho phép bạn truy vấn và đặt các ký tự để vẽ các giá trị được đóng hộp tương ứng.)


Bạn có (hoặc bất cứ ai khác) biết nếu có sự đồng thuận về lệnh vẽ hộp để ghi điểm golf không? Cá nhân tôi nghĩ rằng giả định với mã golf là các giải pháp hoạt động trên phần lớn các hệ thống mà ngôn ngữ của giải pháp chạy, phải không? Điều gì sẽ là một giải pháp trông giống như đầu ra các hộp chính xác trên tất cả (hoặc gần như tất cả) cài đặt J? Tôi thực sự thích giải pháp của bạn! Bộ não của tôi vẫn đang hoạt động theo cách của nó, đó chính xác là những gì tôi thích về môn đánh gôn.
typeDefcast

5
@typeDefcast Chúng tôi không yêu cầu tính di động đối với các thử thách chơi gôn. Miễn là nó hoạt động với một số triển khai trên một nền tảng, nó hợp lệ.
Dennis

Cảm ơn bạn đã phản hồi @Dennis. Tôi rất vui vì suy đoán của tôi là không chính xác, vì tôi thực sự thích giải pháp của Mauris! :-)
typeDefcast

14

JavaScript (ES6), 102

... Hoặc 96 sử dụng returnthay vì console.log.

Kiểm tra chạy đoạn mã dưới đây trong trình duyệt tuân thủ 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>


6
"JavaScripy" một số mashup javascript / python lạ? ;-)
Chấn thương kỹ thuật số

6
@DigitalTrauma tất nhiên. Nhưng vì thế giới chưa sẵn sàng ( tvtropes.org/pmwiki/pmwiki.php/Main/TheWorldIsNotReady ) cho sự phát triển mới này, tôi sẽ trở lại JavaScript
edc65

Thật tuyệt, điều này hoạt động trên Edge!
Arturo Torres Sánchez

Phải ... không ... nhấp ... 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-:#^_$>^

Để chạy chương trình ...

  1. Đi đến phiên dịch trực tuyến .
  2. Dán mã này vào hộp văn bản lớn.
  3. Nhấn vào đây Show.
  4. Nhập số mong muốn trong Inputhộp.
  5. Nhấn vào đây Run. (Hoặc thay đổi Slowthành thứ gì đó như 5 mili giây rồi bấm Show.)
  6. Ta-da!

Đầu ra cho 4242:

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

Đầu ra cho 33825:

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

Giải trình

Ôi trời, tôi đã có được những gì? Thôi, đi đây! (Mã không liên quan được thay thế bằng .s.)

Phần 1: Nhận đầu vào (lưu trữ trong 0,0) và tính 32768 (lưu trữ trong 1,0).

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

Phần 2: In ra "+ --- + --- + --- + ---".

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

Phần 3: In "+" và một dòng mới và kiểm tra xem (1,0) có phải là 0 (tức là chúng ta đã hoàn thành). Nếu vậy, chấm dứt. Nếu không, tiếp tục.

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

Phần 4: Nhận các chữ số nhị phân của đầu vào, cập nhật (0,0) và (1,0) khi chúng ta đi cùng. In những điều đúng. Tôi lợi dụng hành vi bao bọc của Befunge.

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

Phần 5: In một dòng mới và quay lại phần in "+ --- + --- + --- + --- +". Thủ thuật quấn quanh được sử dụng.

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

Ta-da!


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

Ung dung:

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

Dùng thử trực tuyến


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+'+'

Cảm ơn Morgan Thrapp vì đã lưu 4 byte và Jonathan Frech đã lưu 5.

Sử dụng

$ python test.py
33825
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+

Bạn có thể lưu hai byte nếu bạn kéo '+---'*4vào một biến và hai byte nữa nếu bạn thực hiệnj=''.join
Morgan Thrapp

Không vấn đề gì! Tôi đã thực sự làm việc trên một giải pháp rất giống nhau.
Morgan Thrapp

@downvoter Muốn giải thích?
Zach Gates

Kể từ khi bạn không sử dụng Python 3, bạn có thể thay thế int(input())với input()và lưu lăm 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

cảm ơn vì @ w0lf vì đã lưu một số ký tự.


1
Bạn có thể lưu một số byte nếu bạn viết các ký tự bằng chữ bằng cách sử dụng ?ký hiệu (ví dụ: ?|thay vì '|'). Điều này làm việc cho tất cả mọi thứ trừ không gian.
Cristian Lupascu

@ w0lf Tôi thấy rằng nó ?\shoạt động cho không gian, tuy nhiên nó không thực sự hữu ích ở đây.
Mhmd

7

GNU sed + dc, 116

Điểm bao gồm +1 cho các -rcờ để 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/

Đầu ra thử nghiệm:

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

Cách khác:

Sed tinh khiết, 146

Bạn có thể nghĩ rằng việc gian lận sử dụng sedphần mở rộng GNU của mình để tránh dclệnh. Trong trường hợp đó, chúng ta có thể làm điều này một chút khác nhau, theo câu trả lời meta này . Tất nhiên câu hỏi nêu rõ rằng đầu vào phải ở cơ sở 10, nhưng ở đây tôi đang cố gắng tuyên bố rằng chúng ta có thể ghi đè lên đó để sedtrả lời và sử dụng unary (cơ sở 1) thay thế.

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

Đầu ra thử nghiệm

Sử dụng printfđể tạo chuỗi unary cần thiết:

$ printf "%33825s" | tr ' ' 1 | sed -rf 16bitgrid.sed 
+---+---+---+---+
| # |   |   |   |
+---+---+---+---+
|   | # |   |   |
+---+---+---+---+
|   |   | # |   |
+---+---+---+---+
|   |   |   | # |
+---+---+---+---+
$ 

Đẹp một. Điều này có vẻ hơi giống với giải pháp Perl mà tôi đã đưa ra như một bằng chứng (riêng tư) về khái niệm trong khi điều chỉnh câu hỏi.
typeDefcast

@typeDefcast BTW hoàn toàn ổn để đăng giải pháp của riêng bạn dưới dạng câu trả lời :)
Chấn thương kỹ thuật số

Tôi biết :-) Tôi đã không dành nhiều thời gian để chơi nó, vì tôi tập trung hơn vào việc đưa ra một câu hỏi hay, nhưng tôi vẫn có thể xem lại và đăng nó nếu tôi có thể chơi golf thành một thứ gì đó ít nhất là nửa chừng. Hiện tại tôi đang có quá nhiều niềm vui để mò mẫm câu trả lời của người khác.
typeDefcast

6

C ++ 11, 193 191 190 176 172 byte

Giải pháp đầu tiên của tôi về codegolf từ trước đến giờ, vì vậy đừng đổ lỗi cho tôi.

#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?"|":"+");}}

Bị đánh cắp

#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 ? "|" : "+");
    }
}

Phiên bản trước

#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");
    }
}

Gợi ý: 0x10000 là 65536, có tiền tố '0x', hex luôn dài hơn số thập phân
edc65

Gợi ý 2: bạn nên tránh using namespace stdtrong mã sản xuất. Và nó cũng không hữu ích ở đây.
edc65

@ edc65 dec-> hex ý tưởng tốt, tôi luôn nghĩ rằng hex có đại diện ngắn hơn, nhưng quên đi 0x. using namespace stdtiết kiệm vài byte, bởi vì tôi không phải tiền tố coutcinvới std::. Ngay cả việc sử dụng chỉ using std::cout;không giúp đỡ.
Zereges

Này Zereges. Bạn có thể xóa khoảng trắng giữa bao gồm và thư viện .. và loại bỏ kiểu trả về cho hàm chính.
wendelbsilva

C++không hỗ trợ tự động int.
Zereges

6

Bình thường, 37 byte

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

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

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

5

CJam, 43 41 byte

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

Tôi chắc chắn có thể chơi gôn, nhưng đó là một khởi đầu tôi đoán. Tạo hàng trên cùng, sau đó với mỗi 4 bit, nó tạo một hàng chẵn và sao chép hàng lẻ trước đó.

Hãy thử trực tuyến .


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 nhờ 4**8+thủ thuật gọn gàng của @ xnor . Việc in chính được thực hiện bằng cách lặp 9 lần, chọn hàng thích hợp cho số lẻ / chẵn.


Tôi nghĩ rằng sẽ bin(4**8+input())[3:]tiết kiệm một byte hơnformat
xnor

@xnor Ồ, thật gọn gàng :)
Sp3000

4

Con trăn 2, 94

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

Ý tưởng là lấy mẫu

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

ngoại trừ %sthay cho chỗ trống và thực hiện thay thế tuple. Các tuple trông giống như

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

Nó được tạo ra bằng cách lấy các chữ số từ đầu vào nhị phân và thêm ký hiệu tương ứng vào phía trước của bộ dữ liệu. Một biểu thức với bộ dữ liệu rõ ràng cho chiều dài bằng nhau.

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

Cảm ơn Sp3000 cho 2 byte.


4

PowerShell, 203 188 182 byte

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

Chỉnh sửa - đã lưu 15 byte bằng cách thay đổi thứ tự |được vẽ, vì vậy chúng ta có thể kết .TrimEnd("|")xuất đầu ra và thay vào đó chuyển đổi vòng lặp for thành một khối mã con tạo ra một mảng

Edit2 - đã lưu 6 byte khác bằng cách loại bỏ nhu cầu lưu vào $obiến và chỉ xuất ra với-join'' trực tiếp.

Ôi trời ơi.

Vẽ trong PowerShell là khó . Làm việc với các chữ số nhị phân trong PowerShell là khó .

Sử dụng tích hợp cho [convert]số nguyên đầu vào thành biểu diễn chuỗi ở dạng nhị phân, sau đó truyền lại thành một [int64]để chúng ta có thể gọi .ToString()lại để thêm / đệm số lượng 0 thích hợp. (Lưu ý rằng tạo một chuỗi các chuỗi và nối chúng@(,"0"*16)-join'' ngắn hơn 1 ký tự so với chuỗi ký tự "0000000000000000")

Sau đó, thực hiện 1..16|%{...}kiểm tra vòng lặp đơn giản cho từng chữ số để xây dựng mảng đầu ra của chúng tôi, cuối cùng-join'' kết hợp lại với nhau.


Trước đó, 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''

Trước đó, 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('|')

1
Tôi hy vọng nó là một "niềm vui khó khăn". :-) +1 cho lời giải thích của bạn; nó giúp tôi hiểu biết hạn chế về PowerShell.
typeDefcast

3

Javascript (ES6), 216 207 byte

Xác định một hàm ẩn danh.

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)

Cảm ơn ETHproductions cho lời khuyên!


Công việc tốt đẹp! Vì bạn đang sử dụng ES6, đây là một vài mẹo: 1. Bất cứ khi nào bạn cần sử dụng chuỗi làm tham số duy nhất của hàm, bạn có thể sử dụng chuỗi mẫu, như vậy: .join` | `​2. Bạn cũng có thể sử dụng chuỗi mẫu để nội suy các giá trị: i=>`,${"0".repeat....join`,`},`.replace...3 Bạn có thể tìm thấy nhiều mẹo ES6 hơn về chủ đề này .
Sản xuất ETH

Điều này dường như đã ngừng hoạt động, nhưng bằng cách chơi golf nhiều hơn một chút, tôi có thể nhận được 197 với kết quả chính xác: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)
Sản phẩm ETH

2
("0".repeat(16)+i.toString(2)).slice(-16) ->(65536|i).toString(2).slice(1)
edc65

Giữ logic chính xác của bạn, điều này có thể được chơi thành 169, xem jsfiddle.net/76fp7aw6
edc65


2

Bình thường, 50 byte

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

Giải thích sẽ phải đợi đến một lần khác, tôi sẽ đăng bài này trên điện thoại của mình!


2

Hồng ngọc, 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}

Thuật toán

In một dải phân cách ngang

Lặp lại 20 lần (19..0)

Nếu số vòng lặp không chia cho 5, hãy chuyển đổi thành một số trong phạm vi 16..0 bằng cách nhân với 4/5. In một khoảng trắng (ascii 32) hoặc #(ascii 32 + 3 = 35) trước| và theo sau là khoảng trắng.

Nếu số vòng lặp chia cho 5, hãy in một kết thúc |, dòng mới và một bộ chia ngang giống hệt với đầu tiên.


2

Perl, 103 byte

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

Rất nhiều chuỗi lặp lại để tạo ra một mạng lưới các xs, chuyển đổi các đầu vào nhị phân và sau đó s///các xs #hoặc $"( ) tùy thuộc vào lá cờ ở vị trí quy định ( $x).


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";}

Sử dụng:

php bingrid16.php 4242

Không có gì lạ mắt, chỉ cần vũ phu buộc kết xuất.

Tôi đã thử một góc khác bằng cách sử dụng các mảng thay vì các vòng lặp, nhưng nó dài hơn ở mức 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)));

2

Perl 5 , 85 84 byte

84 83 byte mã + -pcờ

-1 byte sau khi Dom nhắc tôi sử dụng một dòng mới

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

Hãy thử trực tuyến!


Đẹp, cách tiếp cận tốt hơn nhiều so với của tôi! Một dòng mới theo nghĩa đen sẽ giúp bạn tiết kiệm thêm một byte $/!
Dom Hastings

1

c99 263 byte

đánh gôn

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);}

vô dụng:

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);
}

Tôi chỉ thích trình bày một biến thể dịch chuyển một chút và cảm thấy đây là lần đầu tiên nó phù hợp (thậm chí nó làm tôi tốn một số byte, nhưng C không thể sử dụng byte này ngay cả khi có cơ hội nên tôi không quan tâm) sử dụng argc / argv


1

Hồng ngọc, 95

Nod sang Mhmd để chuyển đổi Chuỗi ngắn gọn, nhưng tôi muốn thử sử dụng các phương thức chuỗi thay vì phương thức số.

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

1

Ruby, 93

Một phiên bản ngắn hơn một chút chỉ sử dụng các hoạt động số.

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

1

C # 227 byte

Chơi gôn

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

Chỉ định:

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

Lần đầu tiên tôi đang thử một cái gì đó như thế này, lời khuyên sẽ được chào đón!


Đầu tiên, tôi đếm 286 byte và bạn có thể loại bỏ khoảng trắng thụt.
Màu xanh

Làm thế nào chính xác để bạn đếm nó? Tôi đã đi đến các thuộc tính để xem kích thước tệp ở đó, nhưng tôi không chắc đó có phải là cách để làm điều đó không! Không có thụt đầu dòng, tôi đã xuống tới 230 byte!
anthonytimmer

Sử dụng một cái gì đó như Mothereff.in/byte-corer hoặc nếu bạn đang dùng linux, hãy sử dụng wclệnh
Blue

1

Python 3, 145 144 byte

Nội tuyến:

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

Với dòng mới:

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

Chỉnh sửa: Tanks @manatwork để lưu 1 byte


1
Dựa trên gnibbler 's tip , hardcoding r=0,1,2,3là 1 nhân vật ngắn hơn tạo ra nó với 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()}

Làm đẹp

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

Kiểm tra

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.