วาดรูปสี่เหลี่ยมผืนผ้า ASCII


20

กำหนดจำนวนเต็มสองจำนวนเป็นอินพุตในอาร์เรย์วาดสี่เหลี่ยมโดยใช้จำนวนเต็มแรกเป็นความกว้างและวินาทีเป็นความสูง

หรือหากภาษาของคุณรองรับจำนวนเต็มสองตัวสามารถกำหนดเป็นอินพุตแยกกันได้

สมมติว่าความกว้างและความสูงจะไม่น้อยกว่า 3 และจะได้รับเสมอ

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

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

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

คำตอบ:



10

เยลลี่ขนาด 14 ไบต์

,þ%,ỊḄị“-|| ”Y

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

,þ%,ỊḄị“-|| ”Y  Main link. Left argument: w. Right argument: h

,þ              Pair table; yield a 2D array of all pairs [i, j] such that
                1 ≤ i ≤ w and 1 ≤ j ≤ h.
   ,            Pair; yield [w, h].
  %             Take the remainder of the element-wise division of each [i, j]
                by [w, h]. This replaces the highest coordinates with zeroes.
    Ị           Insignificant; map 0 and 1 to 1, all other coordinates to 0.
     Ḅ          Unbinary; convert each pair from base 2 to integer.
                  [0, 0] -> 0 (area)
                  [0, 1] -> 1 (top or bottom edge)
                  [1, 0] -> 2 (left or right edge)
                  [1, 1] -> 3 (vertex)
       “-|| ”   Yield that string. Indices are 1-based and modular in Jelly, so the
                indices of the characters in this string are 1, 2, 3, and 0.
      ị         At-index; replace the integers by the correspoding characters.
             Y  Join, separating by linefeeds.

นี่คือการใช้ที่ยอดเยี่ยมของ:)
ลินน์

9

Matlab, 69 65 56 ไบต์

ขอบคุณ @WeeingIfFirst และ @LuisMendo สำหรับบางไบต์ =)

function z=f(a,b);z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])='|'

นี้เป็นเรื่องง่ายจริงๆใน Matlab: ก่อนให้เมทริกซ์ขนาดที่ต้องการแล้วดัชนีแถวแรกและครั้งสุดท้ายให้ใส่และทำเช่นเดียวกันกับคอลัมน์แรกและครั้งสุดท้ายที่จะแทรก-|

ตัวอย่างเช่นf(4,3)ผลตอบแทน

|--|
|  |
|--|

@ การเดินทางถ้าแรกโอ้แน่นอนขอบคุณมาก!
ข้อบกพร่อง

สั้นลง 6 ไบต์:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin

ยิ่งสั้นลง:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo

@LuisMendo ขอบคุณ! เรายังต้องการสตริงที่ยากไม่เช่นนั้นอาเรย์จะถูกแปลงเป็นตัวเลข
ข้อผิดพลาด

@flawr ริเริ่มz(b,a)=' 'ให้เป็นถ่าน หลังจากนั้นคุณสามารถกรอกตัวเลขและพวกเขาจะถูกโยนโดยอัตโนมัติ zรักษาชนิดเดิม
หลุยส์ Mendo

8

JavaScript (ES6), 63 ไบต์

f=
(w,h,g=c=>`|${c[0].repeat(w-2)}|
`)=>g`-`+g` `.repeat(h-2)+g`-`
;
<div oninput=o.textContent=f(w.value,h.value)><input id=w type=number min=3 value=3><input id=h type=number min=3 value=3><pre id=o>


ผ่านฟังก์ชั่นแม่แบบเป็นอาร์กิวเมนต์เริ่มต้นหรือไม่ ฉลาด!
Florrie

8

Haskell, 62 55 ไบต์

f[a,b]n=a:(b<$[3..n])++[a]
g i=unlines.f[f"|-"i,f"| "i]

ตัวอย่างการใช้งาน:

*Main> putStr $ g 10 3
|--------|
|        |
|--------|

