กริดไบนารี 16 บิต


29

กำหนดจำนวนเต็ม 16 บิตที่ไม่ได้ลงนามใด ๆ แปลงตัวเลขทศนิยม (เช่น base-10) เป็นตาราง 4x4 ASCII ของบิตโดยบิตที่สำคัญที่สุด (MSB) ที่มุมบนซ้ายบิตที่มีนัยสำคัญน้อยที่สุด (LSB) ที่ ด้านล่างขวาอ่านจากนั้นกดลง (เช่นข้อความภาษาอังกฤษ)

ตัวอย่าง

อินพุต: 4242

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

อินพุต: 33825

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

ข้อกำหนดเฉพาะ

  1. ข้อมูลที่ป้อนต้องเป็นทศนิยม (ฐาน -10) อย่างไรก็ตามคุณสามารถแปลงเป็นไบนารี่ได้ตามต้องการ (รวมถึงการใช้ภาษาในตัวหากมี)

  2. รูปแบบตารางการส่งออกจะต้องตรง เผง ซึ่งหมายความว่าคุณต้องใช้อักขระ ASCII ที่เฉพาะเจาะจง ( -, +และ|) สำหรับเส้นกริดของตารางดังที่แสดงภายในเซลล์แต่ละตัวคือ 3 อักขระและบิตที่แท้จริงจะถูกแทนด้วย#ขณะที่falseแสดงด้วยเว้นวรรค ( )

  3. ไม่อนุญาตช่องว่างนำหน้าหรือต่อท้าย ต้องขึ้นบรรทัดใหม่

  4. คำสั่งบิตจะต้องตรงกับตัวอย่างตามที่อธิบายไว้

ค่าเบี้ยเลี้ยง

  1. อินพุตต้องเป็นหมายเลขฐาน 10 บนบรรทัดคำสั่งอินพุตมาตรฐานหรืออินพุตผู้ใช้ แต่ต้องไม่ฮาร์ดโค้ดลงในซอร์สโค้ดของคุณ

อาจเป็นรหัสที่สั้นที่สุดที่ชัดเจนที่สุดชนะ! :-)



2
ประโยคแรกฟังดูสับสนสำหรับฉันที่มันบอกว่า "แปลงเป็นทศนิยม " ขึ้นอยู่กับส่วนที่เหลือของการโพสต์และตัวอย่างดูเหมือนว่าการป้อนข้อมูลจะได้รับในรูปแบบทศนิยม แต่คุณต้องแปลงรูปแบบไบนารีของค่าลงในตาราง
Reto Koradi

1
@RetoKoradi คุณถูกต้องเป็นหลัก แต่คำถามไม่จำเป็นต้องให้คุณสามารถแปลงทศนิยมจำนวนลงในตารางไบนารี ไม่มีข้อกำหนดที่ชัดเจนในการทำงานกับเลขฐานสองเพียงรายละเอียดการใช้งานที่เป็นไปได้เท่านั้น
type_outcast

การเขียนฟังก์ชั่นที่มีเลขฐาน 10 เป็นอาร์กิวเมนต์ของฟังก์ชั่นนับเป็นข้อมูลผู้ใช้หรือไม่?
Alex A.

2
เนื่องจากคุณบอกว่าตัวเลขที่กำหนดเป็น " จำนวนเต็ม16 บิตที่ไม่ได้ลงชื่อ" มันเป็นนิยามโดยในรูปแบบไบนารี เมื่อฉันอ่านครั้งแรกมันฟังดูเหมือนว่าอินพุตจะได้รับในรูปแบบไบนารี ทุกอย่างชัดเจนจนถึงที่สุด แต่อย่างน้อยสำหรับฉันย่อหน้าแรกไม่ได้จับปัญหาเลย
Reto Koradi

คำตอบ:


21

J, 26 ไบต์

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

กริยาที่ไม่ระบุชื่อ โชคดีที่เจวาดรูปกล่องได้ดีมาก ลองดูสิ:

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

ตามที่ผู้วิจารณ์บางคนได้กล่าวถึงวิธีการที่ J วาดกล่องขึ้นอยู่กับระบบ: ในบางแพลตฟอร์มรหัสนี้จะทำงานภายใต้การตั้งค่าเริ่มต้น แต่สำหรับคนอื่น ๆ กล่องจะถูกวาดโดยใช้อักขระวาดเส้น Unicode (คำสั่ง9!:6และ9!:7ช่วยให้คุณสามารถสอบถามและตั้งค่าตัวละครเพื่อวาดค่ากล่องด้วยตามลำดับ)


