Saída diagrama visual da imagem

22

Escreva um programa que insira as dimensões de uma pintura, a largura de fosco e a largura do quadro para um retrato emoldurado. O programa deve exibir um diagrama usando o símbolo Xpara a pintura, +o tapete e #o enquadramento. Os símbolos devem ser separados por espaço. O espaço em branco à direita é bom, desde que a saída corresponda visualmente aos critérios. As entradas podem ser 0.

ENTRADA: 3 2 1 2 (Largura, Altura, Largura Matte, Largura do Quadro)

SAÍDA:

Os primeiros 3 e 2 são a largura e a altura da pintura.  1 é a largura fosca ao seu redor.  2 é a largura do quadro em torno da coisa toda.

Em forma de texto:

# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

O código vencedor completa as condições no mínimo possível de bytes.

George Harris
fonte
2
Bom desafio! Para desafios futuros, você pode querer usar o The Sandbox
MilkyWay90
2
você se importa se a entrada estiver em uma ordem diferente?
vityavv 19/03
1
Podemos retornar uma lista de strings?
MilkyWay90
5
Alguma das entradas pode ser zero?
Laikoni 19/03
1
Podemos ter um espaço no final de cada linha?
Luis Mendo

Respostas:

5

Python 2 , 98 bytes

w,h,a,b=input()
a*='+'
b*='#'
for c in b+a+h*'X'+a+b:print' '.join(min(c,d)for d in b+a+w*'X'+a+b)

Experimente online!

Imprime uma grade separada por espaço, seguindo rigorosamente as especificações. Estou divertido que *=é usado para converter ae bde números em seqüências de caracteres.

O Python 3 pode salvar alguns bytes evitando ' '.join, talvez mais, usando strings f e expressões de atribuição. Agradecimentos a Jo King por -2 bytes.

Python 3 , 93 bytes

def f(w,h,a,b):a*='+';b*='#';[print(*[min(c,d)for d in b+a+w*'X'+a+b])for c in b+a+h*'X'+a+b]

Experimente online!

xnor
fonte
Eu fui derrotado! Bom trabalho, parece bastante golfed
MilkyWay90
Bom golfe! Muito esperto.
George Harris
4

JavaScript (ES6),  118 113  107 bytes

(w,h,M,F)=>(g=(c,n)=>'01210'.replace(/./g,i=>c(i).repeat([F,M,n][i])))(y=>g(x=>'#+X'[x<y?x:y]+' ',w)+`
`,h)

Experimente online!

Comentado

(w, h, M, F) => (       // given the 4 input variables
  g = (                 // g = helper function taking:
    c,                  //   c = callback function returning a string to repeat
    n                   //   n = number of times the painting part must be repeated
  ) =>                  //
    '01210'             // string describing the picture structure, with:
    .replace(           //   0 = frame, 1 = matte, 2 = painting
      /./g,             // for each character in the above string:
      i =>              //   i = identifier of the current area
        c(i)            //   invoke the callback function
        .repeat         //   and repeat the result ...
        ([F, M, n][i])  //   ... either F, M or n times
    )                   // end of replace()
)(                      // outer call to g:
  y =>                  //   callback function taking y:
    g(                  //     inner call to g:
      x =>              //       callback function taking x:
        '#+X'           //         figure out which character to use
        [x < y ? x : y] //         according to the current position
        + ' ',          //         append a space
      w                 //       repeat the painting part w times
    )                   //     end of inner call
    + '\n',             //     append a line feed
  h                     //   repeat the painting part h times
)                       // end of outer call
Arnauld
fonte
3

MATL , 24 bytes

&l,ithYaQ]'#+X'w)TFX*cYv

A entrada é: Altura, Largura, Largura fosca, Largura do quadro.

Experimente online!

Explicação

&l      % Take height and width implicitly. Push matrix of that size with all
        % entries equal to 1
,       % Do twice
  i     %   Take input
  th    %   Duplicate, concatenate: gives a 1×2 vector with the number repeated
  Ya    %   Pad matrix with those many zeros vertically and horizontally
  Q     %   Add 1 to each entry 
]       % End
'#+X'   % Push this string
w)      % Index into the string with the padded matrix
TF      % Push row vector [1 0]
X*      % Kronecker product. This inserts columns of zeros
c       % Convert to char again. Char 0 is will be displayed as space
Yv      % Remove trailing spaces in each line. Implicitly display
Luis Mendo
fonte
2

Wolfram Language (Mathematica) , 142 bytes

