สร้างกล่อง!


19

งานของคุณคือการสร้างกล่องโดยใช้อักขระ ASCII ใดก็ได้ที่เกี่ยวข้องกับอินพุตที่กำหนด

กรณีทดสอบ

1 1   --> =====
          =   =
          =====

1 2   --> =========
          =   =   =
          =========

2 1   --> =====
          =   =
          =====
          =   =
          =====

2 2   --> =========
          =   =   =
          =========
          =   =   =
          =========

2 5   --> =====================
          =   =   =   =   =   =
          =====================
          =   =   =   =   =   =
          =====================

อินพุต

  • อินพุตสามารถนำมาจากหนึ่งในสิ่งต่อไปนี้

    • stdin
    • อาร์กิวเมนต์บรรทัดคำสั่ง
    • ข้อโต้แย้งฟังก์ชั่น (2 ข้อโต้แย้งหนึ่งข้อสำหรับแต่ละหมายเลข)
  • อินพุตถ้านำมาจากstdinหรืออาร์กิวเมนต์บรรทัดคำสั่งจะมีจำนวนเต็มบวกสองตัวคั่นด้วยช่องว่าง

  • ตัวเลขสองจำนวนแสดงถึงจำนวนกล่องในแต่ละคอลัมน์และแถว

เอาท์พุต

  • กล่องจะต้องแสดงผลในstdout(หรือเทียบเท่าที่ใกล้เคียงที่สุด)
  • แต่ละกล่องควรมีช่องว่างแนวนอนสามช่อง

กฎระเบียบ

  • ทั้งตัวเลขจะมากกว่า 0 แต่จะไม่เกิน 1,000
  • สามารถใช้อักขระใด ๆ ที่มองเห็นได้สำหรับการแสดงผลกล่อง (ตราบใดที่ตาไม่รุนแรงเกินไป!)
  • คุณได้รับอนุญาตให้เขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น
  • ไม่ควรมีอักขระที่ไม่จำเป็นยกเว้นอักขระขึ้นบรรทัดใหม่ที่ต่อท้าย

เกณฑ์การให้คะแนน

นี่คือดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) ชนะ

คำตอบ:



10

เรติน่า , 57 ไบต์

1(?=.* (1*))
$1#$1#