ฟังก์ชั่นผู้ช่วยfยิงสองรายการองค์ประกอบ[a,b]และจำนวนnและผลตอบแทนที่รายการหนึ่งaตามด้วยn-2 bs aตามด้วยหนึ่ง เราสามารถใช้fสามครั้ง: เพื่อสร้างเส้นบน / ล่าง: f "|-" i, เส้นกลาง: f "| " iและจากทั้งสองรูปสี่เหลี่ยมผืนผ้าทั้งหมด: f [<top>,<middle>] j(หมายเหตุ: jไม่ปรากฏเป็นพารามิเตอร์g iเนื่องจากแอปพลิเคชันบางส่วน)

แก้ไข: @dianne บันทึกบางไบต์ด้วยการรวมสองCharอาร์กิวเมนต์เข้าด้วยกันเป็นหนึ่งStringในความยาว 2 ขอบคุณมาก!


ฉันชอบ#ความคิด!
ข้อบกพร่อง

2
ฉันคิดว่าคุณสามารถบันทึกได้สองสามไบต์โดยกำหนด(a:b)#n=a:([3..n]>>b)++[a]และเขียน["|-"#i,"| "#i]#j
dianne

@dianne: ฉลาดมาก ขอบคุณมาก!
nimi

8

Python 2, 61 58 ไบต์

-3 ไบต์ด้วย @flornquake (ลบวงเล็บที่ไม่จำเป็นออกใช้hเป็นตัวนับ)

def f(w,h):exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h

กรณีทดสอบอยู่ที่ideone


('- '[1<i<h])ไม่ต้องการวงเล็บ
flornquake

บันทึกไบต์อื่นโดยใช้ h เป็นตัวนับ:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake

@ flornquake ฉันตั้งใจจะตรวจสอบความจำเป็นของวงเล็บเหล่านั้น แต่ลืมไป ใช้hเป็นเคาน์เตอร์เป็นสมาร์ท! ขอบคุณ
Jonathan Allan

8

PHP, 74 ไบต์

for(;$i<$n=$argv[2];)echo str_pad("|",$argv[1]-1,"- "[$i++&&$n-$i])."|\n";

1
คุณยังสามารถชนะหนึ่งไบต์ด้วยการเล่นแบบ linebreak
ติตัส

1
-2 ไบต์ด้วย!$i|$n==++$iแทนที่จะเป็น!$i|$n-1==$i++
ติตัส

1
ไบต์อื่นด้วย$i++&&$n-$i?" ":"-"
ติตัส

1
$i++&&$n-$i?" ":"-"-> "- "[$i++&&$n-$i](-2)
ติตัส

7

Vimscript, 93 83 75 74 73 66 64 63 ไบต์

รหัส

fu A(...)
exe "norm ".a:1."i|\ehv0lr-YpPgvr dd".a:2."p2dd"
endf

ตัวอย่าง

:call A(3,3)

คำอธิบาย

fun A(...)    " a function with unspecified params (a:1 and a:2)
exe           " exe(cute) command - to use the parameters we must concatenate :(
norm          " run in (norm) al mode
#i|           " insert # vertical bars
\e            " return (`\<Esc>`) to normal mode
hv0l          " move left, enter visual mode, go to the beginning of the line,  move right (selects inner `|`s)
r-            " (r)eplace the visual selection by `-`s
YpP           " (Y) ank the resulting line, and paste them twice
gv            " re-select the previous visual selection
r<Space>      " replace by spaces
dd            " Cut the line
#p            " Paste # times (all inner rows) 
2dd           " Remove extra lines

โปรดทราบว่ามันไม่ได้ใช้งานnorm!ดังนั้นอาจรบกวนการแมปกำหนดเองที่เป็นกลุ่ม!


5

MATL , 19 ไบต์

'|-| '2:"iqWQB]E!+)

ลองออนไลน์!

คำอธิบาย

วิธีการคล้ายกับที่ใช้ในคำตอบอื่น ๆนี้ รหัสจะสร้างอาร์เรย์ที่เป็นตัวเลขของแบบฟอร์ม

