Desenhar um retângulo ASCII

20

Dados dois números inteiros como entrada em uma matriz, desenhe um retângulo, usando o primeiro número inteiro como largura e o segundo como altura.

Ou, se o seu idioma suportar, os dois números inteiros podem ser dados como entradas separadas.

Suponha que a largura e a altura nunca serão menores que 3 e sempre serão fornecidas.

Exemplo de saídas:

[3, 3]

|-|
| |
|-|

[5, 8]

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

[10, 3]

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

Isso é código-golfe, então a resposta com a menor quantidade de bytes vence.

MCMastery
fonte

Respostas:

6

Jolf, 6 bytes

,ajJ'|

Experimente aqui! Minha caixa embutida finalmente veio a calhar! : 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
fonte
10

Gelatina , 14 bytes

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

Experimente online! ou verifique todos os casos de teste .

Como 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
fonte
Este é um uso maravilhoso de :)
Lynn
9

Matlab, 69 65 56 bytes

Obrigado @WeeingIfFirst e @LuisMendo por alguns bytes =)

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

Isso é realmente simples no Matlab: primeiro faça uma matriz do tamanho desejado, depois indexe a primeira e a última linha para inserir o -e faça o mesmo com a primeira e a última coluna a inserir |.

Por exemplo, f(4,3)retorna

|--|
|  |
|--|
flawr
fonte
@WeeingIfFirst Oh, claro, muito obrigado!
flawr
6 bytes mais curtos:z([1,b],1:a)=45;z(1:b,[1,a])=124;z=[z,'']
Stewie Griffin
Ainda mais curto:z(b,a)=' ';z([1,b],:)=45;z(:,[1,a])=124
Luis Mendo
@LuisMendo Thanks! Ainda precisamos da string resistente, caso contrário, a matriz é convertida em numérica.
flawr
@flawr inicializa z(b,a)=' 'como char. Depois disso, você pode preencher com números e eles são convertidos automaticamente para char. zmantém seu 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
fonte
Passando uma função de modelo como argumento padrão? Inteligente!
Florrie
8

Haskell, 62 55 bytes

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

Exemplo de uso:

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

A função auxiliar fpega uma lista de dois elementos [a,b]e um número ne retorna uma lista de um aseguido por n-2 bs seguido por um a. Podemos usar ftrês vezes: para construir a linha superior / inferior:, f "|-" iuma linha do meio: f "| " ie a partir dessas duas o retângulo inteiro: f [<top>,<middle>] j(nota: jnão aparece como parâmetro por g icausa da aplicação parcial).

Edit: @dianne salvou alguns bytes combinando dois Charargumentos em um Stringde comprimento 2. Muito obrigado!

nimi
fonte
Eu gosto da #ideia!
flawr
2
Eu acho que você pode economizar alguns bytes por definir (a:b)#n=a:([3..n]>>b)++[a]e escrever["|-"#i,"| "#i]#j
Dianne
@ Diana: Muito inteligente. Muito obrigado!
nimi
8

Python 2, 61 58 bytes

-3 bytes graças a @flornquake (remova parênteses desnecessários; use hcomo contador)

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

Os casos de teste são ideológicos

Jonathan Allan
fonte
('- '[1<i<h])não precisa dos parênteses.
Flornquake 19/09/16
Salve outro byte usando h como contador:exec"print'|'+'- '[1<h<%d]*(w-2)+'|';h-=1;"%h*h
flornquake 19/09/16
@flornquake eu pretendia verificar a necessidade desses parênteses, mas esqueci. Usar hcomo contador é inteligente! Obrigado.
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
fonte
1
Você ainda pode ganhar um byte com uma quebra de linha física.
Titus
1
-2 bytes com em !$i|$n==++$ivez de!$i|$n-1==$i++
Titus
1
outro byte com$i++&&$n-$i?" ":"-"
Titus
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

Exemplo

:call A(3,3)

Explicação

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

Observe que ele não está sendo usado, norm!portanto pode interferir nos mapeamentos personalizados do vim!

Christian Rondeau
fonte
5

MATL , 19 bytes

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

Experimente online!

Explicação

A abordagem é semelhante à usada nesta outra resposta . O código cria uma matriz numérica do formulário

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

e então seus valores são usados ​​como índices (com base em 1 modular) na cadeia '|-| 'de caracteres para produzir o resultado desejado.

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

05AB1E , 23 22 20 bytes

Entrada tomada como altura e largura.

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

Explicação

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

Experimente online!

Economizou 2 bytes graças a Adnan

Emigna
fonte
Usando substrings em vez da instrução if-else salva dois 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
fonte
4

Python 2, 56 bytes

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

flornquake salvou um byte.

Lynn
fonte
1
Bom uso da formatação de strings! Você pode salvar um byte usando a %cconversão:'-%*c'%(h-1,45)
flornquake 19/09/16
Oh, eu pensei que %*cnão era nada! Obrigado. :)
Lynn
'-%%%dc'%~-h%45também funciona para o mesmo comprimento.
xnor
4

Lisp comum, 104 bytes

Golfe:

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

fonte
3

Turtlèd , 40 bytes

Intérprete é ligeiramente não grampeado

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

Explicação

?                            - 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ão destrutível
fonte
3

Mathematica, 67 64 bytes

Agradeço a lastresort e TuukkaX por me lembrarem que os jogadores de golfe devem ser sorrateiros e economizar 3 bytes!

Implementação direta. Retorna uma matriz de seqüências de caracteres.

