A letra E com E

19

Sua tarefa é exibir a letra ASCII em forma de letra "E" abaixo, com cinco entradas.

Exemplos:

Entrada: 7,2,+,|,-(Nota: você não precisa seguir este formato de entrada exato e, se não o usar, deve explicar como o seu próprio formato de entrada funciona)

Explicação:

  • 7 largura total, incluindo os caracteres de borda esquerda e direita.

  • 2 Número de caracteres verticais.

  • + O caractere que deve ser exibido nas bordas.

  • | O caractere que deve ser exibido verticalmente entre as bordas.

  • - O caractere que deve ser exibido horizontalmente.

Saída do exemplo acima:

+-----+ 
|
|
+-----+
|
|
+-----+


Outros exemplos:

Entrada: 7,2,@,|,-

Resultado:

@-----@
|
|
@-----@
|
|
@-----@


Entrada: 7,2,+,|,#

Resultado:

+#####+
|
|
+#####+
|
|
+#####+


Entrada: 8,3,+,|,#

Resultado:

+######+
|
|
|
+######+
|
|
|
+######+


Entrada: 8,3,+,@,#

Resultado:

+######+
@
@
@
+######+
@
@
@
+######+


Entrada: 9,4,^,$,!

Resultado:

^!!!!!!!^
$
$
$
$
^!!!!!!!^
$
$
$
$
^!!!!!!!^


Trapaças e brechas padrão não são permitidas.

Seu código não deve imprimir nada para STDERR.

Seu código pode aceitar qualquer codificação de caracteres que você escolher como entrada, mas qualquer codificação de caracteres que você escolher deve, no mínimo, suportar todos os 95 caracteres ASCII imprimíveis.

O código mais curto, em bytes, que completa esse desafio com sucesso, é o código vencedor.

Entre os melhores

Buffer Over Read
fonte
27
Não gosto do caso especial de "nenhuma contribuição dada". Na minha opinião, isso não adiciona nada ao desafio e complica muito por nada.
Yytsi 3/09/16
3
O título é porque você poderia dar Ecomo entrada e fazer um Ecom Es?
Trichoplax # /
3
Apesar de eu não gostar, o que realmente significa 'sem entrada'? Minha solução Floroid ficará suspensa pelo resto da eternidade se você não passar informações. Para que minha solução seja competitiva, você teria que passar 5 zeros e eu teria que verificar se as entradas são zeros e tratar adequadamente ...? -1.
Yytsi 3/09/16
4
@TheBitByte Veja meu segundo comentário para ver o que eu acho realmente errado. Agora que você editou isso, +1.
Yytsi 3/09/16
11
@Kevin Yup. Eu estava apenas tendo um pouco de confusão com a interpretação de 'sem entrada'. String vazia não é igual a 'nenhuma entrada' na minha mente. E eu estava tão acostumado a executar o código dentro de um intérprete, no qual literalmente espero que a entrada seja alimentada, por isso joguei isso lá fora.
Yytsi 4/09/16

Respostas:

6

05AB1E , 16 14 bytes

Í×s.ø©|`×`»D®»

Explicação

Í×                  # create a string of the correct nr of horizontal chars
  s.ø               # add the corner char on both sides
     ©              # save in register while keeping it on the stack
      |`            # push the remaining inputs to the top of the stack
        ×`          # push the correct nr of vertical chars on the stack
          »         # join on newline (joining the top vertical and horizontal sections)
           D        # duplicate this
            ®       # push the horizontal part again
             »      # join everything on newline

Experimente online!

Guardado 4 bytes graças a Adnan.

Emigna
fonte
11
Por curiosidade, por que você está usando o ©registro: p?
Adnan
11
@ Adnan: Boa captura! Eu ia, mas acabei não o usando e esqueci de removê-lo :)
Emigna
11
@muddyfish: Lendo a explicação da pergunta, essa parte não era óbvia, então eu perdi. Obrigado por me avisar!
Emigna
11
Há também um comando especial envolvente que funciona aqui: Í×s.øU×S»X»D»Xr».
Adnan
2
@ Adnan: Você está certo. Bem pensado! Eu nunca usei isso antes :)
Emigna
6

Python, 53 51 55 Bytes