1(?=(1*#1*#)*$)
=   
1
====
#
=#

รับอินพุตพร้อมกับขึ้นบรรทัดใหม่

แต่ละบรรทัดควรไปที่ไฟล์ของตนเองและ#ควรเปลี่ยนเป็นบรรทัดใหม่ในไฟล์ สิ่งนี้ไม่สามารถใช้งานได้ แต่คุณสามารถเรียกใช้รหัสได้เช่นเดียวกับไฟล์ที่มี-sแฟล็กโดยเก็บ#เครื่องหมาย (และเปลี่ยนบรรทัดใหม่ต่อท้าย#เป็นอินพุต) คุณสามารถเปลี่ยน#กลับเป็นบรรทัดใหม่ในผลลัพธ์เพื่อให้สามารถอ่านได้ถ้าคุณต้องการ เช่น:

> echo -n 11 111#|retina -s boxes|tr # '\n'
=============
=   =   =   =
=============
=   =   =   =
=============

วิธีการ: 5 ขั้นตอนการทดแทนเดียว สองครั้งแรก (4 บรรทัดแรก) สร้าง2*N+1โดยMกริดของคนและอีก 3 ขั้นตอน (6 บรรทัด) จัดรูปแบบมันเป็นเอาท์พุทที่ต้องการ

สตริงกลาง (คั่นด้วย-'s):

11 111
------------------
111
111
111
111
 111
------------------
111
111
111
111
111
------------------
111
=   =   =   
111
=   =   =   
111
------------------
============
=   =   =   
============
=   =   =   
============
------------------
=============
=   =   =   =
=============
=   =   =   =
=============

หนึ่งไฟล์ต่อบรรทัดดูเหมือนจะเป็นตัวเลือกที่แปลกมาก
อยากรู้อยากเห็น dannii

1
@curiousdannii มันถูกสร้างขึ้นมาด้วยวิธีนี้ดังนั้นอักขระบรรทัดใหม่จะสามารถใช้งานได้ในการแสดงออกของ regex โดยไม่ต้องหลบหนี แต่มีการวางแผนที่จะเปลี่ยนเป็นรูปแบบ 1 ไฟล์ที่สมเหตุสมผลมากขึ้น
Randomra

8

JavaScript ( ES6 ), 83

ฟังก์ชั่นที่มีแถวพารามิเตอร์และคอลัมน์ การใช้สตริงเท็มเพลตมีการขึ้นบรรทัดใหม่ 2 ตัวที่สำคัญและนับ

ส่งออกผ่านทางalert(ป๊อปอัพ) ขณะที่การใช้ตัวอักษรสัดส่วนที่เราได้รับผลดีกว่าการใช้ตัวอักษรที่มีความกว้างคล้ายกับพื้นที่แทนalert=

ทดสอบใน Firefox โดยใช้คอนโซลเพื่อให้ได้alertผลลัพธ์จริงหรือเรียกใช้ตัวอย่างด้านล่าง

f=(r,c)=>{for(x=y="|";c--;)x+="||||",y+="   |";for(o=x;r--;)o+=`
${y}
`+x;alert(o)}

// TEST

// redefine alert to avoid that annoying popup during test
alert=x=>O.innerHTML=x

test=_=>([a,b]=I.value.match(/\d+/g),f(a,b))

test()
<input id=I value='2 3'><button onclick="test()">-></button>
<pre id=O></pre>


ข้อมูลโค้ดสำหรับเรียกใช้ไม่ทำงานสำหรับฉันเพียงเห็นกล่องที่มี '2 3' อยู่ภายในและลูกศรที่ดูเหมือนว่าจะแนะนำให้คุณคลิกเพื่อรับผล การใช้ปุ่มเต็มหน้าหรือลองใช้เบราว์เซอร์อื่นจะไม่เปลี่ยนแปลงสิ่งใด
Dennis Jaheruddin

@DennisJaheruddin เกิดขึ้นกับฉันเมื่อใช้โครเมียม (ไม่รองรับ ES6) ลอง Firefox
Spikatrix

1
@DennisJaheruddinTest in Firefox
edc65

7

JavaScript (ES6), 75 73

ใช้การrepeatโทรจำนวนมากเราทำซ้ำ|จากนั้นทำซ้ำ|กับช่องว่างต่อท้ายและทำซ้ำทั้งสองซ้ำเพื่อสร้างแถว:

f=(y,x)=>alert(((s="|"[r="repeat"](x*4)+`|
`)+"|   "[r](x)+`|
`)[r](y)+s)

(การขึ้นบรรทัดใหม่มีความสำคัญต่อข้อเสนอแนะของ edc65 ในการใช้สตริงแม่แบบ)

ตัวอย่างข้อมูล:

<input id="x" type="range" max="10" min="1" step="1" value="3"><input id="y" type="range" max="10" min="1" step="1" value="2"><pre id="o"></pre><script>function f(y,x){return ((s="|"[r="repeat"](x*4)+"|\n")+"|   "[r](x)+"|\n")[r](y)+s};function redraw(){document.getElementById("o").innerHTML=f(document.getElementById("y").value,document.getElementById("x").value)};document.getElementById("x").onchange=redraw;document.getElementById("y").onchange=redraw;document.getElementById("x").oninput=redraw;document.getElementById("y").oninput=redraw;redraw();</script>

ไม่มีสตริงเท็มเพลตโดยไม่มีการใช้ชื่อเมธอดและเพิ่มช่องว่าง:

f=(y,x)=>alert(
    (
      (s="|".repeat(x*4)+"|\n") + 
      "|   ".repeat(x)+"|\n"
    ).repeat(y)+s
)

(ใช้การแนะนำของ edc65เพื่อใช้|สำหรับการเว้นวรรคที่มองเห็นได้ดีขึ้น)


7

Pip, 29 24 = 23 + 1 ไบต์

ต้องใช้-nธง รับความสูงและความกว้างเป็นบรรทัดคำสั่ง args และสร้าง box ของ1s

([1X4m]XbRLa+1)@<v.1R0s

คำอธิบาย:

                         a,b are cmdline args; m is 1000; v is -1; s is " " (implicit)
 [1X4m]                  List containing 1111 and 1000
       Xb                String repetition of each element b times
         RLa+1           Repeat the list a+1 times
(             )@<v       Now we have one row too many at the end, so take everything
                         but the last item (equiv to Python x[:-1])
                  .1     Concatenate a 1 to the end of each row
                    R0s  Replace 0 with space
                         Print, joining list on newlines (implicit, -n flag)

โปรแกรมนี้ใช้ประโยชน์อย่างมากจากข้อเท็จจริงที่ว่าสตริงเป็นตัวเลขและตัวเลขเป็นสตริงใน Pip (และช่องว่างทั้งสามในกล่องเหล่านั้นเกิดขึ้นเพื่อใช้ประโยชน์จากmตัวแปรในตัว!)

นี่คือวิธีการสร้างรายการด้วยอินพุต2 3:

[1111;1000]
[111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111]
[1111111111111;1000100010001;1111111111111;1000100010001;1111111111111]
[1111111111111;"1   1   1   1";1111111111111;"1   1   1   1";1111111111111]

และผลลัพธ์สุดท้าย:

C:\> pip.py 2 3 -ne "([1X4m]XbRLa+1)@<v.1R0s"
1111111111111
1   1   1   1
1111111111111
1   1   1   1
1111111111111

เพิ่มเติมเกี่ยวกับ Pip


6

Perl, 72 63 52 50 ไบต์

เวอร์ชันที่สั้นที่สุดของฉันยังใช้$/เพื่อรับอักขระขึ้นบรรทัดใหม่ที่กะทัดรัดกว่า:

$ perl -e 'print((($,="="."   ="x pop.$/)=~s/./=/gr)x(1+pop))' 2 5
=====================
=   =   =   =   =   =
=====================
=   =   =   =   =   =
=====================

การอัพเดตก่อนหน้านี้วางบรรทัดว่างเปล่าส่วนใหญ่ในตัวแยกเร็กคอร์ดเอาท์พุท$,และพิมพ์รายการของบรรทัดต่อเนื่อง

$ perl -e 'print((($,="="."   ="x pop."\n")=~s/./=/gr)x(1+pop))' 2 5

รุ่นก่อนหน้าอาจชัดเจนขึ้นเล็กน้อยสำหรับผู้อ่านทั่วไป

$ perl -E 'say($y=($x="="."   ="x pop)=~s/./=/gr);for(1..pop){say$x;say$y}' 2 5

รุ่นแรกที่ใช้@ARGVแทนpop:

$ perl -E 'say($y=($x="="."   ="x$ARGV[1])=~s/./=/gr);for(1..$ARGV[0]){say$x;say$y}' 2 5


5

GNU sed -r, 160

เฮ้อฉันคิดว่ามันจะเล็กกว่านี้ ขออภัย regexes sed ไม่มีความสามารถในการค้นหาใด ๆ

:
s/(.*)1$/   =\1/;t
s/([= ]+)/\1\n\1/
:b
s/   (.*\n)/===\1/;tb
s/(1*)1 $/\n\1/
:c
s/([^\n]*\n[^\n]*\n)(1*)1$/\1\1\2/;tc
s/(=+)(.*)/\1\2\1/
s/(^|\n)(.)/\1=\2/g

การป้อนข้อมูลเป็นเอกภาพจาก STDIN:

$ sed -rf boxes.sed <<< "11 111"
=============
=   =   =   =
=============
=   =   =   =
=============
$

4

CJam, 25 ไบต์

q~)S3*'=5*+4/f*3f>\)*1>N*

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

q~                        e# Read H and W from STDIN.
   S3*'=5*+               e# Push "   =====".
           4/             e# Chop into ["   =" "===="].
  )          f*           e# Repeat each string W+1 times.
               3f>        e# Cut off the first three characters.
                  \)*     e# Repeat the resulting array H+1 times.
                     1>   e# Remove the first string.
                       N* e# Join the lines.