คุณ (หรือคนอื่น ๆ ) รู้หรือไม่ว่ามีความเห็นพ้องกันเกี่ยวกับคำสั่งการวาดกล่องสำหรับการให้คะแนนกอล์ฟหรือไม่? โดยส่วนตัวผมคิดว่าสมมติฐานของโค้ดกอล์ฟคือโซลูชันทำงานบนระบบส่วนใหญ่ที่ภาษาของโซลูชันทำงานใช่ไหม โซลูชันใดที่ดูเหมือนว่าจะให้กล่องที่ถูกต้องในการติดตั้ง J ทั้งหมด (หรือเกือบทั้งหมด) ฉันชอบทางออกของคุณจริงๆ ! สมองของฉันยังคงทำงานต่อไปซึ่งเป็นสิ่งที่ฉันชอบเกี่ยวกับการตีกอล์ฟ
type_outcast

5
@type_outcast เราไม่ต้องการความสะดวกในการพกพาสำหรับการแข่งขันกอล์ฟรหัส ตราบใดที่มันใช้ได้กับการดำเนินการบางอย่างบนแพลตฟอร์มเดียวก็ใช้ได้
เดนนิส

ขอบคุณสำหรับการตอบสนอง @Dennis ฉันมีความสุขข้อสันนิษฐานของฉันไม่ถูกต้องแล้วเพราะฉัน (ยัง) ชอบโซลูชั่นของ Mauris! :-)
type_outcast

14

JavaScript (ES6), 102

... หรือ 96 ใช้แทนreturnconsole.log

ทดสอบการเรียกใช้ตัวอย่างข้อมูลด้านล่างในเบราว์เซอร์ที่สอดคล้องกับ 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"บางตอบโต้กับผู้ใช้ได้จาวาสคริปต์ / หลามแปลก? ;-)
Digital Trauma

6
@ DigitalTrauma แน่นอน แต่เมื่อโลกยังไม่พร้อม ( tvtropes.org/pmwiki/pmwiki.php/Main/TheWorldIsNotReady ) สำหรับวิวัฒนาการใหม่นี้ฉันจะกลับไปใช้ JavaScript
edc65

เจ๋งใช้ได้กับ Edge!
Arturo Torres Sánchez

ต้อง ... ไม่ ... คลิก ... tvtropes ...
RK

14

Befunge -93, 196 218 bytes

&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-:#^_$>^

เพื่อรันโปรแกรม ...

  1. ไปที่ล่ามออนไลน์
  2. วางรหัสนี้ในกล่องข้อความขนาดใหญ่
  3. Showคลิก
  4. ใส่หมายเลขที่ต้องการลงในInputกล่อง
  5. Runคลิก (หรือเปลี่ยนSlowเป็นอย่างเช่น 5 มิลลิวินาทีแล้วคลิกShow)
  6. Ta-da!

เอาท์พุทสำหรับ 4242:

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

ผลลัพธ์สำหรับ 33825:

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

คำอธิบาย

โอ้พระเจ้าฉันได้อะไรเข้าไป? ไปเลย! (รหัสที่ไม่เกี่ยวข้องจะถูกแทนที่ด้วย.s.)

ส่วนที่ 1: รับอินพุต (เก็บใน 0,0) และคำนวณ 32768 (เก็บใน 1,0)

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

ส่วนที่ 2: พิมพ์ "+ --- + --- + --- +"

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

ส่วนที่ 3: พิมพ์ "+" และขึ้นบรรทัดใหม่และตรวจสอบเพื่อดูว่า (1,0) เป็น 0 (เช่นเราเสร็จแล้ว) ถ้าเป็นเช่นนั้นยุติ มิฉะนั้นดำเนินการต่อ

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

ตอนที่ 4: รับตัวเลขไบนารี่ของอินพุทอัปเดต (0,0) และ (1,0) ตามที่เราไป พิมพ์สิ่งที่ถูกต้อง ฉันใช้ประโยชน์จากพฤติกรรมรอบตัวของ Befunge

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

ส่วนที่ 5: พิมพ์บรรทัดใหม่และกลับไปที่ส่วนที่พิมพ์ "+ --- + --- + --- + --- +" ใช้เคล็ดลับการพันรอบ

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

Ta-da!


10

Julia, 156 143 bytes

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

Ungolfed:

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

ลองออนไลน์


10

Python 2, 157 153 151 146 bytes

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