Table[Which[j<2||j==#,"|",i<2||i==#2,"-",0<1," "],{i,#2},{j,#}]&
Greg Martin
fonte
1
Use 0<1no lugar deTrue
u54112
1
Eu acho que isso j==1pode ser reduzido para j<1e i==1para i<1.
Yytsi 19/09/16
3

Python 3, 104 95 bytes

(feedback 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))

(meu primeiro código de golfe, agradeço o feedback)

Biarity
fonte
Bem vinda! Você pode remover alguns dos espaços, userange(y) em vez de range(0,y), e se nnão for negativo, você pode usarif n<1or n==~-y else
mbomb007
Veja o página de dicas Python
mbomb007
@ mbomb007 obrigado! Vou dar uma olhada.
Biarity 19/09/16
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 largura e altura como parâmetros da linha de comando.

Neil
fonte
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 teste

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

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

Golfe:

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
fonte
Conto 136 :) Você também pode salvar um caractere removendo o espaço após a primeira vírgula.
Christian Rondeau
1
Primeiro de tudo, esse código não compila. Mesmo se isso fosse compilado, ele não 'desenharia' um retângulo como o OP atualmente deseja. -1.
Yytsi 18/09/16
@TuukkaX Corrigi o problema da nova linha, mas não vejo motivo para não compilar. Claro que você precisa colocar esse código em uma classe, mas deve funcionar.
Roman Gräf
1
"Não vejo motivo para não compilar". O que é isso então o+=x "|\n":? Você quis colocar um +lá?
Yytsi 19/09/16
Obrigado. Eu não queria colocar nenhum personagem lá.
Roman Gräf
2

PowerShell v3 +, 55 bytes

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

Pega entrada $ae $b. Loops de 1para $b. Cada iteração, construímos uma única string. O meio é selecionado a partir de uma matriz de duas cadeias de comprimento único, depois multiplicadas por cadeias $a-2, enquanto é cercada por tubos. As seqüências resultantes são deixadas no pipeline e produzidas via implícitaWrite-Output acontece na conclusão do programa, com o separador de nova linha padrão.

Como alternativa, também a 55 bytes

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

Este surgiu porque eu estava tentando jogar golfe na seleção de array no meio usando uma string. No entanto, desde os [char]tempos[int] não está definido, perdemos a economia ao precisar converter como uma string com parens e ''+.

Ambas as versões requerem v3 ou mais recente para o -in operador.

Exemplos

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

PHP, 82 bytes

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

indexando uma sequência estática, incluindo a nova linha

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
fonte
Caro downvoter: por quê?
Titus
1
Pode ser porque um usuário viu que sua resposta foi sinalizada como baixa qualidade na fila de revisão. Se você postar uma explicação do seu código ou algo além de uma única linha, poderá evitar que ele seja sinalizado automaticamente.
mbomb007
@mbomb: Eu nunca vi alguém postar uma descrição para um oneliner em um idioma não eso.
Titus
Ou saída, ou uma versão sem golfe. Não importa, desde que o conteúdo não seja muito curto. Mas você provavelmente não existe há muito tempo, se você não viu isso. Alguns one-liners do Python podem ser bastante complicados. Veja alguns dos @ xnor's.
mbomb007
2

Ruby, 59 54 52 bytes

Oh, isso é muito mais simples :)

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

Teste executado em ideone

daniero
fonte
1
Você pode salvar alguns bytes usando uma nova linha literal em vez de \n.
Jordan
1
Você pode salvar bytes não definindo ie j. Substitua ia definição por x-=2. Em vez de j, basta usar (y-2).
M-chrzan 19/09/16
Sim, obrigado :)
daniero
2

Perl, 48 bytes

Inclui +1 para -n

Dê tamanhos como 2 linhas em STDIN

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

Apenas o código:

say"|".$_ x($`-2)."|"for"-",($")x(<>-1-/$/),"-"
Ton Hospel
fonte
Legal, como sempre. Note-se que você tem uma crase no final da linha, enquanto você provavelmente queria escrever uma única citação ;-)
Dada
@Dada Fixed. Obrigado.
Ton Hospel
2

Lua, 120 93 bytes

Economizou alguns bytes removendo estúpido por complexidades.

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

Experimente no Repl.it

ATaco
fonte
1

Python 2, 67 bytes

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

Exemplos

f(3,3)

|-|
| |
|-|

f(5,8)

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

f(10,3)

|--------|
|        |
|--------|
ElPedro
fonte
1

MATL , 21 17 bytes

Z"45ILJhY('|'5MZ(

Essa é uma abordagem um pouco diferente da do Deus MATL .

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)

Obrigado @LuisMendo por toda a ajuda!

Experimente Online!

flawr
fonte
1

PHP 4.1, 76 bytes

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

Isso pressupõe que você tenha as php.iniconfigurações padrão para esta versão, incluindo short_open_tageregister_globals habilitado.

Isso requer acesso através de um servidor web (por exemplo: Apache), passando os valores pelas variáveis ​​session / cookie / POST / GET.
A chave Wcontrola a largura e a chave Hcontrola a altura.
Por exemplo:http://localhost/file.php?W=3&H=5

Ismael Miguel
fonte
@ Titus Você deve ler o link. Citação: "No PHP 4.2.0, esta diretiva é desativada ".
Ismael Miguel
Ai desculpe, eu retiro tudo. Você tem a versão no seu título. Eu deveria ler com mais atenção.
Titus
@ Titus Tudo bem, não se preocupe. Desculpe por ser duro com você.
Ismael Miguel
Deixa pra lá; esse é o preço que pago por ser pedante. : D
Tito
@ Titus Não se preocupe. Só para você saber, cerca de metade das minhas respostas estão escritas no PHP 4.1. Ele economiza toneladas de bytes com a 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
fonte
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)

Acho que o Swift 3 poderia jogar muito mais isso, mas não sinto vontade de baixar o Swift 3.

Danwakeem
fonte
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 " ")) "|"]
Biarity
fonte