# Draw an ASCII Rectangle

Given two integers as input in an array, draw a rectangle, using the first integer as width and second as height.

Or, if your language supports it, the two integers can be given as separate inputs.

Assume the width and height will never be less than 3, and they will always be given.

Example Outputs:

[3, 3]

|-|
| |
|-|


[5, 8]

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


[10, 3]

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


This is code-golf, so the answer with the lowest amount of bytes wins.

# Jolf, 6 bytes

,ajJ'|


Try it here! My box builtin finally came in handy! :D

,ajJ'|
,a       draw a box
j      with width (input 1)
J     and height (input 2)
'    with options
|    - corner
- the rest are defaults


# Jelly, 14 bytes

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


### How it works

,þ%,ỊḄị“-|| ”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.

• This is a wonderful use of Ị :) – Lynn Sep 19 '16 at 12:01

# Matlab, 6965 56 bytes

Thanks @WeeingIfFirst and @LuisMendo for some bytes=)

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


This is really simple in Matlab: First make a matrix of the desired size, then index the first and last row to insert the -, and do the same with the first and last column to insert |.

For example f(4,3) returns

|--|
|  |
|--|

• @WeeingIfFirst Oh, of course, thank you very much! – flawr Sep 18 '16 at 14:22
• 6 bytes shorter: z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,''] – Stewie Griffin Sep 18 '16 at 14:31
• Even shorter: z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124 – Luis Mendo Sep 18 '16 at 14:54
• @LuisMendo Thanks! We still need the string tough, otherwise the array is converted to a numerical one. – flawr Sep 18 '16 at 14:55
• @flawr z(b,a)=' ' initiallizes as char. After that you can fill with numbers and they are automatically cast to char. z maintains its original type – Luis Mendo Sep 18 '16 at 14:56

## JavaScript (ES6), 63 bytes

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> • Passing a template function as a default argument? Clever! – Florrie Sep 19 '16 at 1:04 ## Haskell, 62 55 bytes f[a,b]n=a:(b<$[3..n])++[a]
g i=unlines.f[f"|-"i,f"| "i]


Usage example:

*Main> putStr $g 10 3 |--------| | | |--------|  The helper function f takes a two element list [a,b] and a number n and returns a list of one a followed by n-2 bs followed by one a. We can use f thrice: to build the top/bottom line: f "|-" i, a middle line: f "| " i and from those two the whole rectangle: f [<top>,<middle>] j (note: j doesn't appear as a parameter in g i because of partial application). Edit: @dianne saved some bytes by combining two Char arguments into one String of length 2. Thanks a lot! • I like the # idea! – flawr Sep 18 '16 at 15:54 • I think you can save a few bytes by defining (a:b)#n=a:([3..n]>>b)++[a] and writing ["|-"#i,"| "#i]#j – dianne Sep 18 '16 at 20:00 • @dianne: Very clever. Thanks a lot! – nimi Sep 18 '16 at 20:33 # Python 2, 61 58 bytes -3 bytes thanks to @flornquake (remove unnecessary parentheses; use h as counter) def f(w,h):exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h  Test cases are at ideone • ('- '[1<i<h]) doesn't need the parentheses. – flornquake Sep 19 '16 at 12:24 • Save another byte by using h as the counter: exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h – flornquake Sep 19 '16 at 12:35 • @flornquake I had meant to check the necessity of those parentheses, but forgot. Using h as the counter is smart! Thanks. – Jonathan Allan Sep 19 '16 at 17:23 # PHP, 74 Bytes for(;$i<$n=$argv[2];)echo str_pad("|",$argv[1]-1,"- "[$i++&&$n-$i])."|\n";

• You can still win one byte with a physical linebreak. – Titus Sep 18 '16 at 14:16
• -2 bytes with !$i|$n==++$i instead of !$i|$n-1==$i++ – Titus Sep 18 '16 at 14:22
• another byte with $i++&&$n-$i?" ":"-" – Titus Sep 18 '16 at 14:58 • $i++&&$n-$i?" ":"-" --> "- "[$i++&&$n-$i] (-2) – Titus Sep 28 '16 at 8:05 # Vimscript, 93837574736664 63 bytes # Code fu A(...) exe "norm ".a:1."i|\ehv0lr-YpPgvr dd".a:2."p2dd" endf  ## Example :call A(3,3)  ## Explanation 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  Note that it is not using norm! so it might interfere with vim custom mappings! # MATL, 19 bytes '|-| '2:"iqWQB]E!+)  Try it online! ### Explanation The approach is similar to that used in this other answer. The code builds a numerical array of the form 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  and then its values are used as (1-based, modular) indices into the string '|-| ' to produce the desired result. '|-| ' % 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  # 05AB1E, 2322 20 bytes Input taken as height, then width. F„ -N_N¹<Q~è²Í×'|.ø,  Explanation 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  Try it online! Saved 2 bytes thanks to Adnan # C, 73 bytes i;f(w,h){for(i=++w*h;i--;)putchar(i%w?~-i%w%~-~-w?i/w%~-h?32:45:124:10);}  # Python 2, 56 bytes w,h=input() for c in'-%*c'%(h-1,45):print'|'+c*(w-2)+'|'  flornquake saved one byte. • Nice use of string formatting! You can save a byte using %c conversion: '-%*c'%(h-1,45) – flornquake Sep 19 '16 at 12:47 • Oh, I thought %*c wasn’t even a thing! Thank you. :) – Lynn Sep 19 '16 at 13:41 • '-%%%dc'%~-h%45 also works for the same length. – xnor Sep 19 '16 at 19:33 ## Common Lisp, 104 bytes Golfed: (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 "-")))  # Turtlèd, 40 bytes Interpreter is slightly no longer buggèd ?;,u[*'|u]'|?@-[*:l'|l[|,l]d@ ],ur[|'-r]  ## Explanation ? - 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  # Mathematica, 67 64 bytes Thanks to lastresort and TuukkaX for reminding me that golfers should be sneaky and saving 3 bytes! Straightforward implementation. Returns an array of strings. Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&  • Use 0<1 in place of True – lastresort Sep 19 '16 at 11:59 • I think that j==1 can be reduced to j<1, and i==1 to i<1. – Yytsi Sep 19 '16 at 17:34 # Python 3, 104 95 bytes ( feedback from @mbomb007 : -9 bytes) def d(x,y):return'\n'.join(('|'+('-'*(x-2)if n<1or n==~-y else' '*(x-2))+'|')for n in range(y))  (my first code golf, appreciate feedback) • 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 Sep 19 '16 at 13:56 • See the Python tips page – mbomb007 Sep 19 '16 at 13:56 • @mbomb007 thanks! I'll check it out. – Biarity Sep 19 '16 at 21:16 ## 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. # 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) |---------| | | |---------|  # 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 Sep 18 '16 at 20:31 • 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 Sep 18 '16 at 20:49 • @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 Sep 19 '16 at 4:42 • "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 Sep 19 '16 at 4:55 • Thanks. I didn't wanted to place any characters there. – Roman Gräf Sep 19 '16 at 5:12 ## 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 |-----| | | | | | | | | |-----|  # 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 -> "|")
",$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 Sep 28 '16 at 8:56 • Ouch sorry I take everything back. You have the version in your title. I should read more carefully. – Titus Sep 28 '16 at 9:16 • @Titus That's alright, don't worry. Sorry for being harsh on you. – Ismael Miguel Sep 28 '16 at 9:50 • Nevermind; that´s the price I pay for being pedantic. :D – Titus Sep 28 '16 at 10:59 • @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 Sep 28 '16 at 14:22 # Python 3, 74 chars p="|" def r(w,h):m=w-2;b=p+"-"*m+p;return b+"\n"+(p+m*" "+p+"\n")*(h-2)+b  # 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.

## F#, 131 bytes

let d x y=
let q = String.replicate (x-2)
[for r in [1..y] do printfn "%s%s%s" "|" (if r=y||r=1 then(q "-")else(q " ")) "|"]