(t=(p=Table)["# ",2(c=#4+#3)+#2,2c+#];p[t[[i,j]]="+ ",{j,z=#4+1,c+#3+#},{i,z,c+#3+#2}];p[t[[i,j]]="X ",{j,#3+z,c+#},{i,#3+z,c+#2}];""<>#&/@t)&

Experimente online!

J42161217
fonte
2

Carvão , 48 47 44 bytes

≔×NXθ≔×NXηFE+#×Nι«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»Eη⪫⭆θ⌊⟦ιλ⟧ 

Experimente online! Link é a versão detalhada do código. Nota: Espaço à direita. Edit: Agora usa o algoritmo do @ xnor. Explicação:

≔×NXθ≔×NXη

Insira a largura e a altura e converta-as em strings de Xs.

FE+#×Nι

Faça um loop sobre os caracteres +e #, convertendo-os em cadeias de comprimento fornecidas pelas duas entradas restantes. Em seguida, faça um loop sobre essas duas cordas.

«≔⁺ι⁺θιθ≔⁺ι⁺ηιη»

Prefixe e sufixe a pintura com as seqüências de caracteres para o acabamento e moldura.

Eη⪫⭆θ⌊⟦ιλ⟧ 

Faça um loop sobre as seqüências de caracteres, utilizando o mínimo de caracteres horizontais e verticais e espaçamento duplo das linhas, imprimindo implicitamente cada linha em sua própria linha.

Neil
fonte
2

05AB1E (legado) / 05AB1E --no-lazy , 32 31 bytes

и'Xׄ+#vyI©×UεX.ø}®FDнgy×.ø]€S»

Recebe a entrada na ordem height, width, matte, frame. Se a ordem de entrada especificada no desafio for rigorosa (ainda aguardando confirmação do OP), um líder s(swap) poderá ser adicionado por +1 byte.

Necessário o --no-lazysinalizador do compilador Elixir na nova versão do 05AB1E, pois o Elixir possui algum comportamento estranho devido a uma avaliação lenta de mapas / loops aninhados ( aqui o resultado sem esse sinalizador ).

Experimente online na versão herdada do 05AB1E.
Experimente online na nova versão do 05AB1E com --no-lazysinalizador adicionado .

Explicação:

и              # Repeat the second (implicit) input the first (implicit) input amount of
               # times as list
 'X×          '# Repeat "X" that many times
„+#v           # Loop `y` over the characters ["+","#"]:
    y          #  Push character `y`
     I         #  Push the next input (matte in the first iteration; frame in the second)
      ©        #  And store it in the register (without popping)
       ×       #  Repeat character `y` that input amount of times
        U      #  Pop and store that string in variable `X`
    εX.ø}      #  Surround each string in the list with string `X`
    ®F         #  Inner loop the value from the register amount of times:
      Dнg      #   Get the new width by taking the length of the first string
         y×    #   Repeat character `y` that many times
             #   And surround the list with this leading and trailing string
   ]           # Close both the inner and outer loops
    S         # Convert each inner string to a list of characters
      »        # Join every list of characters by spaces, and then every string by newlines
               # (and output the result implicitly)
Kevin Cruijssen
fonte
2

Geléia , 17 bytes

;ŒB“#+X+#”xʋⱮ«Ɱ/G

Experimente online!

Argumento 1: [Frame width, Matte width]
Argumento 2:[Width, Height]

Erik, o Outgolfer
fonte
1

Tela , 24 bytes

X;«[lx*e⤢}
X×*+⁸#⁸ *J ×O

Experimente aqui!

Deve ser 5 bytes mais curto, mas não é porque o Canvas é com erros.

dzaima
fonte
1

R , 119 bytes

function(w,h,m,f)write(Reduce(function(x,y)rbind(y,cbind(y,x,y),y),rep(c("+","#"),c(m,f)),matrix("X",w,h)),1,w+2*f+2*m)

Experimente online!

Giuseppe
fonte
1

Python 3.8 (pré-lançamento) , 116 115 113 bytes

lambda a,b,c,d:"\n".join((g:=['#'*(a+2*c+2*d)]*d+[(h:='#'*d)+'+'*(a+c*2)+h]*c)+[h+'+'*c+'X'*a+'+'*c+h]*b+g[::-1])

Experimente online!

A primeira tentativa de jogar golfe será melhorada em breve. aé largura, bé altura, cé largura fosca e dé largura do quadro.

-1 bytes usando o :=operador para definir hcomoe * d

-2 bytes graças a Jo King sugerindo que eu remova os parâmetros eef

EXPLICAÇÃO:

lambda a,b,c,d:          Define a lambda which takes in arguments a, b, c, and d (The width of the painting, the height of the painting, the padding of the matte, and the padding of the frame width, respectively).
    "\n".join(                       Turn the list into a string, where each element is separated by newlines
        (g:=                         Define g as (while still evaling the lists)...
            ['#'*(a+2*c+2*d)]*d+       Form the top rows (the ones filled with hashtags)
            [(h:='#'*d)+'+'*(a+c*2)+h]*c Form the middle-top rows (uses := to golf this section)
        )+
        [h+'+'*c+'X'*a+'+'*c+h]*b+       Form the middle row
        g[::-1]                      Uses g to golf the code (forms the entire middle-bottom-to-bottom)
    )
MilkyWay90
fonte
Remover a etarefa economiza dois bytes, a ftarefa não economiza nada
Jo King
@JoKing Oh uau, eu esqueci de remover as atribuições ee fdepois de descobrir o gatalho
MilkyWay90
0

Javascript, 158 bytes

(w,h,m,f)=>(q="repeat",(z=("#"[q](w+2*(m+f)))+`
`)[q](f))+(x=((e="#"[q](f))+(r="+"[q](m))+(t="+"[q](w))+r+e+`
`)[q](m))+(e+r+"X"[q](w)+r+e+`
`)[q](h)+x+z)

