Dibuja un rectángulo ASCII

20

Dados dos enteros como entrada en una matriz, dibuje un rectángulo, usando el primer entero como ancho y el segundo como alto.

O, si su idioma lo admite, los dos enteros se pueden dar como entradas separadas.

Suponga que el ancho y la altura nunca serán inferiores a 3, y siempre se darán.

Resultados de ejemplo:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

Este es el código de golf, por lo que gana la respuesta con la menor cantidad de bytes.

MCMastery
fuente

Respuestas:

6

Jolf, 6 bytes

,ajJ'|

Pruébalo aquí! ¡Mi caja incorporada finalmente fue útil! :RE

,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
fuente
10

Jalea , 14 bytes

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

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

,þ%,ỊḄị“-|| ”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
fuente
Este es un uso maravilloso de :)
Lynn
9

Matlab, 69 65 56 bytes

Gracias @WeeingIfFirst y @LuisMendo por algunos bytes =)

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

Esto es realmente simple en Matlab: primero haga una matriz del tamaño deseado, luego indexe la primera y la última fila para insertar -, y haga lo mismo con la primera y la última columna para insertar |.

Por ejemplo f(4,3)devuelve

|--|
|  |
|--|
falla
fuente
@WeeingIfFirst ¡Oh, por supuesto, muchas gracias!
defecto
6 bytes más cortos:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin
Aún más corto:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo
@LuisMendo ¡Gracias! Todavía necesitamos la cadena resistente, de lo contrario, la matriz se convierte en una numérica.
defecto
@flawr z(b,a)=' 'se inicia como char. Después de eso, puede completar con números y se convierten automáticamente en char. zmantiene su tipo original
Luis Mendo
8

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>

Neil
fuente
¿Pasar una función de plantilla como argumento predeterminado? ¡Inteligente!
Florrie
8

Haskell, 62 55 bytes

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

Ejemplo de uso:

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

La función auxiliar ftoma una lista de dos elementos [a,b]y un número ny devuelve una lista de uno aseguido de n-2 bs seguido de uno a. Podemos usar ftres veces: para construir la línea superior / inferior:, f "|-" iuna línea media: f "| " iy de esos dos el rectángulo completo: f [<top>,<middle>] j(nota: jno aparece como un parámetro g idebido a una aplicación parcial).

Editar: @dianne guardó algunos bytes combinando dos Charargumentos en uno Stringde longitud 2. ¡Muchas gracias!

nimi
fuente
Me gusta la #idea!
flawr
2
Creo que puede guardar algunos bytes definiendo (a:b)#n=a:([3..n]>>b)++[a]y escribiendo["|-"#i,"| "#i]#j
dianne
@dianne: Muy inteligente. ¡Muchas gracias!
nimi
8

Python 2, 61 58 bytes

-3 bytes gracias a @flornquake (eliminar paréntesis innecesarios; usar hcomo contador)

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

Los casos de prueba están en ideone

Jonathan Allan
fuente
('- '[1<i<h])No necesita los paréntesis.
flornquake
Ahorre otro byte usando h como contador:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake
@flornquake Tenía la intención de comprobar la necesidad de esos paréntesis, pero lo olvidé. ¡Usar hcomo contador es inteligente! Gracias.
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
fuente
1
Todavía puedes ganar un byte con un salto de línea físico.
Tito
1
-2 bytes con en !$i|$n==++$ilugar de!$i|$n-1==$i++
Tito
1
otro byte con$i++&&$n-$i?" ":"-"
Tito
1
$i++&&$n-$i?" ":"-"-> "- "[$i++&&$n-$i](-2)
Tito
7

Vimscript, 93 83 75 74 73 66 64 63 bytes

Código

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

Ejemplo

:call A(3,3)

Explicación

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

Tenga en cuenta que no se está utilizando, norm!por lo que podría interferir con las asignaciones personalizadas de vim.

Christian Rondeau
fuente
5