lambda a,b,c,d,e:d.join("\n"*-~b).join([c+e*(a-2)+c]*3)

+4 bytes graças a @nimi

função lambda anônima, para chamá-la, escreva f=antes dela. Exemplo:

>>> print f(4,1,"€","|","-")
€--€
|
€--€
|
€--€

alternativa, 53 bytes

lambda a,b,c,d,e:((c+e*a+c+"\n"+(d+"\n")*b)*3)[:-b*2]

versão antiga com o caso especial de não entrada, 69 65 63 bytes

yay para mudar os requisitos no meio do desafio ...

lambda a=1,b=1,(c,d,e)="+|-":d.join("\n"*-~b).join([c+e*a+c]*3)
KarlKastor
fonte
2
Erro pequeno: o primeiro argumento ( 2no seu exemplo) é o comprimento total da linha, incluindo os cantos, portanto a entrada correta para sua forma é f(4,1 ...).
nimi
@ nimi obrigado pela dica. (+4 bytes :() PO primeiro exemplo é um pouco confuso (Algumas das outras respostas têm este aswell bug).
KarlKastor
4

C, 167 161 159 bytes

Sim.

#define p putchar
i,j;g(a,c,e){p(c);for(i=2;i++<a;)p(e);p(c);p(10);}h(b,d){for(i=0;i++<b;){p(d);p(10);}}f(a,b,c,d,e){g(a,c,e);h(b,d);g(a,c,e);h(b,d);g(a,c,e);}

Experimente no Ideone, com alguns casos de teste

betseg
fonte
2
coloca ("") -> p ('\ n')? ou até p (10), se isso funcionar
#
Como eu senti falta disso! Obrigado, @RiaD.
betseg 4/09/16
Além disso, se você começar a loop com 2, você vai economizar para mais bytes
Riad
3

Ruby, 54 45 42 bytes

->x,y,c,v,h{[c+h*~-~-x+c+$/]*3*((v+$/)*y)}

É uma função anônima que toma a parte diferente da entrada como parâmetros separados e retorna o resultado como uma sequência completa.

Por exemplo,

f=->x,y,c,v,h{[c+h*~-~-x+c+$/]*3*((v+$/)*y)}
puts f[6, 2, 'Ø', 'V', '>']

impressões

Ø>>>>Ø
V
V
Ø>>>>Ø
V
V
Ø>>>>Ø
daniero
fonte
3

Javascript (ES6), 64 bytes

(h,v,e,V,H)=>(v=(h=e+H.repeat(h-2)+e)+`
${V}`.repeat(v)+`
`)+v+h

Exemplo

let f =
(h,v,e,V,H)=>(v=(h=e+H.repeat(h-2)+e)+`
${V}`.repeat(v)+`
`)+v+h

console.log(f(8,3,'+','@','#'))

Arnauld
fonte
Isso lida com o caso especial de não entrada?
Conor O'Brien
{ "message": "Script error.", "filename": "", "lineno": 0, "colno": 0 }quando executado em linha.
noɥʇʎԀʎzɐɹƆ
@AgentCrazyPython - Rodar no IE? Não possui suporte para.repeat()
Arnauld 3/16
@Arnauld naw, safari
noɥʇʎԀʎzɐɹƆ
oh, é ES6 ...
noɥʇʎԀʎzɐɹƆ
3

V , 18 bytes

älJxxÀPjddÀpkäGYGp

Experimente online!

DJMcMayhem
fonte
3

R, 80 bytes

Muito repetitivo:

function(h,v,a,b,c)cat(t<-c(a,rep(c,h),a,"\n"),d<-rep(c(b,"\n"),v),t,d,t,sep="")

Ungolfed:

function(h,v,a,b,c)

cat(t<-c(a,rep(c,h),a,"\n"),
    d<-rep(c(b,"\n"),v),
    t,d,t,
    sep="")
Frédéric
fonte
3

Pyke, 16 15 bytes

*2mtz:zn+Q*' +D

Experimente aqui!

Azul
fonte
2

Pitão, 19 bytes

jP*3,++Jw*-E2wJj*Ew

Um programa que recebe entrada separada por nova linha em STDIN do caractere de canto, número de caracteres horizontais, caractere horizontal, número de caracteres verticais e caractere vertical e imprime o resultado.

Experimente online

Como funciona

jP*3,++Jw*-E2wJj*Ew  Program.
       Jw            Get the corner character. Store in J
           E         Get the number of horizontal characters
          - 2        -2
         *   w       Get the horizontal character and repeat it that many times
      +              Add J at the beginning of that
     +         J     and at the end
                 E   Get the number of vertical characters
                * w  Get the vertical character and repeat it that many times
               j     Join the above on newlines
    ,                Construct a 2-element list from the horizontal and vertical strings
  *3                 Repeat it 3 times
 P                   Everything except the last element
j                    Join the above on newlines
                     Implicitly print
TheBikingViking
fonte
2

MATLAB, 95 92 91 85 81 bytes

Função MATLAB 'E'. (editar: não funciona no Octave)

function a=e(n,m,c,h,v);a(1:n)=h;a=[c a c];a(2:m+1,1)=v;a=[a;a;a];a=a(1:3+2*m,:);

E não destruído:

function a=e(n,m,c,h,v); %Declare the function
a(1:n)=h;                %Initialise return with top line excluding the corners
a=[c a c];               %Then add corner pieces
a(2:m+1,1)=v;            %Next add the first vertical part
a=[a;a;a];               %Repeat three times vertically to get an E with a tail
a=a(1:3+2*m,:);          %And then lop off the tail

A função deve ser chamada como:

e(5,2,'*','-','|')

O qual retornará:

+-----+
|      
|      
+-----+
|      
|      
+-----+

Provavelmente isso pode ser um pouco simplificado, continuarei trabalhando nisso. Eu não gosto de ter toda a declaração de função para obter a entrada, então verei se posso melhorar isso.


  • Salva 3 bytes, simplificando a geração da primeira linha para criar a linha sem cantos e depois adicionar os cantos, pois isso reduz o número de vezes que a indexação é necessária.

  • Outro byte salvo, começando com o primeiro canto.

  • Mais 6 bytes substituindo a repmat(a,3,1)chamada por [a;a;a].

  • Salva 4 bytes usando asem inicialização específica (já está declarada na declaração da função) - obrigado @LuisMendo

Tom Carpenter
fonte
11
@LuisMendo interessante. Eu originalmente tinha a=[c a c]lá, mas o removi para diminuir as coisas, pois normalmente você não pode indexar o acesso a uma variável inexistente e criá-la no processo. Esqueci que essa era uma função e, portanto, ajá está declarada na declaração da função como o valor de retorno. Obrigado :)
Tom Carpenter
De fato, você pode fazer isso mesmo que não esteja em uma função - a indexação de uma variável inexistente a cria. Aprenda coisas novas todos os dias.
Tom Carpenter
2

