Gambar Rectangle ASCII

20

Diberi dua bilangan bulat sebagai input dalam larik, gambarkan sebuah persegi panjang, menggunakan bilangan bulat pertama sebagai lebar dan kedua sebagai tinggi.

Atau, jika bahasa Anda mendukungnya, kedua bilangan bulat dapat diberikan sebagai input terpisah.

Asumsikan lebar dan tinggi tidak akan kurang dari 3, dan mereka akan selalu diberikan.

Contoh Keluaran:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

Ini adalah kode-golf, jadi jawabannya dengan jumlah byte terendah menang.

MCMastery
sumber

Jawaban:

6

Jolf, 6 byte

,ajJ'|

Coba di sini! Kotak saya builtin akhirnya berguna! : D

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

Jelly , 14 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

,þ%,ỊḄị“-|| ”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.
Dennis
sumber
Ini adalah penggunaan yang luar biasa dari :)
Lynn
9

Matlab, 69 65 56 byte

Terima kasih @WeeingIfFirst dan @LuisMendo untuk beberapa byte =)

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

Ini sangat sederhana di Matlab: Pertama buat matriks dengan ukuran yang diinginkan, kemudian buat indeks baris pertama dan terakhir untuk memasukkan -, dan lakukan hal yang sama dengan kolom pertama dan terakhir untuk disisipkan |.

Misalnya f(4,3)pengembalian

|--|
|  |
|--|
cacat
sumber
@WeeingIfFirst Oh, tentu saja, terima kasih banyak!
flawr
6 byte lebih pendek:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin
Bahkan lebih pendek:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo
@LuisMendo Terima kasih! Kita masih membutuhkan string yang tangguh, jika tidak array diubah menjadi numerik.
flawr
@ flawr menginisialisasi z(b,a)=' 'sebagai char. Setelah itu Anda dapat mengisi dengan angka dan mereka secara otomatis dilemparkan ke char. zmempertahankan tipe aslinya
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>

Neil
sumber
Melewati fungsi templat sebagai argumen default? Pintar!
Florrie
8

Haskell, 62 55 byte

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

Contoh penggunaan:

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

Fungsi helper fmengambil daftar elemen dua [a,b]dan nomor ndan mengembalikan daftar satu adiikuti oleh n-2 bs diikuti oleh satu a. Kita dapat menggunakan ftiga kali: untuk membangun garis atas / bawah:, garis f "|-" itengah: f "| " idan dari keduanya seluruh persegi panjang: f [<top>,<middle>] j(catatan: jtidak muncul sebagai parameter g ikarena aplikasi parsial).

Sunting: @dianne menyimpan beberapa byte dengan menggabungkan dua Charargumen menjadi satu Stringdengan panjang 2. Terima kasih banyak!

nimi
sumber
Saya suka #idenya!
flawr
2
Saya pikir Anda dapat menyimpan beberapa byte dengan mendefinisikan (a:b)#n=a:([3..n]>>b)++[a]dan menulis["|-"#i,"| "#i]#j
dianne
@dianne: Sangat pintar. Terima kasih banyak!
nimi
8

Python 2, 61 58 byte

-3 byte terima kasih kepada @flornquake (hapus tanda kurung yang tidak perlu; gunakan hsebagai penghitung)

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

Kasus uji ada di ideone

Jonathan Allan
sumber
('- '[1<i<h])tidak membutuhkan tanda kurung.
flornquake
Simpan byte lain dengan menggunakan h sebagai penghitung:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake
@flakequake Aku bermaksud memeriksa kebutuhan tanda kurung itu, tetapi lupa. Menggunakan hpenghitung itu pintar! Terima kasih.
Jonathan Allan
8

PHP, 74 Bytes

for(;$i<$n=$argv[2];)echo str_pad("|",$argv[1]-1,"- "[$i++&&$n-$i])."|\n";
Jörg Hülsermann
sumber
1
Anda masih dapat memenangkan satu byte dengan linebreak fisik.
Titus
1
-2 byte dengan !$i|$n==++$ibukannya!$i|$n-1==$i++
Titus
1
byte lain dengan$i++&&$n-$i?" ":"-"
Titus
1
$i++&&$n-$i?" ":"-"-> "- "[$i++&&$n-$i](-2)
Titus
7

Vimscript, 93 83 75 74 73 66 64 63 byte

Kode

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

Contoh

:call A(3,3)

Penjelasan

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

Perhatikan bahwa itu tidak menggunakan norm!sehingga dapat mengganggu pemetaan kustom vim!