MATL , 19 bytes

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

Pruébalo en línea!

Explicación

El enfoque es similar al utilizado en esta otra respuesta . El código crea una matriz numérica del formulario.

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

y luego sus valores se usan como índices (basados ​​en 1, modulares) en la cadena '|-| 'para producir el resultado deseado.

'|-| '                % 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
fuente
5

05AB1E , 23 22 20 bytes

Entrada tomada como altura, luego ancho.

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

Explicación

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

Pruébalo en línea!

Guardado 2 bytes gracias a Adnan

Emigna
fuente
El uso de subcadenas lugar de la instrucción if-else ahorra dos bytes: F„ -N_N¹<Q~è²Í×'|.ø,.
Adnan
5

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);}
orlp
fuente
4

Python 2, 56 bytes

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

flornquake salvó un byte.

Lynn
fuente
1
Buen uso del formato de cadena! Puede guardar un byte mediante la %cconversión:'-%*c'%(h-1,45)
flornquake
¡Oh, pensé que %*cni siquiera era una cosa! Gracias. :)
Lynn
'-%%%dc'%~-h%45También funciona para la misma longitud.
xnor
4

Lisp común, 104 bytes

Golfizado:

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

Sin golf:

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

fuente
3

Turtlèd , 40 bytes

Intérprete es ligeramente más largo sin micrófonos ocultos

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

Explicación

?                            - 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
Limón Destructible
fuente
3

Mathematica, 67 64 bytes

¡Gracias a lastresort y TuukkaX por recordarme que los golfistas deben ser astutos y ahorrar 3 bytes!

Implementación directa. Devuelve una matriz de cadenas.

Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&
Greg Martin
fuente
1
Uso 0<1en lugar deTrue
u54112
1
Creo que eso j==1se puede reducir a j<1, y i==1a i<1.
Yytsi
3

Python 3, 104 95 bytes

(comentarios de @ 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))

(mi primer código de golf, agradezco los comentarios)

Biariedad
fuente
¡Bienvenido! Puede eliminar algunos de los espacios, usar en range(y)lugar de range(0,y), y si nnunca es negativo, puede usarif n<1or n==~-y else
mbomb007
Vea la página de consejos de Python
mbomb007
@ mbomb007 gracias! Lo comprobaré.
Biarity
2

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

Toma ancho y alto como parámetros de línea de comandos.

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

Casos de prueba

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

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

Golfizado:

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
fuente
Cuento 136 :) También puedes guardar un personaje eliminando el espacio después de la primera coma.
Christian Rondeau
1
En primer lugar, este código no se compila. Incluso si esto compilara, no 'dibujaría' un rectángulo como el OP actualmente quiere. -1.
Yytsi
@ TuukkaX Solucioné el problema de la nueva línea, pero no veo ninguna razón por la que no debería compilarse. Por supuesto, tienes que poner ese código en una clase, pero luego debería funcionar.
Roman Gräf
1
"No veo ninguna razón por la que no debería compilarse". ¿Qué es esto entonces o+=x "|\n"? ¿Querías poner un +allí?
Yytsi
Gracias. No quería colocar ningún personaje allí.
Roman Gräf
2

PowerShell v3 +, 55 bytes

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

Toma entrada $ay $b. Bucles de 1a $b. Cada iteración, construimos una sola cadena. El medio se selecciona de una matriz de dos cadenas de longitud única, luego se multiplica por cadenas por$a-2 , mientras está rodeado de tuberías. Las cadenas resultantes se dejan en la tubería, y la salida por vía implícita Write-Outputocurre al finalizar el programa, con el separador de línea nueva predeterminado.

Alternativamente, también a 55 bytes

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

Esto ocurrió porque estaba tratando de jugar golf en la selección de matriz en el medio usando una cadena en su lugar. Sin embargo, dado que los [char]tiempos [int]no están definidos, perdemos los ahorros al necesitar convertirlos en una cadena con parens y''+ .