Perl, 40 + 1 ( -n) = 41 bytes

Agradecemos ao @Ton Hospel por salvar 14 bytes e permitir que o programa funcione com entradas maiores que 10.

/.$/;$,=$/.<>x<>;say+($`.$&x(<>-2).$`)x3

Precisa -ne -E(ou -M5.010) para executar. Por exemplo :

perl -nE '/.$/;$,=$/.<>x<>;say+($`.$&x(<>-2).$`)x3' <<< '^$
!
4
9'
dada
fonte
11
@TheBitByte Ok, ótimo, está feito, obrigado.
Dada
2
Isso já é muito bom. Mas você pode brincar um pouco com o formato de entrada e também solucionar a falha que o desafio não diz que as repetições são < 10colocando /(.)(.)/;$,=$' x<>;say+($1.$2x(<>-2).$1.$/)x3um arquivo (já que ele usa $') e ligando com perl -M5.010 -n prog.pl <<< '^!S\n4\n9'(use novas linhas reais) que conta como 48 bytes (2 extras desvantagem, uma vez que não pode ser combinada com -e)
Ton Hospel 4/16
@TonHospel Obrigado. Certo, eu nem tinha notado que isso não funcionaria com números >10. Ótimo trabalho com o formato de entrada, obrigado.
Dada
Isso está chegando perto de abusar da liberdade de selecionar o formato de entrada, mas: perl -nE '/.$/;$,=$/.<>x<>;say+($`.$&x(<>-2).$`)x3' <<< '^$\n!\n4\n9'é de 41 bytes (não mais $') e também se livra da nova linha de fuga espúria
Ton Hospel
@TonHospel Na verdade, eu encontrei essa solução após sua primeira sugestão, mas não estava muito confortável com ela por causa do formato de entrada ... Como nós dois pensamos sobre isso, mudei minha resposta, mas ainda assim, sinto que é um pouco barato ...
Dada
2

Dyalog APL , 31 29 bytes

Solicita caracteres horizontais, largura, caracteres de junção, altura e caracteres verticais - nessa ordem.

h↓⊃⍪/3/⊂↑(⍞⍴⍨h←⎕),⊂⍞{∊⍺⍵⍺}⎕⍴⍞

⎕⍴⍞caracteres de entrada horizontal e tempos de largura de entrada repetidos ( abaixo)

⍞{... }caractere de junção de entrada que será na função ...

∊⍺⍵⍺ achatar [[junção], [horizontais], [junção]]

encapsular para que possa fazer parte de uma lista

(... ),anexar ...

h←⎕ altura de entrada

⍞⍴⍨ caractere vertical de entrada e repita-o muitas vezes

transformar a lista de strings em uma tabela de caracteres

encapsular (para que possa ser repetido como um todo)

3/ repita isso três vezes

    
┗━ ┗━ ┗━

⍪/ concatenar as três peças verticalmente


┣━
┣━
┗━

(isso também os encapsula, então precisamos ...)

remova o encapsulamento

h↓solte o primeiro h (linhas)

┏━
┣━
┗━

TryAPL online!

Adão
fonte
2

C, 130 bytes

#define p putchar
#define E for(o=0;o++<O;p(10))p(S);
#define W for(p(P),D=0;D++<C-2;)p(_);p(P);p(10);
f(C,O,P,S,_,D,o){W E W E W}

Uso:

main(){f(7,2,'+','|','-');}

Resultado

+-----+
|
|
+-----+
|
|
+-----+
Giacomo Garabello
fonte
Remover os pontos definee vírgulas em s e adicioná-los como f(C,O,P,S,_,D,o){W;E;W;E;W;}salva um byte.
betseg 28/09/16
2

C #, 108 bytes

(m,n,e,v,h)=>{string x=e+new string(h,m-2)+e+"\n",y=new string(v,n).Replace(v+"",v+"\n");return x+y+x+y+x;};

Função anônima que gera cada linha horizontal e vertical e constrói a saída final.

Função ungolfed:

(m,n,e,v,h)=>
{
    string x = e + new string(h, m - 2) + e + "\n",
        y = new string(v, n).Replace(v + "", v + "\n");
    return x + y + x + y + x;
};

Programa completo com casos de teste:

using System;

namespace LetterEWithoutE
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,int,char,char,char,string>f= (m,n,e,v,h)=>{string x=e+new string(h,m-2)+e+"\n",y=new string(v,n).Replace(v+"",v+"\n");return x+y+x+y+x;};

            Console.WriteLine(f(7,2,'+','|','-'));
            Console.WriteLine(f(7,2,'@','|','-'));
            Console.WriteLine(f(7,2,'@','|','#'));
            Console.WriteLine(f(8,3,'+','|','#'));
            Console.WriteLine(f(8,3,'+','@','#'));
            Console.WriteLine(f(9,4,'^','$','!'));
        }
    }
}
adrianmp
fonte
2