4

Marbelous, 168 ไบต์

คำตอบนี้ใช้ได้เพียง 255x255 ไม่ใช่ 1000x1000 เนื่องจากข้อ จำกัด ของภาษา Marbelous ฉันกำลังทำงานกับห้องสมุด 32- บิต แต่มันจะไม่พร้อมเวลาใด ๆ ในไม่ช้า

อินพุตมีไว้เป็นพารามิเตอร์บรรทัดคำสั่งสองตัวหรือพารามิเตอร์ฟังก์ชั่นไปยังกระดานหลัก

@2@3}1@0
SLEL//>0\/
@3@1}0--
}1&0@0/\&0
@1/\@2}1\/
:SL
..}0@0
&0/\>0&0
EN..--\/
{0@0/\ES
:EL
..@0
..>0EN
}0--\/
@0/\EX
:EX
}0
\/3D3D3D3D
:ES
}0
\/3D202020
:EN
}0
{03D0A

pseudocode:

MB(H,W):
    EL(W)
    for 1..H:
        SL(W)
        EL(W)
EL(W):
    for 1..W:
        EX()
    EN()
SL(W):
    for 1..W:
        ES()
    EN()
EX():
    print "===="
ES():
    print "=   "
EN():
    print "=\n"

3

CJam 52 51 46 41 ไบต์

l~:B;:A;'=:U{{U4*}B*N}:V~{U{SZ*U}B*NUV}A*

ขอบคุณ Sp3000 สำหรับ -5 ตัวอักษร

ขอบคุณ Martin Büttner♦สำหรับอีก 5 ตัวอักษร

ลองมัน


3

ฟังก์ชั่น c, 81

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

โปรแกรมทดสอบ:

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

int main (int argc, char **argv)
{
  f(2, 3);
}

ฉันทิ้งอักขระไปสองสามตัวเพื่อใช้เป็นบรรทัดเดียวแทนที่จะเป็นสองเท่าสำหรับ: x;f(h,w){for(w=w*4+2;x<=w*h*2+w;x++)putchar(x%w?x/w%2?x%w%4!=1?32:61:61:10);}- 78

1
ควรจะดูคำตอบอื่น ๆ ก่อน = / ความคิดเห็นของฉันเป็นคำตอบของ Reto Koradi รุ่นที่ยาวขึ้น

ใช่ฉันพยายามอย่างหนัก (และล้มเหลว) เพื่อให้เป็นวงเดียว (สั้น)
Digital Trauma

3

PHP4.1, 76 71 69 ไบต์

นี่คือ golfed เท่าที่ฉันจะได้รับ

$R=str_repeat;echo$R(($T=$R('-',4*$H+1))."
|{$R('   |',$H)}
",$V),$T;

สิ่งนี้คาดว่ากุญแจHจะมีจำนวนบรรทัดและVจำนวนกล่องต่อบรรทัด

ฉันกำลังใช้-และ|เพื่อให้กล่องดูเหมือนจริงกล่อง =หากต้องการฉันจะเปลี่ยนไป มันไม่สำคัญว่าถ่านที่ใช้
การออกจาก-และ|ยังช่วยให้เข้าใจความยุ่งเหยิงที่เกิดขึ้น


วิธีเก่า 76 ไบต์:

for($R=str_repeat;$H--;)echo$T=$R('-',($V*4)+1),"
|{$R('   |',$V)}
";echo$T;

ตัวอย่างผลลัพธ์:

http://localhost/file.php?H=2&V=3

-------------
|   |   |   |
-------------
|   |   |   |
-------------

3

Julia ขนาด 59 ไบต์

(n,m)->(l="="^(4m+1)*"\n";print(l*("="*"   ="^m*"\n"*l)^n))

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนเต็มสองจำนวนเป็นอินพุตและพิมพ์ผลลัพธ์ไปที่ STDOUT f=(n,m)->...เรียกว่าให้มันชื่อเช่น

คำอธิบาย Ungolfed +:

function f(n, m)
    # Store the solid row
    l = "="^(4m + 1) * "\n"

    # Print all rows by repeating a pattern n times
    print(l * ("=" * "   ="^m * "\n" * l)^n)
end

ตัวอย่าง:

julia> f(2, 3)
=============
=   =   =   =
=============
=   =   =   =
=============

julia> f(1, 5)
=====================
=   =   =   =   =   =
=====================

ข้อเสนอแนะใด ๆ ยินดีต้อนรับ


3

bash + coreutils, 57

dc -e"2do$2 4*1+^1-pd8*F/1+$1si[fli1-dsi0<c]dscx"|tr 0 \ 

สิ่งนี้ใช้dcเพื่อพิมพ์เลขฐานสองที่มี1s สำหรับขอบกล่องและ0s สำหรับช่องว่าง

  • หมายเลขx ทั้งหมดถูกคำนวณโดย2 ^ (width * 4 + 1) - 1จากนั้นกดและพิมพ์
  • 10001...0001จำนวนคำนวณโดยการผลักดันแล้วX* 8 / 15 + 1
  • สแต็กจะถูกทิ้งheightเวลา

trแล้วแปลง0เพื่ออักขระช่องว่าง

เอาท์พุต

$ ./boxes.sh 2 4
11111111111111111
1   1   1   1   1
11111111111111111
1   1   1   1   1
11111111111111111
$ 

3

R, 83 81

ในฐานะที่เป็นฟังก์ชั่นที่ไม่มีชื่อการรับ h และ w เป็นพารามิเตอร์ สร้างบรรทัดที่ 1 และที่สองลงในเวกเตอร์สำหรับแต่ละแถวและทำซ้ำhเวลา ต่อท้ายเวกเตอร์สำหรับบรรทัดล่างแล้วcatใช้เวกเตอร์fillเพื่อจำกัดความยาวของเส้น ตอนนี้ใช้ประโยชน์จากกฎอักขระที่มองเห็นได้

function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')

ทดสอบการทำงาน

> f=function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')
> f(4,2)
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
> 

3

Python 3 2, 160 87 85 79 ไบต์

ฉันรู้ว่านี่สามารถเล่นกอล์ฟได้มากขึ้นฉันต้องการคำแนะนำเพราะนี่เป็นครั้งแรกที่ฉันลองเล่นกอล์ฟ

def d(x,y):
    for i in[1]*x:print'='*(4*y+1)+'\n'+'=   '*(y+1)
    print'='*(4*y+1)

ขอบคุณ @Cool Guy และคำแนะนำของ @ Sp3000 ทำให้ฉันลดขนาดลงเหลือเพียงด้านบนดังต่อครึ่ง

เช่น d (3,3)

=============
=   =   =   =   
=============
=   =   =   =   
=============
=   =   =   =   
=============

ลองที่นี่ลองมันออกจากที่นี่

แก้ตัวช่องว่างที่ต่อท้าย


1
สามารถลดระดับการเยื้อง
Spikatrix

3
คุณไม่จำเป็นต้องสร้างรายการแล้วเข้าร่วม สามารถคูณสตริงได้'='*(4*y+1)
Sp3000

1
การตั้งค่าw=4*y+1จะบันทึก 3 ไบต์
DLosc

@Cool Guy ฉันใช้แท็บไม่ใช่ช่องว่าง 4 ตัว
nsane

โอวตกลง. ไม่ได้สังเกตว่า
Spikatrix

2

KDB (Q), 37 ไบต์

{(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}

คำอธิบาย

                      (4#"=";"=   ")     / box shape
           (5+4*y-1)#'                   / extend y axis
 (3+2*x-1)#                              / extend x axis
{                                   }    / lambda

ทดสอบ

q){(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}[2;5]
"====================="
"=   =   =   =   =   ="
"====================="
"=   =   =   =   =   ="
"====================="

2

JavaScript, 92 85 ไบต์

ฉันหวังว่านี่จะสั้นกว่าคำตอบ JS อื่น ๆ (ทำงานได้ดีเช่นเคย edc65) แต่ก็ดี ฉันมีความรู้สึกว่าคณิตศาสตร์ที่นี่สามารถเล่นกอล์ฟต่อไปได้

f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s

ขออภัยไม่สามารถช่วยคณิตศาสตร์ได้ - หัวของฉันหมุน ... แต่นี่คือ microop บางส่วน: f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s-> 85
edc65

@ edc65 เยี่ยมมากขอบคุณ! สิ่งต่าง ๆ เช่น2*r+1=> r-~rคือสิ่งที่ฉันหมายถึงโดยการเล่นคณิตศาสตร์และสิ่งนั้นคืออัจฉริยะ :)
vvye

2

คู่, 69 65 64

y=ones([2,4].*input()+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

ขอบคุณ DLosc สำหรับการชี้ประเด็นที่นำไปสู่ ​​-1

ใช้อินพุตเป็น[1 1]และเอาต์พุต:

#####
# #
#####

คุณสามารถป้อน '1' และรับ 1x1 หากจำเป็นต้องป้อนข้อมูล1 1ขนาดจะขึ้นไป88 8584 :

y=ones([2,4].*eval(['[',input(0,'s'),']'])+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

หมายเหตุ: Matlab ไม่อนุญาตการผูกมัดหรือการป้อนข้อมูลของ Octave (จำนวนเต็ม) แต่ที่นี่เป็นรุ่น Matlab ( 67 ):

y=ones([2,4].*input('')+1);y(1:2:end,:)=4;y(:,1:4:end)=4;char(y+31)

2

C, 76 ไบต์

w,n;f(r,c){for(w=c*4+2,n=w*r*2+w;n--;)putchar(n%w?n/w%2&&n%w%4-1?32:61:10);}

เรียกใช้เป็นฟังก์ชันที่มีจำนวนแถวและคอลัมน์เป็นอาร์กิวเมนต์ ตัวอย่างเช่น:

f(5, 2)

2

CJam, 30 29 ไบต์

เวอร์ชันใหม่+ที่ลบซ้ำซ้อนในตอนท้าย (ขอบคุณเดนนิส):

l~_4*)'=*N+:F\'=S3*+*'=+N++*F

ฉันรู้ว่าเดนนิสได้โพสต์โซลูชั่น CJam ที่เอาชนะสิ่งนี้ไปหลายไมล์แล้ว แต่นี่เป็นความพยายามครั้งแรกของฉันที่ CJam ดังนั้นมันจึงเป็นปาฏิหาริย์ที่ใช้งานได้ทั้งหมด :)

แรงเดรัจฉานค่อนข้างยุติธรรม สร้างบรรทัดแรกจาก4 * H + 1 =สัญญาณจากนั้นบรรทัดที่สองจากเวลาที่=ทำซ้ำHด้วยอีกบรรทัด=เพิ่มจากนั้นเชื่อมสองบรรทัดเข้าด้วยกันทำซ้ำสิ่งทั้งปวงVแล้วเพิ่มสำเนาของบรรทัดแรกอีกเส้น

รู้สึกเหมือนฉันมีวิธีการเรียงซ้อนมากเกินไปและท้ายที่สุดก็เก็บบรรทัดแรกไว้ในตัวแปรเพราะฉันต้องสับเปลี่ยนสิ่งต่าง ๆ รอบ ๆ กองซ้อนยิ่งกว่านั้น

ภาพรวมไม่หรูหรามาก แต่คุณต้องเริ่มต้นที่ไหนสักแห่ง ... และฉันต้องการลองปัญหาง่ายๆก่อน


คุณไม่ต้องการ+ตอนท้าย CJam พิมพ์สแต็กทั้งหมด
Dennis

2

CJam, 23

q~[F8]f{2b*1+' f+N}*_0=

ลองออนไลน์

คำอธิบาย:

q~        read and evaluate the input (height width)
[F8]      make an array [15 8] - 1111 and 1000 in base 2
f{…}      for width and each of [15 8]
  2b      convert the number to base 2
  *       repeat the digits "width" times
  1+      append a 1 to the array of digits (right edge)
  ' f+    add the space character to each digit (0->' ', 1->'!')
  N       push a newline
*         repeat the resulting array "height" times
_0=       copy the first line (bottom edge)


1

Java, 181

ฉันหวังว่าตาม

คุณได้รับอนุญาตให้เขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น

มันเป็นไปตามกฎเพื่อนับไบต์ของฟังก์ชั่นซึ่งเป็น 181 ในกรณีนี้

import static java.lang.System.*;
public class Boxes
{
    public static void main(String[] args)
    {
        Boxes b=new Boxes();
        System.out.println("1,1:");
        b.b(1,1);
        System.out.println("1,2:");
        b.b(1,2);
        System.out.println("2,1:");
        b.b(2,1);
        System.out.println("2,2:");
        b.b(2,2);
        System.out.println("2,5:");
        b.b(2,5);
    }

    void b(int R, int C){String s="",e=s,x,y,z=s,a="====",n="=\n";int r,c;for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="=   ";}s+=x+n+y+n;}for(c=C;c-->0;){z+=a;}s+=z+n;out.println(s);}
}

ผลลัพธ์ผิด ดูผลลัพธ์ no 2: " แต่ละกล่องควรมีช่องว่างแนวนอนสามช่อง " โค้ดของคุณมีช่องว่างสองช่องไม่ใช่สามช่อง
Spikatrix

@CoolGuy ทำสิ่งนี้ได้แล้ว - ตอนนี้มี 2 ไบต์ขึ้นไป แต่นั่นไม่ได้เปลี่ยนแปลงอะไรมากมาย ...
Marco13

1
ตกลง. +1 บันทึกสองไบต์ด้วยการเปลี่ยนfor(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="= ";}s+=x+n+y+n;}เป็นfor(r=R;r-->0;s+=x+n+y+n){x=y=e;for(c=C;c-->0;y+="= "){x+=a;}}
Spikatrix

1

C #, 153 151 150

สิ่งนี้ไม่สามารถแข่งขันได้จริงๆ แต่ที่นี่มันเพื่อความสนุกสนาน:

(h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}}

