Dessiner un rectangle ASCII


20

Étant donné deux entiers en entrée dans un tableau, dessinez un rectangle, en utilisant le premier entier comme largeur et le second comme hauteur.

Ou, si votre langue le prend en charge, les deux entiers peuvent être donnés comme entrées distinctes.

Supposons que la largeur et la hauteur ne seront jamais inférieures à 3 et qu'elles seront toujours données.

Exemples de sorties:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

C'est le code-golf, donc la réponse avec le plus petit nombre d'octets l'emporte.

Réponses:


6

Jolf, 6 octets

,ajJ'|

Essayez-le ici! Ma boîte intégrée a finalement été utile! :RÉ

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

10

Gelée , 14 octets

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

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça fonctionne

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

Ceci est une merveilleuse utilisation de :)
Lynn

9

Matlab, 69 65 56 octets

Merci @WeeingIfFirst et @LuisMendo pour quelques octets =)

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

C'est très simple dans Matlab: créez d'abord une matrice de la taille souhaitée, puis indexez la première et la dernière ligne pour insérer le -, et faites de même avec la première et la dernière colonne à insérer |.

Par exemple, f(4,3)retourne

|--|
|  |
|--|

@WeeingIfFirst Oh, bien sûr, merci beaucoup!
flawr

6 octets plus court:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin

Encore plus court:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo

@LuisMendo Merci! Nous avons encore besoin de la chaîne dure, sinon le tableau est converti en numérique.
flawr

@flawr initialise en z(b,a)=' 'tant que char. Après cela, vous pouvez remplir des nombres et ils sont automatiquement convertis en caractères. zconserve son type d'origine
Luis Mendo

8

JavaScript (ES6), 63 octets

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>


Passer une fonction de modèle comme argument par défaut? Intelligent!
Florrie

8

Haskell, 62 55 octets

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

Exemple d'utilisation:

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

La fonction d'assistance fprend une liste de deux éléments [a,b]et un nombre net renvoie une liste d'un asuivi de n-2 bs suivi d'un a. Nous pouvons utiliser ftrois fois: pour construire la ligne supérieure / inférieure:f "|-" i une ligne médiane: f "| " iet à partir de ces deux le rectangle entier: f [<top>,<middle>] j(note: jn'apparaît pas comme paramètre dans en g iraison d'une application partielle).

Edit: @dianne a sauvé quelques octets en combinant deux Chararguments en un Stringde longueur 2. Merci beaucoup!


J'aime l' #idée!
flawr

2
Je pense que vous pouvez économiser quelques octets en définissant (a:b)#n=a:([3..n]>>b)++[a]et en écrivant["|-"#i,"| "#i]#j
dianne

@dianne: Très intelligent. Merci beaucoup!
nimi

8

Python 2, 61 58 octets

-3 octets grâce à @flornquake (supprimer les parenthèses inutiles; utiliser hcomme compteur)

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

Les cas de test sont à l' idéone


('- '[1<i<h])n'a pas besoin des parenthèses.
flornquake

Enregistrez un autre octet en utilisant h comme compteur:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake

@flornquake J'avais voulu vérifier la nécessité de ces parenthèses, mais j'ai oublié. Utiliser hcomme compteur est intelligent! Merci.
Jonathan Allan

8

PHP, 74 octets

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

1
Vous pouvez toujours gagner un octet avec un saut de ligne physique.
Titus

1
-2 octets avec !$i|$n==++$iau lieu de!$i|$n-1==$i++
Titus

1
un autre octet avec$i++&&$n-$i?" ":"-"
Titus

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

7

Vimscript, 93 83 75 74 73 66 64 63 octets

Code

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

Exemple

:call A(3,3)

Explication

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

Notez qu'il n'utilise pas norm!, il peut donc interférer avec les mappages personnalisés vim!


5

MATL , 19 octets

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

Essayez-le en ligne!

Explication

L'approche est similaire à celle utilisée dans cette autre réponse . Le code construit un tableau numérique de la forme

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

puis ses valeurs sont utilisées comme indices (modulaires basés sur 1) dans la chaîne '|-| 'pour produire le résultat souhaité.

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

Entrée prise en hauteur, puis en largeur.

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

Explication

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

Essayez-le en ligne!

Enregistré 2 octets grâce à Adnan


En utilisant au lieu du sous - chaînes deux octets sauve instruction if-else: F„ -N_N¹<Q~è²Í×'|.ø,.
Adnan

5

C, 73 octets

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 octets

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

flornquake a enregistré un octet.


1
Bonne utilisation du formatage des chaînes! Vous pouvez enregistrer un octet en utilisant la %cconversion:'-%*c'%(h-1,45)
flornquake

Oh, je pensais que ce %*cn'était même rien! Je vous remercie. :)
Lynn

'-%%%dc'%~-h%45fonctionne également pour la même longueur.
xnor

4

Lisp commun, 104 octets

Golfé:

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

Non golfé:

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

L'interprète n'est plus un peu buggé

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

Explication

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

Merci à lastresort et TuukkaX de m'avoir rappelé que les golfeurs devraient être sournois et économiser 3 octets!

Mise en œuvre simple. Renvoie un tableau de chaînes.

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

1
Utiliser 0<1à la place deTrue
u54112

1
Je pense que cela j==1peut être réduit à j<1et i==1à i<1.
Yytsi

3

Python 3, 104 95 octets

(rétroaction de @ mbomb007: -9 octets)

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

(mon premier code de golf, appréciez les commentaires)


Bienvenue! Vous pouvez supprimer certains espaces, utiliser à la range(y)place de range(0,y), et si ce nn'est jamais négatif, vous pouvez utiliserif n<1or n==~-y else
mbomb007

Voir la page des conseils Python
mbomb007

@ mbomb007 merci! Je vérifierai.
Biarity

2

Lot, 128 octets

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

Prend la largeur et la hauteur comme paramètres de ligne de commande.


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

Prend entrée $aet $b. Boucles de 1à $b. Chaque itération, nous construisons une seule chaîne. Le milieu est sélectionné dans un tableau de deux chaînes de longueur unique, puis multiplié par des chaînes $a-2, alors qu'il est entouré de tuyaux. Les chaînes résultantes sont laissées sur le pipeline et la sortie via implicite Write-Outputse produit à la fin du programme, avec un séparateur de nouvelle ligne par défaut.

Alternativement, également à 55 octets

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

Celui-ci est venu parce que j'essayais de jouer au golf la sélection de tableau au milieu en utilisant une chaîne à la place. Cependant, comme les [char]temps [int]ne sont pas définis, nous perdons les économies en ayant besoin de lancer une chaîne avec des parens et''+.

Les deux versions nécessitent la version 3 ou plus récente pour l' -inopérateur.

Exemples

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 octets

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

indexation d'une chaîne statique, y compris la nouvelle ligne

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 " ")) "|"]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.