ขอบคุณ Morgan Thrapp สำหรับการบันทึก 4 ไบต์และ Jonathan Frech สำหรับการบันทึก 5

การใช้

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

คุณสามารถบันทึกสองไบต์ถ้าคุณดึง'+---'*4ตัวแปรและอีกสองถ้าคุณทำj=''.join
Morgan Thrapp

ไม่มีปัญหา! จริง ๆ แล้วฉันกำลังทำงานกับโซลูชันที่คล้ายกันมาก
Morgan Thrapp

@downvoter สนใจที่จะอธิบาย?
Zach Gates

เนื่องจากคุณไม่ได้ใช้ Python 3 คุณสามารถแทนที่int(input())ด้วยinput()และบันทึกห้าไบต์
Jonathan Frech

9

ทับทิม, 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

ขอบคุณสำหรับ @ w0lf สำหรับการบันทึกอักขระบางตัว


1
คุณสามารถบันทึกบางไบต์ถ้าคุณเขียนตัวอักษรโดยใช้?สัญกรณ์ (เช่น: ?|แทน'|') ใช้ได้กับทุกสิ่งยกเว้นพื้นที่ว่าง
Cristian Lupascu

@ w0lf ฉันได้พบว่าใช้?\sงานได้กับพื้นที่ แต่มันไม่เป็นประโยชน์จริงที่นี่
Mhmd

7

GNU sed + dc, 116

คะแนนรวม +1 สำหรับ-rธงเพื่อ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/

ผลการทดสอบ:

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

อีกวิธีหนึ่งคือ:

sed บริสุทธิ์, 146

คุณอาจคิดว่ามันเป็นการโกงที่จะใช้sedส่วนขยาย GNU เพื่อประเมินdcคำสั่ง ในกรณีนี้เราสามารถทำสิ่งนี้แตกต่างกันเล็กน้อยตามmeta-answerนี้ แน่นอนคำถามที่ระบุอย่างชัดเจนว่าการป้อนข้อมูลจะต้องอยู่ในฐาน 10 แต่ที่นี่ฉันพยายามที่จะอ้างว่าเราสามารถแทนที่สำหรับsedคำตอบและใช้ unary (ฐาน 1) แทน

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

ทดสอบผลลัพธ์

การใช้printfเพื่อสร้างสตริง unary ที่จำเป็น:

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

ทำได้ดีนี่. ดูเหมือนว่าจะค่อนข้างคล้ายกับโซลูชัน Perl ที่ฉันคิดขึ้นมาเพื่อพิสูจน์แนวคิด (ส่วนตัว) ในขณะที่ปรับคำถาม
type_outcast

@type_outcast BTW อย่างสมบูรณ์ตกลงเพื่อโพสต์วิธีการแก้ปัญหาของคุณเองเป็นคำตอบ :)
ดิจิตอลบาดเจ็บ

ฉันรู้ว่า :-) ฉันไม่ได้ใช้เวลากับการเล่นกอล์ฟมากนักเพราะฉันให้ความสำคัญกับการตั้งคำถามที่ดีกว่า แต่ฉันยังอาจกลับมาทบทวนอีกครั้งและโพสต์ไว้ ในขณะนี้ฉันสนุกมากไปกับคำตอบของคนอื่น
type_outcast

6

C ++ 11, 193 191 190 176 172 ไบต์

ทางออกแรกของฉันเกี่ยวกับ codegolf ดังนั้นอย่าโทษฉัน

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

Ungolfed

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

รุ่นก่อนหน้า

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

คำแนะนำ: 0x10000 คือ 65536 โดยมีส่วนนำหน้า '0x' ฐานสิบหกจะยาวกว่าทศนิยมเสมอ
edc65

เคล็ดลับที่ 2: คุณควรหลีกเลี่ยงusing namespace stdในรหัสการผลิต และมันก็ไม่มีประโยชน์เหมือนกันที่นี่
edc65

@ edc65 dec-> ความคิดหกเหลี่ยมดีผมคิดเสมอว่าของฐานสิบหกมีตัวแทนสั้น 0xแต่ลืมเกี่ยวกับ using namespace stdช่วยประหยัดไม่กี่ไบต์เพราะผมไม่ได้มีคำนำหน้าcoutและมีcin std::แม้แต่การใช้ก็using std::cout;ไม่ช่วย
Zereges

เฮ้ Zereges คุณสามารถลบช่องว่างระหว่างการรวมและห้องสมุด .. และลบประเภทการคืนสำหรับฟังก์ชั่นหลัก
wendelbsilva

C++ไม่รองรับ auto int
Zereges