MATL , 15 bytes

Obrigado a @muddyfish por uma correção

2-Y"yv!iiY"!yyy

Experimente online!

Explicação

O conteúdo da pilha após cada etapa é indicado para maior clareza, usando o primeiro exemplo do desafio.

2-    % Implicitly input number of repetitions of the char of the horizontal line.
      % Subtract 2
      %   STACK: 5
Y"    % Implicitly input char of the horizontal line. Apply run-length decoding
      %   STACK: '-----' (string)
y     % Implicitly input (from below) the char of the corners. Duplicate onto the top
      %   STACK: '+', '-----', '+'
v!    % Concatenate all the stack horizontally. We now have the horizontal line
      % including the corners
      %   STACK: '+-----+'
iiY"  % Take two inputs: char of the vertical line and number of repetitions
      %   STACK: '+-----+', '||'
!     % Transpose. This tranforms the string into a vertical char array, which
      % gives the vertical line
      %   STACK: '+-----+', ['|';'|'] (vertical char array)
y     % Duplicate from below: this pushes a new copy of the horizontal line
      % onto the top of the stack
      %   STACK: '+-----+', ['|';'|'], '+-----+'
y     % Duplicate from below: this pushes a new copy of the vertical line
      % onto the top of the stack
      %   STACK: '+-----+', ['|';'|'], '+-----+', ['|';'|'],