Christian Rondeau
sumber
5

MATL , 19 byte

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

Cobalah online!

Penjelasan

Pendekatannya mirip dengan yang digunakan dalam jawaban lain ini . Kode membangun susunan numerik formulir

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

dan kemudian nilainya digunakan sebagai indeks (berbasis-1, modular) ke dalam string '|-| 'untuk menghasilkan hasil yang diinginkan.

'|-| '                % 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
Luis Mendo
sumber
5

05AB1E , 23 22 20 byte

Input diambil sebagai tinggi, lalu lebar.

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

Penjelasan

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

Cobalah online!

Disimpan 2 byte berkat Adnan

Emigna
sumber
Menggunakan substring bukan pernyataan jika-lain menghemat dua byte: F„ -N_N¹<Q~è²Í×'|.ø,.
Adnan
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);}
orlp
sumber
4

Python 2, 56 byte

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

flornquake menyimpan satu byte.

Lynn
sumber
1
Penggunaan format string yang bagus! Anda dapat menyimpan satu byte menggunakan %ckonversi:'-%*c'%(h-1,45)
flornquake
Oh, kupikir %*citu bahkan bukan apa-apa! Terima kasih. :)
Lynn
'-%%%dc'%~-h%45juga bekerja dengan panjang yang sama.
xnor
4

Common Lisp, 104 byte

Golf:

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

Tidak Terkumpul:

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

sumber
3

Turtlèd , 40 byte

Penerjemah sedikit tidak lagi bermasalah

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

Penjelasan

?                            - 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
Lemon dirusak
sumber
3

Mathematica, 67 64 byte

Terima kasih kepada lastresort dan TuukkaX untuk mengingatkan saya bahwa pegolf harus licik dan menghemat 3 byte!

Implementasi langsung. Mengembalikan array string.

Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&
Greg Martin
sumber
1
Gunakan 0<1di tempatTrue
u54112
1
Saya pikir itu j==1dapat dikurangi menjadi j<1, dan i==1menjadi i<1.
Yytsi
3

Python 3, 104 95 byte

(umpan balik dari @ 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))

(golf kode pertama saya, hargai umpan balik)

Biaritas
sumber
Selamat datang! Anda dapat menghapus beberapa spasi, gunakan range(y)alih-alih range(0,y), dan jika ntidak pernah negatif Anda dapat menggunakanif n<1or n==~-y else
mbomb007
Lihat halaman tips Python
mbomb007
@ mbomb007 terima kasih! Saya akan mengeceknya.
Biarity
2

Batch, 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%^|

Mengambil lebar dan tinggi sebagai parameter baris perintah.

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

Testcases

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

R(10, 3)
|---------|
|         |
|---------|
Yytsi
sumber
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;
}

Golf:

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;}
Roman Gräf
sumber
Saya menghitung 136 :) Anda juga dapat menyimpan char dengan menghapus spasi setelah koma pertama.
Christian Rondeau
1
Pertama-tama, kode ini tidak dikompilasi. Bahkan jika ini akan dikompilasi, itu tidak akan 'menggambar' persegi panjang seperti OP saat ini inginkan. -1.
Yytsi
@ TuukkaX Saya memperbaiki masalah baris baru itu, tapi saya tidak melihat alasan mengapa itu tidak bisa dikompilasi. Tentu saja Anda harus meletakkan kode itu di kelas, tetapi kemudian itu harus bekerja.
Roman Gräf
1
"Saya tidak melihat alasan mengapa itu tidak boleh dikompilasi". Lalu apa ini o+=x "|\n"? Apakah Anda bermaksud meletakkannya di +sana?
Yytsi
Terima kasih. Saya tidak ingin menempatkan karakter di sana.
Roman Gräf
2

PowerShell v3 +, 55 byte

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

Mengambil input $adan $b. Loop dari 1ke $b. Setiap iterasi, kami membuat satu string. Bagian tengah dipilih dari array dari dua string panjang tunggal, kemudian string-dikalikan dengan $a-2, sementara itu dikelilingi oleh pipa. String yang dihasilkan dibiarkan dalam pipa, dan output melalui implisit Write-Outputterjadi pada penyelesaian program, dengan pemisah baris baru default.

Atau, juga pada 55 byte

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

Yang ini muncul karena saya mencoba golf pemilihan array di tengah dengan menggunakan string sebagai gantinya. Namun, karena [char]waktu [int]tidak ditentukan, kami kehilangan tabungan dengan harus menggunakan string dengan parens dan''+ .