6

Pyth, 37 ไบต์

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

ลองออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

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 ไบต์

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

สามารถเล่นกอล์ฟได้อย่างแน่นอน แต่มันเป็นการเริ่มต้นที่ฉันเดา สร้างแถวบนสุดจากนั้นสำหรับแต่ละ 4 บิตจะสร้างแถวคู่และคัดลอกแถวคี่ก่อนหน้า

ลองมันออนไลน์


4

Python 2, 122 121 120 ไบต์

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 ไบต์ต้องขอบคุณ4**8+กลอุบายของ @ xnor การพิมพ์หลักทำได้โดยการวนซ้ำ 9 ครั้งโดยเลือกแถวที่เหมาะสมสำหรับคี่ / คู่


ผมคิดว่าbin(4**8+input())[3:]จะช่วยประหยัดไบต์เหนือformat
XNOR

@xnor โอ้เรียบร้อยแล้ว :)
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

ความคิดคือการใช้รูปแบบ

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

ยกเว้น%sในตำแหน่งที่ว่างและทำการทดแทน tuple สิ่งอันดับดูเหมือน

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

มันถูกสร้างขึ้นโดยการถอดตัวเลขจากอินพุตในไบนารี่และเพิ่มสัญลักษณ์ที่สอดคล้องกันที่ด้านหน้าของทูเปิล การแสดงออกที่มี tuple ชัดเจนให้ความยาวเท่ากัน

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

ขอบคุณ Sp3000 เป็นเวลา 2 ไบต์


4

PowerShell, 203 188 182 ไบต์

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

แก้ไข - บันทึก 15 ไบต์โดยการเปลี่ยนลำดับที่|วาดดังนั้นเราสามารถดัมพ์.TrimEnd("|")บนเอาต์พุตและแทนการแปลง for-loop เป็นบล็อกย่อยที่สร้างอาร์เรย์

Edit2 - บันทึกอีก 6 ไบต์โดยไม่จำเป็นต้องบันทึกลงใน$oตัวแปรและเพียงแค่ส่งออกด้วย-join''โดยตรง

Ooooooooof

การวาดภาพใน PowerShell เป็นอย่างหนัก การทำงานกับตัวเลขไบนารีใน PowerShell เป็นอย่างหนัก

ใช้บิวด์อินเพื่อ[convert]ป้อนค่าจำนวนเต็มไปยังการแทนค่าสตริงในรูปแบบไบนารี่จากนั้นนำกลับไปใช้[int64]อีกครั้งเพื่อให้เราสามารถเรียกใช้อีกครั้ง.ToString()เพื่อเพิ่ม / รองจำนวนศูนย์ที่เหมาะสม (โปรดทราบว่าการสร้างอาร์เรย์ของสตริงและการรวมเข้าด้วยกัน@(,"0"*16)-join''คือ 1 ตัวอักษรสั้นกว่าสตริงตัวอักษร"0000000000000000")

จากนั้นทำการ1..16|%{...}ตรวจสอบแต่ละวงอย่างง่าย ๆเพื่อสร้างอาร์เรย์เอาต์พุตของเราจากนั้นก็-join''กลับมารวมกันอีกครั้ง


ก่อนหน้านี้ 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''

ก่อนหน้านี้, 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
ฉันหวังว่ามันจะเป็น "สนุกมาก" :-) +1 สำหรับคำอธิบายของคุณ; มันช่วยให้ฉันเข้าใจ PowerShell ได้ จำกัด
type_outcast

3

Javascript (ES6), 216 207 ไบต์

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ

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)

ขอบคุณ ETHproductions สำหรับคำแนะนำ!


เยี่ยมมาก! เนื่องจากคุณใช้ ES6 ต่อไปนี้เป็นเคล็ดลับ: 1. เมื่อใดก็ตามที่คุณต้องการใช้สตริงเป็นพารามิเตอร์ตัวเดียวของฟังก์ชันคุณสามารถใช้แม่แบบสตริงได้ดังนี้: .join` | `​2. คุณยังสามารถใช้แม่แบบสตริงสำหรับค่าการแก้ไข: i=>`,${"0".repeat....join`,`},`.replace...3 คุณสามารถค้นหาเคล็ดลับ ES6 เพิ่มเติมในหัวข้อนี้
ETHproductions

สิ่งนี้ดูเหมือนว่าจะหยุดทำงาน แต่โดยการเล่นกอล์ฟอีกเล็กน้อยฉันสามารถรับ 197 กับผลลัพธ์ที่ถูกต้อง: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)
ETHproductions

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