3 2 2 2 3
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
3 2 2 2 3

จากนั้นค่าของมันจะถูกใช้เป็นดัชนี (แบบโมดูลาร์ 1) ลงในสตริง'|-| 'เพื่อสร้างผลลัพธ์ที่ต้องการ

'|-| '                % Push this string
      2:"     ]       % Do this twice
         i            % Take input
          q           % Subtract 1
           W          % 2 raised to that
            Q         % Add 1
             B        % Convert to binary
               E      % Multiply by 2
                !     % Transpose
                 +    % Add with broadcast
                  )   % Index (modular, 1-based) into the string

5

05AB1E , 23 22 20 ไบต์

ข้อมูลที่ป้อนเป็นความสูงแล้วความกว้าง

F„ -N_N¹<Q~è²Í×'|.ø,

คำอธิบาย

F                          # height number of times do
    N_                     # current row == first row
          ~                # OR
      N¹<Q                 # current row == last row
 „ -       è               # use this to index into " -"
            ²Í×            # repeat this char width-2 times
               '|          # push a pipe
                 .ø        # surround the repeated string with the pipe
                   ,       # print with newline

ลองออนไลน์!

บันทึก 2 ไบต์ขอบคุณAdnan


F„ -N_N¹<Q~è²Í×'|.ø,ใช้สตริงแทนคำสั่งถ้า-อื่นช่วยประหยัดไบต์ที่สอง:
Adnan


4

Python 2, 56 ไบต์

w,h=input()
for c in'-%*c'%(h-1,45):print'|'+c*(w-2)+'|'

flornquake บันทึกหนึ่งไบต์


1
ใช้การจัดรูปแบบสตริงได้ดี! คุณสามารถบันทึกไบต์โดยใช้%cการแปลง:'-%*c'%(h-1,45)
flornquake

โอ้ฉันคิดว่า%*cไม่แม้แต่จะเป็นอะไร! ขอขอบคุณ. :)
ลินน์

'-%%%dc'%~-h%45ยังสามารถใช้ได้กับความยาวเท่ากัน
xnor

4

เสียงกระเพื่อมสามัญ 104 ไบต์

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

(defun a(w h)(flet((f(c)(format t"|~v@{~A~:*~}|~%"(- w 2)c)))(f"-")(loop repeat(- h 2)do(f" "))(f"-")))

Ungolfed:

(defun a (w h)
  (flet ((f (c) (format t "|~v@{~A~:*~}|~%" (- w 2) c)))
    (f "-")
    (loop repeat (- h 2) do
     (f " "))
    (f "-")))

3

Turtlèd , 40 ไบต์

ล่ามจะไม่มีการแปลเล็กน้อยอีกต่อไป