วิธีการใช้งาน:

public class Program
{
    public static void Main()
    {
        new System.Action<int, int>((h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}})(3, 4);
    }
}

เปิดสำหรับการปรับปรุง


แทนที่สตริงด้วย var.
CSharpie

น่าเสียดายที่ไม่ได้รับอนุญาต ดูสิ่งนี้
pmudra

1
การประกาศผู้intที่อยู่นอกลูปสามารถบันทึกไบต์ได้
Spikatrix

1

Python 2.7, 66 ไบต์

ฉันรู้ว่ามีวิธีแก้ปัญหาที่ดีกว่าในไพ ธ อน แต่นั่นเป็นวิธีที่ดีที่สุดที่ฉันจะได้รับ

def f(x,y):a,b,c="="*4,"   =","\n=";print "="+a*y+(c+b*y+c+a*y)*x

ตัวอย่าง:

f(3,4)

=================
=   =   =   =   =
=================
=   =   =   =   =
=================
=   =   =   =   =
=================

ขออภัยสิ่งนี้สร้างผลลัพธ์ที่ไม่ถูกต้องสำหรับกรณีทดสอบ 2,3 และ 5 คุณรวมคอลัมน์และแถวเข้าด้วยกันและทำให้มันตรงกันข้าม
Spikatrix