การรักษาตรรกะที่แน่นอนของคุณนี้สามารถgolfed
edc65


2

Pyth, 50 ไบต์

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

คำอธิบายจะต้องรอจนกว่าจะถึงเวลาอื่นฉันโพสต์สิ่งนี้บนโทรศัพท์ของฉัน!


2

ทับทิม, 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}

ขั้นตอนวิธี

พิมพ์ตัวแบ่งแนวนอน

วนซ้ำ 20 ครั้ง (19..0)

ถ้าจำนวนลูปไม่หารด้วย 5 ให้แปลงเป็นตัวเลขในช่วง 16..0 โดยคูณด้วย 4/5 พิมพ์เว้นวรรค (ascii 32) หรือ#(ascii 32 + 3 = 35) นำหน้าด้วย|และตามด้วยช่องว่าง

หากจำนวนลูปหารด้วย 5 ให้พิมพ์ | ยุติ, ขึ้นบรรทัดใหม่และตัวแบ่งแนวนอนเหมือนกับครั้งแรก


2

Perl, 103 ไบต์

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

จำนวนมากของสตริงซ้ำที่จะทำให้ตารางของxs, แปลงป้อนข้อมูลเพื่อไบนารีและแล้วเพื่อหรือ( ) ขึ้นอยู่กับธงที่ตำแหน่งที่ระบุ ( )s///x#$"$x


2

PHP, 159 ไบต์

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

การใช้งาน:

php bingrid16.php 4242

ไม่มีอะไรแฟนซีเพียงแค่การเรนเดอร์ที่บังคับ

ฉันลองอีกมุมหนึ่งโดยใช้อาร์เรย์แทนที่จะวนซ้ำ แต่มันก็ยาวกว่า 224 ไบต์:

<?=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 ไบต์

84 83 ไบต์ของรหัส + -pธง

-1 ไบต์หลังจาก Dom เตือนให้ฉันใช้บรรทัดใหม่

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

ลองออนไลน์!


ดีมากดีกว่าของฉัน! ขึ้นบรรทัดใหม่ตัวอักษรจะช่วยให้คุณประหยัดไบต์พิเศษ$/เกินไป!
Dom Hastings

1

c99 263 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

ฉันแค่ชอบที่จะนำเสนอตัวแปรที่เปลี่ยนแปลงเล็กน้อยและรู้สึกว่านี่เป็นครั้งแรกที่เหมาะสม (แม้จะมีค่าใช้จ่ายฉันบางไบต์ แต่ C ไม่สามารถท้าให้เป็นไบต์ได้แม้จะมีโอกาสดังนั้นฉันจึงไม่สนใจ) เพื่อใช้ argc / argv


1

ทับทิม, 95

พยักหน้าให้ Mhmd สำหรับการแปลงสตริงที่รัดกุม แต่ฉันต้องการลองใช้วิธีการสตริงแทนวิธีการตัวเลข

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

1

ทับทิม, 93

รุ่นที่สั้นกว่าเล็กน้อยโดยใช้การดำเนินการตัวเลขเท่านั้น

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

1

C # 227 ไบต์

แข็งแรงเล่นกอล์ฟ:

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

ทำให้เว้า:

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

ครั้งแรกที่ฉันลองทำอะไรแบบนี้ยินดีต้อนรับเคล็ดลับ!


ประการแรกฉันนับ 286 ไบต์และคุณสามารถลบการเว้นวรรค
บลู

คุณนับมันได้อย่างไร ฉันได้ไปที่คุณสมบัติเพื่อดูขนาดไฟล์ที่นั่น แต่ฉันไม่แน่ใจว่าเป็นวิธีที่จะทำ! หากไม่มีการย่อหน้าฉันจะลดลงเหลือ 230 ไบต์!
anthonytimmers

ใช้บางอย่างเช่นmothereff.in/byte-counterหรือถ้าคุณใช้ linux ให้ใช้wcคำสั่ง
Blue

1

Python 3, 145 144 Bytes

แบบอินไลน์:

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

ด้วยการขึ้นบรรทัดใหม่:

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

แก้ไข: Tanks @ manatwork สำหรับการบันทึก 1 ไบต์


1
ขึ้นอยู่กับgnibbler 's ปลาย , hardcoding r=0,1,2,31 r=range(4)ตัวละครสั้นกว่าการสร้างมันด้วย
จัดการ

0

Kotlinขนาด 192 ไบต์

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

เชิดชู

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

ทดสอบ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.