Ambas versiones requieren v3 o más reciente para el -in operador.

Ejemplos

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
fuente
2

PHP, 82 bytes

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

indexar una cadena estática que incluye la nueva línea

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
fuente
Querido votante: ¿por qué?
Tito
1
Podría deberse a que un usuario vio que su respuesta se marcó como de baja calidad en la cola de revisión. Si publica una explicación de su código, o algo más que una línea, puede evitar que se marque automáticamente.
mbomb007
@mbomb: Nunca he visto a nadie publicar una descripción de un línea en un idioma que no sea eso.
Tito
O salida, o una versión sin golf. No importa mientras el contenido no sea demasiado corto. Pero probablemente no has estado por mucho tiempo si no has visto eso. Algunas frases de Python pueden ser bastante complicadas. Mira algunos de @xnor's.
mbomb007
2

Ruby, 59 54 52 bytes

Oh, eso es mucho más simple :)

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

Prueba de funcionamiento en ideone

daniero
fuente
1
Puede guardar un par de bytes utilizando una nueva línea literal en lugar de \n.
Jordan
1
Puede guardar bytes al no definir iy j. Reemplace ila definición con x-=2. En lugar de j, solo úsalo (y-2).
m-chrzan
Sí, gracias :)
daniero
2

Perl, 48 bytes

Incluye +1 para -n

Dar tamaños como 2 líneas en STDIN

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

Solo el código:

say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"
Ton Hospel
fuente
Buena, como siempre. Tenga en cuenta que tiene un punto de retroceso al final de la línea mientras que probablemente quería escribir una cita simple ;-)
Dada
@Dada Fixed. Gracias.
Ton Hospel
2

Lua, 120 93 bytes

Ahorró bastantes bytes al eliminar estupideces sobre complejidades.

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

Sin golf:

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

Pruébalo en Repl.it

Un taco
fuente
1

Python 2, 67 bytes

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

Ejemplos

f(3,3)

|-|
| |
|-|

f(5,8)

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

f(10,3)

|--------|
|        |
|--------|
ElPedro
fuente
1

MATL , 21 17 bytes

Z"45ILJhY('|'5MZ(

Este es un enfoque ligeramente diferente al de 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)

¡Gracias @LuisMendo por toda la ayuda!

Pruébalo en línea!

falla
fuente
1

PHP 4.1, 76 bytes

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

Esto supone que tiene la php.iniconfiguración predeterminada para esta versión, que incluye short_open_tagyregister_globals habilitada.

Esto requiere acceso a través de un servidor web (por ejemplo: Apache), pasando los valores sobre las variables de sesión / cookie / POST / GET.
La tecla Wcontrola el ancho y la tecla Hcontrola la altura.
Por ejemplo:http://localhost/file.php?W=3&H=5

Ismael Miguel
fuente
@Titus Deberías leer el enlace. Cita: "A partir de PHP 4.2.0, esta directiva se desactiva por defecto ".
Ismael Miguel
Ay, perdón, me llevo todo de vuelta. Tienes la versión en tu título. Debería leer más cuidadosamente.
Tito
@Titus Está bien, no te preocupes. Perdón por ser duro contigo.
Ismael Miguel
No importa; Ese es el precio que pago por ser pedante. : D
Titus
@Titus No te preocupes por eso. Para que lo sepas, alrededor de la mitad de mis respuestas están escritas en PHP 4.1. Ahorra toneladas de bytes con entrada
Ismael Miguel
1

Python 3, 74 caracteres

p="|"
def r(w,h):m=w-2;b=p+"-"*m+p;return b+"\n"+(p+m*" "+p+"\n")*(h-2)+b
vpzomtrrfrt
fuente
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)

Creo que Swift 3 podría jugar mucho más, pero no tengo ganas de descargar Swift 3.

Danwakeem
fuente
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 " ")) "|"]
Biariedad
fuente