Kedua versi memerlukan v3 atau yang lebih baru untuk -inoperator.

Contohnya

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

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

PHP, 82 byte

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

mengindeks string statis termasuk baris baru

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
    ];
Titus
sumber
Dear downvoter: mengapa?
Titus
1
Mungkin karena pengguna melihat bahwa jawaban Anda ditandai sebagai kualitas rendah dalam antrian peninjauan. Jika Anda memposting penjelasan kode Anda, atau lebih dari satu kalimat, Anda dapat menghindarinya secara otomatis ditandai.
mbomb007
@ MBomb: Saya belum pernah melihat orang yang memposting deskripsi untuk oneliner dalam bahasa non-eso.
Titus
Atau keluaran, atau versi non-golf. Tidak masalah asalkan isinya tidak terlalu pendek. Tapi Anda mungkin belum ada lama jika Anda belum melihat itu. Beberapa Python one-liners bisa sangat rumit. Lihatlah beberapa dari @ xnor.
mbomb007
2

Ruby, 59 54 52 byte

Oh, itu jauh lebih sederhana :)

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

Tes dijalankan di ideone

daniero
sumber
1
Anda dapat menyimpan beberapa byte dengan menggunakan baris baru literal alih-alih \n.
Jordan
1
Anda dapat menyimpan byte dengan tidak mendefinisikan idan j. Ganti idefinisi dengan x-=2. Alih-alih j, gunakan saja (y-2).
m-chrzan
Ya, terima kasih :)
daniero
2

Perl, 48 byte

Termasuk +1 untuk -n

Berikan ukuran sebagai 2 baris pada STDIN

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

Hanya kode:

say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"
Ton Hospel
sumber
Bagus, seperti biasa. Perhatikan bahwa Anda mendapatkan backtick di akhir baris sementara Anda mungkin ingin menulis satu kutipan ;-)
Dada
Dada Tetap. Terima kasih.
Ton Hospel
2

Lua, 120 93 byte

Disimpan beberapa byte dengan menghilangkan kebodohan atas kerumitan.

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

Tidak Terkumpul:

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

Cobalah di Repl.it

ATaco
sumber
1

Python 2, 67 byte

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

Contohnya

f(3,3)

|-|
| |
|-|

f(5,8)

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

f(10,3)

|--------|
|        |
|--------|
ElPedro
sumber
1

MATL , 21 17 byte

Z"45ILJhY('|'5MZ(

Ini adalah pendekatan yang sedikit berbeda dari yang ada 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)

Terima kasih @LuisMendo untuk semua bantuannya!

Cobalah secara Online!

cacat
sumber
1

PHP 4.1, 76 byte

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

Ini mengasumsikan Anda memiliki php.inipengaturan default untuk versi ini, termasuk short_open_tagdanregister_globals diaktifkan.

Ini membutuhkan akses melalui server web (mis: Apache), meneruskan nilai-nilai melalui variabel sesi / cookie / POST / GET.
Kunci Wmengontrol lebar dan kunci Hmengontrol ketinggian.
Sebagai contoh:http://localhost/file.php?W=3&H=5

Ismael Miguel
sumber
@Itus Anda harus membaca tautannya. Mengutip: "Pada PHP 4.2.0, arahan ini defaultnya tidak aktif ".
Ismael Miguel
Aduh, maaf saya mengambil semuanya kembali. Anda memiliki versi dalam judul Anda. Saya harus membaca lebih cermat.
Titus
@Titus Tidak apa-apa, jangan khawatir. Maaf sudah bersikap kasar padamu.
Ismael Miguel
Sudahlah; itulah harga yang saya bayar untuk menjadi jagoan. : D
Titus
@Itus Jangan khawatir tentang itu. Asal tahu saja, sekitar setengah dari jawaban saya ditulis dalam PHP 4.1. Menghemat banyak byte dengan input
Ismael Miguel
1

Python 3, 74 karakter

p="|"
def r(w,h):m=w-2;b=p+"-"*m+p;return b+"\n"+(p+m*" "+p+"\n")*(h-2)+b
vpzomtrrfrt
sumber
1

Swift (2.2) 190 byte

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)

Saya pikir Swift 3 bisa bermain golf ini lebih banyak tetapi saya tidak ingin mengunduh Swift 3.

Danwakeem
sumber
1

F #, 131 byte

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 " ")) "|"]
Biaritas
sumber