ASCII Dikdörtgen Çiz


20

Bir diziye girdi olarak iki tamsayı verildiğinde, ilk tamsayıyı genişlik ve ikincisini yükseklik olarak kullanarak bir dikdörtgen çizin.

Diliniz destekliyorsa, iki tamsayı ayrı girişler olarak verilebilir.

Genişlik ve yüksekliğin asla 3'ten az olmayacağını ve her zaman verileceğini varsayalım.

Örnek Çıktılar:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

Bu kod golf, bu yüzden en düşük bayt miktarı ile cevap kazanır.

Yanıtlar:


6

Jolf, 6 bayt

,ajJ'|

Burada deneyin! Benim kutu yerleşik nihayet kullanışlı geldi! : D

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

10

Jöle , 14 bayt

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

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

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

Bu harika bir kullanım :)
Lynn

9

Matlab, 69 65 56 bayt

@WeeingIfFirst ve @LuisMendo'ya bazı baytlar için teşekkürler =)

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

Matlab'da bu gerçekten basittir: Önce istenen boyutta bir matris yapın, ardından eklemek için ilk ve son satırı dizine ekleyin ve eklemek -için ilk ve son sütunla aynı şeyi yapın |.

Örneğin f(4,3)iadeler

|--|
|  |
|--|

@WeeingIfFirst Oh, elbette, çok teşekkür ederim!
flawr

6 bayt daha kısa:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin

Daha da kısa:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo

@LuisMendo Teşekkürler! Hala zor bir dizeye ihtiyacımız var, aksi takdirde dizi sayısal bir diziye dönüştürülür.
flawr

@flawr z(b,a)=' 'karakter olarak başlatılır . Bundan sonra sayılarla doldurabilirsiniz ve bunlar otomatik olarak karaktere dökülür. zorijinal tipini koruyor
Luis Mendo

8

JavaScript (ES6), 63 bayt

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>


Şablon işlevini varsayılan bağımsız değişken olarak mı geçiyorsunuz? Zeki!
Florrie

8

Haskell, 62 55 bayt

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

Kullanım örneği:

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

Yardımcı işlevi fiki elemanlı bir liste [a,b]ve bir sayı alır ve bir ntanesinin listesini ve aardından gelenn-2 b s ve ardındana . fÜst / alt çizgiyi:, f "|-" ibir orta çizgiyi: f "| " ive bu ikisinden tüm dikdörtgeni oluşturmak için üç kez kullanabiliriz : f [<top>,<middle>] j(not: jiçinde bir parametre olarak görünmezg i kısmi uygulama nedeniyle ).

Düzenleme: @dianne iki birleştirerek bazı bayt kaydetti Char argüman Stringuzunluğunda 2 . Çok teşekkürler!


Bu #fikri seviyorum!
flawr

2
Sanırım tanımlayıp (a:b)#n=a:([3..n]>>b)++[a]yazarak birkaç bayt kaydedebilirsiniz["|-"#i,"| "#i]#j
dianne

@dianne: Çok zeki. Çok teşekkürler!
nimi

8

Python 2, 61 58 bayt

@Flornquake sayesinde -3 bayt (gereksiz parantezleri kaldırın; hsayaç olarak kullanın )

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

Test senaryoları ideone'de


('- '[1<i<h])parantez gerekmez.
flornquake

H öğesini sayaç olarak kullanarak başka bir bayt exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
kaydetme

@flornquake Bu parantezlerin gerekliliğini kontrol etmek istedim, ama unuttum. hSayaç olarak kullanmak akıllı! Teşekkürler.
Jonathan Allan

8

PHP, 74 Bayt

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

1
Fiziksel bir çizgiyle hala bir bayt kazanabilirsiniz.
Titus

1
-2 sahip bayt !$i|$n==++$iyerine!$i|$n-1==$i++
Titus

1
başka bir bayt$i++&&$n-$i?" ":"-"
Titus

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

7

Vimscript, 93 83 75 74 73 66 64 63 bayt

kod

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

Misal

:call A(3,3)

açıklama

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!Vim özel eşlemelerine müdahale edebilmesi için kullanmadığını unutmayın !


5

MATL , 19 bayt

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

Çevrimiçi deneyin!

açıklama

Yaklaşım bu diğer cevapta kullanılana benzer . Kod, formun sayısal bir dizisini oluşturur

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

ve daha sonra değerleri '|-| ', istenen sonucu elde etmek için dizeye (1 tabanlı, modüler) indeksler olarak kullanılır.

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

Giriş yükseklik, ardından genişlik olarak alınır.

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

açıklama

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

Çevrimiçi deneyin!

Adnan sayesinde 2 bayt tasarruf etti


Yerine if-else deyimi substrings kullanma iki bayt kaydeder: F„ -N_N¹<Q~è²Í×'|.ø,.
Adnan

5

C, 73 bayt

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 bayt

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

flornquake bir bayt kurtardı.


1
Dize biçimlendirmenin güzel kullanımı! %cDönüştürmeyi kullanarak bir bayt kaydedebilirsiniz :'-%*c'%(h-1,45)
flornquake

Oh, %*cbir şey bile olmadığını düşündüm ! Teşekkür ederim. :)
Lynn

'-%%%dc'%~-h%45aynı uzunlukta çalışır.
xnor

4

Ortak Lisp, 104 bayt

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

3

Turtlèd , 40 bayt

Tercüman artık biraz buggèd değil

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

açıklama

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

Golfçülerin sinsi ve 3 bayt tasarruf etmesi gerektiğini hatırlattığı için lastresort ve TuukkaX'a teşekkürler!

Kolay uygulama. Bir dizgi dizisi döndürür.

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

1
0<1Yerinde kullanımTrue
u54112

1
Ben düşünüyorum j==1indirgenebilir j<1ve i==1için i<1.
Yytsi

3

Python 3, 104 95 bayt

(@ mbomb007 geri bildirimi: -9 bytes)

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

(ilk kodum golf, geribildirim için teşekkür ederiz)


Hoşgeldiniz! Bazı boşlukları kaldırabilir, range(y)yerine kullanabilirsiniz range(0,y)ve nasla negatif değilse kullanabilirsinizif n<1or n==~-y else
mbomb007

Bkz Python ipuçları sayfasını
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

Ruby, 59 54 52 bytes

Oh, that's a lot simpler :)

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

Test run at 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 " ")) "|"]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.