?;,u[*'|u]'|?@-[*:l'|l[|,l]d@ ],ur[|'-r]

คำอธิบาย

?                            - input integer into register
 ;                           - move down by the contents of register
  ,                          - write the char variable, default *
   u                         - move up
    [*   ]                   - while current cell is not *
      '|                     - write |
        u                    - move up
          '|                 - write | again
            ?                - input other integer into register
             @-              - set char variable to -
               [*             ] - while current char is not *
                 :l'|l          - move right by amount in register, move left, write |, move left again
                      [|,l]     - while current cell is not |, write char variable, move left
                           d@   - move down, set char variable to space (this means all but first iteration of loop writes space)
                               ,ur   -write char variable, move up, right
                                  [|   ] -while current char is not |
                                    '-r - write -, move right

3

Mathematica, 67 64 ไบต์

ขอบคุณ lastresort และ TuukkaX ที่เตือนฉันว่านักกอล์ฟควรลับลมคมและประหยัด 3 ไบต์!

การใช้งานที่ไม่ซับซ้อน ส่งคืนอาร์เรย์ของสตริง

Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&

1
ใช้0<1แทนTrue
u54112

1
ผมคิดว่าj==1จะลดลงj<1และจะi==1 i<1
Yytsi

3

Python 3, 104 95 ไบต์

(ข้อเสนอแนะจาก @ mbomb007: -9 ไบต์)

def d(x,y):return'\n'.join(('|'+('-'*(x-2)if n<1or n==~-y else' '*(x-2))+'|')for n in range(y))

(กอล์ฟรหัสแรกของฉันขอขอบคุณข้อเสนอแนะ)


Welcome! You can remove some of the spaces, use range(y) instead of range(0,y), and if n is never negative you can use if n<1or n==~-y else
mbomb007

See the Python tips page
mbomb007

@mbomb007 thanks! I'll check it out.
Biarity

2

Batch, 128 bytes

@set s=
@for /l %%i in (3,1,%1)do @call set s=-%%s%%
@echo ^|%s%^|
@for /l %%i in (3,1,%2)do @echo ^|%s:-= %^|
@echo ^|%s%^|

Takes width and height as command-line parameters.


2

Haxe, 112 106 bytes

function R(w,h){for(l in 0...h){var s="";for(i in 0...w)s+=i<1||i==w-1?'|':l<1||l==h-1?'-':' ';trace(s);}}

Testcases

R(5, 8)
|---|
|   |
|   |
|   |
|   |
|   |
|   |
|---|

R(10, 3)
|---------|
|         |
|---------|

2

Java 135 bytes

public String rect(int x, int y){
String o="";
for(int i=-1;++i<y;){
o+="|";
for(int j=2;++j<x)
if(i<1||i==y-1)
o+="-";
else
o+=" ";
o+="|\n";
}
return o;
}

Golfed:

String r(int x,int y){String o="";for(int i=-1;++i<y;){o+="|";for(int j=2;++j<x;)if(i<1||i==y-1)o+="-";else o+=" ";o+="|\n";}return o;}

I count 136 :) You can also save a char by removing the space after the first comma.
Christian Rondeau

1
First of all, this code doesn't compile. Even if this would compile, it wouldn't 'draw' a rectangle as the OP currently wants. -1.
Yytsi

@TuukkaX I fixed that newline problem, but I don't see any reason why it should not compile. Of course you have to put that code in a class, but then it should work.
Roman Gräf

1
"I don't see any reason why it should not compile". What's this then: o+=x "|\n"? Did you mean to put an + there?
Yytsi

Thanks. I didn't wanted to place any characters there.
Roman Gräf

2

PowerShell v3+, 55 bytes

param($a,$b)1..$b|%{"|$((' ','-')[$_-in1,$b]*($a-2))|"}

Takes input $a and $b. Loops from 1 to $b. Each iteration, we construct a single string. The middle is selected from an array of two single-length strings, then string-multiplied by $a-2, while it's surrounded by pipes. The resulting strings are left on the pipeline, and output via implicit Write-Output happens on program completion, with default newline separator.

Alternatively, also at 55 bytes

param($a,$b)1..$b|%{"|$((''+' -'[$_-in1,$b])*($a-2))|"}

This one came about because I was trying to golf the array selection in the middle by using a string instead. However, since [char] times [int] isn't defined, we lose out on the savings by needing to cast as a string with parens and ''+.

Both versions require v3 or newer for the -in operator.

Examples

PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 10 3
|--------|
|        |
|--------|

PS C:\Tools\Scripts\golfing> .\draw-an-ascii-rectangle.ps1 7 6
|-----|
|     |
|     |
|     |
|     |
|-----|

2

PHP, 82 bytes

list(,$w,$h)=$argv;for($p=$h--*$w;$p;)echo$p--%$w?$p%$w?$p/$w%$h?" ":"-":"|
":"|";

indexing a static string including the newline

list(,$w,$h)=$argv;         // import arguments
for($p=$h--*++$w;$p;)       // loop $p through all positions counting backwards
    // decrease $h and increase $w to avoid parens in ternary conditions
    echo" -|\n"[
        $p--%$w             // not (last+1 column -> 3 -> "\n")
        ?   $p%$w%($w-2)    // not (first or last row -> 2 -> "|")
            ?+!($p/$w%$h)   // 0 -> space for not (first or last row -> 1 -> "-")
            :2
        :3
    ];

