Vẽ một hình chữ nhật ASCII


20

Cho hai số nguyên làm đầu vào trong một mảng, vẽ một hình chữ nhật, sử dụng số nguyên đầu tiên là chiều rộng và thứ hai là chiều cao.

Hoặc, nếu ngôn ngữ của bạn hỗ trợ nó, hai số nguyên có thể được cung cấp dưới dạng đầu vào riêng biệt.

Giả sử chiều rộng và chiều cao sẽ không bao giờ nhỏ hơn 3 và chúng sẽ luôn được cung cấp.

Kết quả đầu ra:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

Đây là môn đánh gôn, vì vậy câu trả lời có số byte thấp nhất sẽ thắng.

Câu trả lời:


6

Jolf, 6 byte

,ajJ'|

Hãy thử nó ở đây! Hộp dựng sẵn của tôi cuối cùng đã có ích! : D

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

10

Thạch , 14 byte

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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

Đây là một công dụng tuyệt vời của :)
Lynn

9

Matlab, 69 65 56 byte

Cảm ơn @Weeing IfFirst và @LuisMendo cho một số byte =)

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

Điều này thực sự đơn giản trong Matlab: Đầu tiên tạo một ma trận có kích thước mong muốn, sau đó lập chỉ mục cho hàng đầu tiên và cuối cùng để chèn -và làm tương tự với cột đầu tiên và cuối cùng để chèn |.

Ví dụ f(4,3)trả về

|--|
|  |
|--|

@Weeing IfFirst Oh, tất nhiên, cảm ơn bạn rất nhiều!
flawr

Ngắn hơn 6 byte:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin

Thậm chí ngắn hơn:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo

@LuisMendo Cảm ơn! Chúng ta vẫn cần chuỗi khó khăn, nếu không thì mảng được chuyển đổi thành một chuỗi số.
flawr

@flawr z(b,a)=' 'bắt đầu như char. Sau đó, bạn có thể điền số và chúng sẽ tự động được chuyển thành char. zduy trì loại ban đầu của nó
Luis Mendo

8

JavaScript (ES6), 63 byte

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>


Truyền một hàm mẫu làm đối số mặc định? Tài giỏi!
Florrie

8

Haskell, 62 55 byte

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

Ví dụ sử dụng:

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

Hàm trợ giúp flấy một danh sách hai phần tử [a,b]và một số nvà trả về một danh sách một atheo sau bởi n-2 bs theo sau là một a. Chúng ta có thể sử dụng fba lần: để xây dựng dòng trên cùng / dưới cùng : f "|-" i, một dòng giữa: f "| " ivà từ hai hình chữ nhật đó: f [<top>,<middle>] j(lưu ý: jkhông xuất hiện dưới dạng tham số g ivì ứng dụng một phần).

Chỉnh sửa: @dianne đã lưu một số byte bằng cách kết hợp hai Charđối số thành một Stringchiều dài 2. Cảm ơn rất nhiều!


Tôi thích #ý tưởng!
flawr

2
Tôi nghĩ bạn có thể lưu một vài byte bằng cách xác định (a:b)#n=a:([3..n]>>b)++[a]và viết["|-"#i,"| "#i]#j
dianne

@dianne: Rất thông minh. Cảm ơn rất nhiều!
nimi

8

Python 2, 61 58 byte

-3 byte nhờ @flornquake (loại bỏ các dấu ngoặc đơn không cần thiết; sử dụng hlàm bộ đếm)

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

Các trường hợp thử nghiệm là ở ideone


('- '[1<i<h])không cần dấu ngoặc đơn.
flornquake

Lưu một byte khác bằng cách sử dụng h làm bộ đếm:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake

@flornquake Tôi định kiểm tra sự cần thiết của những dấu ngoặc đơn đó, nhưng quên mất. Dùng hlàm quầy là thông minh! Cảm ơn.
Jonathan Allan

8

PHP, 74 byte

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

1
Bạn vẫn có thể giành được một byte với một ngắt dòng vật lý.
Tít

1
-2 byte !$i|$n==++$ithay vì!$i|$n-1==$i++
Titus

1
một byte khác với$i++&&$n-$i?" ":"-"
Titus

1
$i++&&$n-$i?" ":"-"-> "- "[$i++&&$n-$i](-2)
Tít

7

Vimscript, 93 83 75 74 73 66 64 63 byte

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

Thí dụ

:call A(3,3)

Giải trình

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

Lưu ý rằng nó không được sử dụng norm!để nó có thể can thiệp vào ánh xạ tùy chỉnh vim!


5

MATL , 19 byte

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

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

Giải trình

Cách tiếp cận tương tự như được sử dụng trong câu trả lời khác này . Mã xây dựng một mảng số của mẫu

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

và sau đó các giá trị của nó được sử dụng như các chỉ số (dựa trên 1, mô-đun) vào chuỗi '|-| 'để tạo ra kết quả mong muốn.

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

Đầu vào lấy theo chiều cao, rồi chiều rộng.

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

Giải trình

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

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

Đã lưu 2 byte nhờ Adnan


Sử dụng các chuỗi con thay cho câu lệnh if-other tiết kiệm hai byte : F„ -N_N¹<Q~è²Í×'|.ø,.
Ad Nam

5

C, 73 byte