Provavelmente pode ser aparado um pouco

f=

(w,h,m,f)=>(q="repeat",(z=("# "[q](w+2*(m+f))+`
`)[q](f))+(x=((e="# "[q](f))+(r="+ "[q](m))+(t="+ "[q](w))+r+e+`
`)[q](m))+(e+r+"X "[q](w)+r+e+`
`)[q](h)+x+z)

console.log(f(3,2,1,2))

vityavv
fonte
0

Perl 6 , 98 bytes

{map(&min,[X] map (($_='#'x$^d~'+'x$^c)~'X'x*~.flip).comb,$^a,$^b).rotor($b+2*($c+$d)).join("\n")}

Experimente online!

Esta é uma porta da resposta Python do xnor .

Perl 6 , 115 bytes

->\a,\b,\c,\d{$_=['#'xx$!*2+a]xx($!=c+d)*2+b;.[d..^*-d;d..^a+$!+c]='+'xx*;.[$!..^*-$!;$!..^a+$!]='X'xx*;.join("
")}

Experimente online!

Código-código anônimo, praticamente golfe, utilizando a atribuição de lista multidimensional do Perl 6. Por exemplo, @a[1;2] = 'X';atribuirá 'X'ao elemento com o índice 2 da lista com o índice 1 e @a[1,2,3;3,4,5]='X'xx 9;substituirá todos os elementos por índices 3,4,5das listas por índices 1,2,3com 'X'.

Explicação:

Primeiro, inicialize a lista como um a+2*(c+d)pelo b+2*(c+d)retângulo de #s.

$_=['#'xx$!*2+a]xx($!=c+d)*2+a;
State:
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #

Em seguida, atribuímos o retângulo interno de +s

.[d..^*-d;d..^a+$!+c]='+'xx*;
State:
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #

Finalmente, o retângulo mais interno de Xs.

.[$!..^*-$!;$!..^a+$!]='X'xx*;
# # # # # # # # #
# # # # # # # # #
# # + + + + + # #
# # + X X X + # #
# # + X X X + # #
# # + + + + + # #
# # # # # # # # #
# # # # # # # # #
Brincadeira
fonte
0

Geléia , 35 31 28 24 bytes

Dịx@“#+X+#”
⁽-Fç«þ⁽-ȥç$G

Experimente online!

Recebe a entrada no quadro da ordem, fosco, largura, altura; vírgula separada. Produz a imagem de arte ASCII com moldura e fosco. Se a ordem de entrada for rigorosa, seria necessário adicionar mais bytes (conforme minha postagem original).

Dois tacos com base na resposta de @ EriktheOutgolfer; Eu percebi que os personagens estavam em ordem ASCII, mas não tinha pensado na melhor maneira de tirar proveito disso, e tinha esquecido G. A resposta dele ainda é melhor!

Nick Kennedy
fonte
Eu nunca programa em Jelly, mas certamente 43134,43234 pode ser compactado? Edição: Eu preciso aprender a ler, você menciona que eles podem realmente ser codificados em 4 bytes cada. Mas o que tem a ordem de entrada a ver se esses números podem ser codificados ou não? : S
Kevin Cruijssen 19/03
@KevinCruijssen, o número máximo máximo que pode ser codificado usando a sintaxe de dois bytes é 32250; desde que ambos excedam que não consigo salvar os bytes. Por enquanto, vou assumir que posso trocar as coisas e reverter se não for permitido!
Nick Kennedy
Ah, entendi. 43134precisará de três caracteres de codificação, que incluindo um caractere inicial / final para indicar que ele está codificado também terão 5 bytes. E Jelly talvez tenha algum tipo de duplicata, já que o segundo número é 100 maior que o primeiro? Não tem certeza se as ações push 43134, duplicate, push 100, plus, pair são possíveis e mais curtas no Jelly?
Kevin Cruijssen 19/03
@KevinCruijssen Eu tentei originalmente usando +0,100, o que não salva nada. Eu acho que eu poderia usar uma cadeia nilad para usar o fato de que em um nilad ³ é 100, mas se eu puder reordenar as entradas, os 250 inteiros base serão melhores
Nick Kennedy
0

Perl 5, 115 bytes

$_=(X x$F[0].$/)x$F[1];sub F{s,^|\z,/.*/;$_[0]x"@+".$/,ge,s/^|(?=
)/$_[0]/gm while$_[1]--}F('+',$F[2]);F('#',$F[3])

TIO

Nahuel Fouilleul
fonte
0

PowerShell , 132 bytes

param($w,$h,$m,$f)filter l{"$(,'#'*$f+,$_[0]*$m+,$_[1]*$w+,$_[0]*$m+,'#'*$f)"}($a=@('##'|l)*$f)
($b=@('++'|l)*$m)
@('+X'|l)*$h
$b
$a

Experimente online!

confuso
fonte