y     % Duplicate from below: this pushes a new copy of the horizontal line
      % onto the top of the stack
      %   STACK: '+-----+', ['|';'|'], '+-----+', ['|';'|'], '+-----+'
      % Implicitly display
Luis Mendo
fonte
1

Bash + coreutils, 105 bytes

printf -- "$3`printf -- "$4%.0s" $(seq $1)`$3`printf "\n$5%.0s" $(seq $2)`%.0s\n" {1..3}|sed -n 1,$(($2*2+3))p

Assumindo que o arquivo no qual este é armazenado é nomeado A.sh, o uso seria:

bash A.sh <Horizontal Segment Length w/out Edge Chars> <Vertical Segment Length> '<Left/Right Edge Char>' '<Char Between Edges>' '<Vertical Char>'

O --são necessários, apenas no caso de uma das entradas de caracteres passa a ser um -, e printfaparentemente não lida com traços no início de uma seqüência muito bom, sem as duplas traços.

Explicação

Supondo que a entrada seja 5 2 + * |...

  1. $3printf -- "$4%.0s" $(seq $1)$3printf "\n$5%.0s" $(seq $2)

    Crie o primeiro segmento horizontal e o segmento vertical todos juntos. Isso resultaria em:

    +*****+
    |
    |
    
  2. printf -- "$3printf -- "$4%.0s" $(seq $1)$3printf "\n$5%.0s" $(seq $2)%.0s\n" {1..3}

    Repita o 3tempo parcial parcial criado anteriormente . Isso agora resulta em:

    +*****+
    |
    |
    +*****+
    |
    |
    +*****+
    |
    |
    
  3. printf -- "$3printf -- "$4%.0s" $(seq $1)$3printf "\n$5%.0s" $(seq $2)%.0s\n" {1..3}|sed -n 1,$(($2*2+3))p

    Finalmente, canalize a saída anterior sedpara se livrar dos 2 últimos segmentos de linha, produzindo apenas as primeiras <Vertical Segment Length>*2+3linhas do E. Finalmente conseguimos o Eque queremos:

    +*****+
    |
    |
    +*****+
    |
    |
    +*****+
    
R. Kap
fonte
1

PowerShell v2 +, 60 59 bytes

param($a,$b,$c,$d,$e)(,($x="$c$($e*($a-2))$c")+,$d*$b)*2;$x

Recebe entrada como argumentos de linha de comando individuais. Constrói a cadeia horizontal, armazena-a $xpara uso posterior e forma-a em uma matriz com o operador de vírgula ,. Executa a concatenação da matriz (isto é, adicionando elementos ao final) dos $dformulados em uma matriz de $belementos. Isso, por sua vez, é formulado em uma matriz de dois elementos com outro operador de vírgula e é deixado no pipeline. Em seguida, a horizontal $xé deixada no pipeline. Abusa a formatação padrão deWrite-Output para colocar uma nova linha entre elementos.

Exemplo

PS C:\Tools\Scripts\golfing> .\the-letter-e-without-e.ps1 5 3 "z" "v" "d"
zdddz
v
v
v
zdddz
v
v
v
zdddz
AdmBorkBork
fonte
1

Python 3, 60 bytes

Uma função

def p(a,b,c,d,e):q=c+e*(a-2)+c;return(q+'\n'+(d+'\n')*b)*2+q

Caso de teste

>>> print(p(8,2,'+','|','#'))
+######+
|
|
+######+
|
|
+######+
Dignissimus - Spammy
fonte
você tem 2 muitos traços na saída
azul
1

Brainf * ck, 147 bytes