i;f(w,h){for(i=++w*h;i--;)putchar(i%w?~-i%w%~-~-w?i/w%~-h?32:45:124:10);}

4

Python 2, 56 byte

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

flornquake lưu một byte.


1
Sử dụng tốt định dạng chuỗi! Bạn có thể lưu một byte bằng cách sử dụng %cchuyển đổi:'-%*c'%(h-1,45)
flornquake

Ồ, tôi nghĩ %*cthậm chí không phải là một điều! Cảm ơn bạn. :)
Lynn

'-%%%dc'%~-h%45cũng hoạt động với chiều dài tương tự.
xnor

4

Lisp thường gặp, 104 byte

Chơi gôn

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

Ung dung:

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

Thông dịch viên là hơi không còn buggèd

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

Giải trình

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

Toán học, 67 64 byte

Cảm ơn Lastresort và TuukkaX đã nhắc nhở tôi rằng những người chơi golf nên lén lút và tiết kiệm 3 byte!

Thực hiện đơn giản. Trả về một chuỗi các chuỗi.

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

1
Sử dụng 0<1thay choTrue
u54112

1
Tôi nghĩ rằng j==1có thể giảm xuống j<1, và i==1để i<1.
Yytsi

3

Python 3, 104 95 byte

(phản hồi từ @ mbomb007: -9 byte)

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

(mã golf đầu tiên của tôi, đánh giá cao phản hồi)


Chào mừng bạn Bạn có thể xóa một số khoảng trắng, sử dụng range(y)thay vì range(0,y)và nếu nkhông bao giờ âm, bạn có thể sử dụngif n<1or n==~-y else
mbomb007


@ mbomb007 cảm ơn! Tôi sẽ kiểm tra.
Biarity

2

Mẻ, 128 byte

@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%^|

Lấy chiều rộng và chiều cao làm tham số dòng lệnh.


2

Haxe, 112 106 byte

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

Tủ thử

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

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

2

Java 135 byte

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

Chơi gôn

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

Tôi đếm 136 :) Bạn cũng có thể lưu một char bằng cách xóa khoảng trắng sau dấu phẩy đầu tiên.
Christian Rondeau

1
Trước hết, mã này không biên dịch. Ngay cả khi điều này sẽ biên dịch, nó sẽ không 'vẽ' một hình chữ nhật như OP hiện muốn. -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
"Tôi không thấy bất kỳ lý do tại sao nó không nên biên dịch". Sau đó là o+=x "|\n"gì : ? Bạn có nghĩa là để đặt +ở đó?
Yytsi

Cảm ơn. Tôi không muốn đặt bất kỳ nhân vật nào ở đó.
Roman Gräf

2

PowerShell v3 +, 55 byte

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

Đưa đầu vào $a$b. Vòng lặp từ 1đến $b. Mỗi lần lặp, chúng ta xây dựng một chuỗi. Phần giữa được chọn từ một mảng gồm hai chuỗi có độ dài đơn, sau đó nhân chuỗi $a-2, trong khi nó được bao quanh bởi các đường ống. Các chuỗi kết quả được để lại trên đường ống và đầu ra thông qua ẩnWrite-Output xảy ra khi hoàn thành chương trình, với dấu phân cách dòng mới mặc định.

Ngoài ra, cũng ở mức 55 byte

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

Điều này xuất hiện bởi vì tôi đang cố gắng đánh golf lựa chọn mảng ở giữa bằng cách sử dụng một chuỗi thay thế. Tuy nhiên, vì [char]thời gian [int]không được xác định, chúng tôi mất hết tiền tiết kiệm bằng cách cần phải tạo thành một chuỗi có parens và''+ .

Cả hai phiên bản đều yêu cầu v3 hoặc mới hơn cho người -invận hành.

Ví dụ

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 byte

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

lập chỉ mục một chuỗi tĩnh bao gồm cả dòng mới

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

Kính gửi downvoter: tại sao?
Tít

1
Có thể là do người dùng thấy rằng câu trả lời của bạn được gắn cờ là chất lượng thấp trong hàng đánh giá. Nếu bạn đăng một lời giải thích về mã của bạn, hoặc bất cứ điều gì nhiều hơn một lớp lót, bạn có thể tránh nó bị tự động gắn cờ.
mbomb007

@mbomb: Tôi chưa bao giờ thấy ai đăng một mô tả cho một oneliner bằng ngôn ngữ không phải là eso.
Tít

Hoặc đầu ra, hoặc một phiên bản không chơi gôn. Nó không quan trọng miễn là nội dung không quá ngắn. Nhưng có lẽ bạn đã không ở đây lâu nếu bạn chưa thấy điều đó. Một số lớp lót Python có thể khá phức tạp. Nhìn vào một số @ xnor's.
mbomb007

2

Ruby, 59 54 52 byte

Ồ, đơn giản hơn nhiều :)

->x,y{y.times{|i|puts"|#{(-~i%y<2??-:' ')*(x-2)}|"}}

Chạy thử tại ideone


1
You can save a couple bytes by using a literal newlines instead of \n.
Jordan

1
You can save bytes by not defining i and j. Replace i's definition with x-=2. Instead of j, just use (y-2).
m-chrzan

Yeah, thanks :)
daniero

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

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

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.


1

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 " ")) "|"]
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.