Dear downvoter: why?
Titus

1
It could be because a user saw that your answer was flagged as low quality in the review queue. If you post an explanation of your code, or anything more than a one-liner, you can avoid it being automatically flagged.
mbomb007

@mbomb: I have never seen anyone post a description for a oneliner in a non-eso language.
Titus

Or output, or a non-golfed version. It doesn't matter as long as the content is not too short. But you probably haven't been around long if you haven't seen that. Some Python one-liners can be pretty complicated. Look at some of @xnor's.
mbomb007


2

Perl, 48 bytes

Includes +1 for -n

Give sizes as 2 lines on STDIN

perl -nE 'say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"'
3
8
^D

Just the code:

say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"

Nice one, as always. Note that you've got a backtick at the end of the line while you probably wanted to write a single quote ;-)
Dada

@Dada Fixed. Thanks.
Ton Hospel

2

Lua, 120 93 bytes

Saved quite a few bytes by removing stupid over complexities.

function(w,h)function g(s)return'|'..s:rep(w-2)..'|\n'end b=g'-'print(b..g' ':rep(h-2)..b)end

Ungolfed:

function(w,h)                           -- Define Anonymous Function
    function g(s)                       -- Define 'Row Creation' function. We use this twice, so it's less bytes to function it.
        return'|'..s:rep(w-2)..'|\n'    -- Sides, Surrounding the chosen filler character (' ' or '-'), followed by a newline
    end
    b=g'-'                              -- Assign the top and bottom rows to the g of '-', which gives '|---------|', or similar.
    print(b..g' ':rep(h-2)..b)          -- top, g of ' ', repeated height - 2 times, bottom. Print.
end

Try it on Repl.it


1

Python 2, 67 bytes

def f(a,b):c="|"+"-"*(a-2)+"|\n";print c+c.replace("-"," ")*(b-2)+c

Examples

f(3,3)

|-|
| |
|-|

f(5,8)

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

f(10,3)

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

1

MATL, 21 17 bytes

Z"45ILJhY('|'5MZ(

This is a slightly different approach than the one of the MATL-God.

Z"                   Make a matrix of spaces of the given size
  45ILJhY(           Fill first and last row with '-' (code 45)
          '|'5MZ(    Fill first and last column with '|' (using the automatic clipboard entry 5M to get ILJh back)

Thanks @LuisMendo for all the help!

Try it Online!


1

PHP 4.1, 76 bytes

<?$R=str_repeat;echo$l="|{$R('-',$w=$W-2)}|
",$R("|{$R(' ',$w)}|
",$H-2),$l;

This assumes you have the default php.ini settings for this version, including short_open_tag and register_globals enabled.

This requires access through a web server (e.g.: Apache), passing the values over session/cookie/POST/GET variables.
The key W controls the width and the key H controls the height.
For example: http://localhost/file.php?W=3&H=5


@Titus You should read the link. Quoting: "As of PHP 4.2.0, this directive defaults to off".
Ismael Miguel

Ouch sorry I take everything back. You have the version in your title. I should read more carefully.
Titus

@Titus That's alright, don't worry. Sorry for being harsh on you.
Ismael Miguel

Nevermind; that´s the price I pay for being pedantic. :D
Titus

@Titus Don't worry about it. Just so you know, around half of my answers are written in PHP 4.1. It saves tons of bytes with input
Ismael Miguel


1

Swift(2.2) 190 bytes

let v = {(c:String,n:Int) -> String in var s = "";for _ in 1...n {s += c};return s;};_ = {var s = "|"+v("-",$0-2)+"|\n" + v("|"+v(" ",$0-2)+"|\n",$1-2) + "|"+v("-",$0-2)+"|";print(s);}(10,5)

I think Swift 3 could golf this a lot more but I don't feel like downloading Swift 3.


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