1

ทับทิม, 57 48 45

f=->h,w{l=?=*w*4+?=;(l+$/+'=   '*w+"=
")*h+l}

การใช้งาน:

print f[2,5]

ขอบคุณ manatwork สำหรับการบันทึก 3 ไบต์


สองเป็นไปได้ปรับปรุงเล็ก: '='?=และ→"<LF>" $/
จัดการ

อีกอันเล็ก ๆ : ?=*(w*4+1)?=+?=*w*4
จัดการ

1

Java, 123 119 ไบต์

void p(int h,int w){String b="=",d="\n=";for(;w-->0;d+="   =")b+="====";for(d+="\n"+b;h-->0;b+=d);System.out.print(b);}

การใช้พารามิเตอร์อินพุตในทางที่ผิดเป็นตัวนับช่วยลดขนาดรหัสได้อย่างมาก

ขอบคุณ Cool Guy สำหรับการแนะนำการละเมิดไวยากรณ์


ตีกอล์ฟให้มากขึ้นโดยใช้การforวนแทนการwhileวนซ้ำ
Spikatrix

น่าเสียดายสำหรับ (; w -> 0;) มีความยาวเท่ากันขณะที่ (w -> 0)
ECS

1
ฉันหมายถึงwhile(w-->0){d+=" =";b+="====";}-> for(;w-->0;b+="====")d+=" =";ซึ่งช่วยประหยัดสามไบต์
Spikatrix

คุณพูดถูก ฉันพยายามบีบ 4 ไบต์จากคำแนะนำของคุณ
ECS

1

SAS, 117 119

macro a array a[0:1]$4('#   ' '####');do x=1 to 2+2*&x-1;t=repeat(a[mod(x,2)],&y-1);put t $char%%eval(&y*3). '#';end;%

ตัวอย่าง:

%let x=4;
%let y=4;
data;a;run;

ผลลัพธ์:

#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############

มีผู้รวบรวมออนไลน์ที่ฉันสามารถทดสอบได้หรือไม่ BTW ตามผลลัพธ์ของคุณโปรแกรมของคุณสร้างเอาต์พุตผิด ดูผลลัพธ์ 2: แต่ละกล่องควรมีช่องว่างแนวนอนสามช่อง
Spikatrix

@CoolGuy คุณพูดถูกฉันไม่ได้ติดตามข่าวล่าสุดของฉัน คุณสามารถลองใช้SAS On Demandซึ่งเป็นวิธีที่ลำบากที่สุดในการเข้าถึงคอมไพเลอร์ออนไลน์โดยไม่ต้องตั้งค่าAWS Instance
Fried Egg

ลิงค์แรกของคุณใช้ไม่ได้สำหรับฉัน Chrome มอบให้DNS_PROBE_FINISHED_NXDOMAIN
Spikatrix

ลองอันนี้แม้ว่าลิงค์แรกจะใช้ได้ดีสำหรับฉันSAS On Demandหรือไปตามลิงก์ในหน้านี้ไปยัง 'ศูนย์ควบคุม' ที่นี่
ไข่ทอด

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