,>,>++++++++[<------<------>>-]<<-->>>,>,>,>+++>++>++++++++++<<[-<<<.<<<[->>+>>>.<<<<<]>>[-<<+>>]>.>>>>>.<[-<<<<<<[->+>>.>>>>.<<<<<<<]>[<+>-]]>>>>]

Recebe a entrada do stdin como os 5 primeiros caracteres digitados. Os dois primeiros têm 48 subtraídos do código ASCII para que 0-9 se comportem conforme o esperado. Para números> 9, adicione 48 ao número e use o caractere correspondente. Os outros três caracteres são os especificados no desafio.

Tenho certeza de que não é a solução ideal, mas a vida é muito curta para o cérebro.

Com comentários:

[
    Input: number number corner vertical horizontal
    Numbers are single digits; add 48 and use the ASCII character corresponding
    to the number you want for numbers > 9.
    First number is the number of characters across. Second is the number down.

    Layout: {first number-2} {second number} {temp} {a} {b} {c}
]

,>,>++++++++[<------<------>>-]<<-->>>,>,>,
now we should have the first five cells with the specified layout
the 6th will hold 3 as a counter and the 7th 2 and the 8th 10 '\n'

>+++>++>++++++++++<<
[  while the 6th cell is not 0
    -
    <<<.    print corner
    <<<[->>+>>>.<<<<<]  print horizontal characters
    >>[-<<+>>]         copy temp back to 1st cell
    >.>>>>>.           print corner and newline
    <
    [ If the second counter is not zero
        -
        <<<<<<[->+>>.>>>>.<<<<<<<]  print vertical and newline n times
        >[<+>-]           copy temp back to 2nd cell
    ]
    >>>>
]

Exemplo de execução:

sean@SEANSBOX:~/Dropbox/Code/BF$ ./bf E.b
94^$!
^!!!!!!!^
$
$
$
$
^!!!!!!!^
$
$
$
$
^!!!!!!!^
Sean McBane
fonte
1

PHP, 97 bytes

list(,$w,$h,$c,$v,$r)=$argv;echo$b=str_pad($a=str_pad($c,++$w,$r)."$c\n",--$h*2+$w,"$v\n"),$b,$a;

sem loop, apenas builtins.

Corra com php -r '<code>' <parameters>.

Titus
fonte
1

Java 7, 205 129 bytes

String c(int w,int h,String a,char b,char c){String r=a,n="\n",l="";for(;w-->2;r+=c);r+=a+n;for(;h-->0;l+=b+n);return r+l+r+l+r;}

-76 bytes graças a um estranho anônimo.
PS: Não vá editar as postagens de outras pessoas na próxima vez. Se você tem algo para jogar golfe, deixe um comentário ou, se estiver usando uma abordagem completamente diferente, poderá dar sua própria resposta. Ainda obrigado por jogar fora todos esses bytes - quem quer que você seja ..

Casos não testados e de teste:

Experimente aqui.

class M {
    static String c(int w, int h, String a, char b, char c){
        String r = a,
               n = "\n",
               l = "";
        for(; w-- > 2; r += c);
        r += a+n;
        for( ;h-- > 0; l += b+n);
        return r+l+r+l+r;
    }

    public static void main(String[] a) {
        System.out.print(c(7, 2, "+", '|', '-'));
        System.out.print(c(9, 4, "?", '¡', '¿'));
    }
}

Resultado:

+-----+
|    
|    
+-----+
|    
|    
+-----+

?¿¿¿¿¿¿¿?
¡      
¡      
¡      
¡      
?¿¿¿¿¿¿¿?
¡      
¡      
¡      
¡      
?¿¿¿¿¿¿¿?
Kevin Cruijssen
fonte
0

Raquete 124 bytes

(λ(w h a b c)(for((i 3))(display a)(for((i w))(display c))(display a)(when(< i 2)(displayln "")(for((j h))(displayln b)))))

Forma mais legível:

(define(f w h a b c)
  (for((i 3))
    (display a)
    (for((i w))
      (display c))
    (display a)
    (when(< i 2)
      (displayln "")
      (for((j h))
        (displayln b)))))

Teste:

(f 7 2 "+" "|" "-" )

+-------+
|
|
+-------+
|
|
+-------+
rnso
fonte
0

C ++, 121 bytes

#import<string>
#import<iostream>
#define f(w,h,C,W,H){std::string s(w,W),t;s=C+s+C+"\n";for(int i=h;i--;)t=t+H+"\n";std::cout<<s+t+s+t+s;}

Ungolfed:

#import<string>
#import<iostream>
#define f(w,h,C,W,H){
    std::string s(w,W),t;  //define two strings, one empty, one with horizontal characters
    s = C+s+C+"\n";        //assemble a horizontal bar
    for(int i=h;i--;) 
        t=t+H+"\n";        //assemble a vertical bar
    std::cout<<s+t+s+t+s;  //print
}

Em C ++, não é permitido declarar funções sem tipo, como em C. Mas macros que se comportam como uma função são totalmente possíveis. Observe também que a versão ungolfed não será compilada até você adicionar um "\" a cada um, exceto a última linha da macro. Você pode salvar dois bytes adicionais removendo o {}, mas não poderá usar a macro duas vezes seguidas.

Uso:

int main() {
    f(4,2,'+','-','|')
    f(2,1,'@','#','i')
    return 0;
}

Resultado:

+----+
|
|
+----+
|
|
+----+
@##@
i
@##@
i
@##@

Experimente online

Anedar
fonte
0

CJam , 23 bytes

riri)N*r2*\r*\@r**a3*\*

Experimente online!

A entrada está na ordem especificada, mas deve ser separada por espaço, em vez de usar vírgula. Parte da dificuldade é obter a entrada na ordem correta para a operação de junção* do CJam ; para comparação reorganizando a entrada poderia economizar 4 bytes .

Se as entradas são dubladas A B C D E, o programa funciona mais ou menos assim:

ri     e# get A as integer
ri)N*  e# create B+1 newlines
r2*    e# create 2 Cs
\r*    e# join newlines with D (hereafter ND)
\@     e# bring A & Cs to the front
r*     e# create A Es
*      e# join, puts Es between Cs (hereafter CEC)
a3*    e# makes 3 copies of CEC strings
\*     e# join, puts NDs between CECs
Linus
fonte
0

Lua (5.2), 144 bytes

k,a,p,q=loadstring,arg,io.write,print l,d=k"for i=3,a[1]do p(a[5])end",k"for i=1,a[2]do q(a[4])end"b=a[3]p(b)l()q(b)d()p(b)l()q(b)d()p(b)l()p(b)

Experimente online! (Campo de codificação)

Ele deve gerar algo assim agora:

+@@@@@+
l
l
+@@@@@+
l
l
+@@@@@+

Entrada própria: 7 2 + l @

Você pode alterar a entrada nas opções projeto-> compilação e lá os valores, cada valor como no exemplo, mas não separados por vírgulas, mas por espaços.

Lycea
fonte
0

QBIC, 44 bytes

::;;;X=A[q,a-2|X=X+C]X=X+A ?X[1,2|[1,b|?B]?X

Explicação

::;;;                 Get the input parameters, 2 numbers and 3 strings
X=A[q,a-2|X=X+C]X=X+A Build the horizontal string: The corner string, x-2 times the filler string and another corner
?X                    Print the horizontal string
[1,2|                 Do the next thing twice
[1,b|?B]?X            Print the right number of vertical strings, then the horizontal string.
steenbergh
fonte
0

PHP, 94 bytes

<?list($v,$h,$p,$d,$r)=$_GET[a];for($h++;$i<=2*$h;)echo$i++%$h?$d:str_pad($p,$v-1,$r).$p,"\n";

Formate uma matriz na mesma ordem que a sequência sugerida

Jörg Hülsermann
fonte
Se você usar em ,"\n"vez de ."\n", poderá soltar os parênteses para o ternário.
Titus
for($h++;$i<=2*$h;)e $i++%$hsalva outro byte.
Titus
$v-1fornece apenas 3 caracteres horizontais para [5,2,+,|,-].Número de caracteres horizontais, sem incluir os caracteres de borda esquerda e direita
Titus
@ Titus isso mesmo, eu tenho que reverter sua edição. 5 Horizontal significa 3 caracteres com 2 arestas = 5. Faça uma olhada na pergunta. E pelas outras idéias Obrigado
Jörg Hülsermann