Você é o anfitrião das Olimpíadas!

17

Você organiza os Jogos Olímpicos e precisa construir uma piscina fantástica para a ocasião, mas os supervisores geralmente mudam de idéia em relação às dimensões e precisam de uma maneira rápida de reconstruí-la com o tamanho solicitado!


Dados dois números inteiros, Le x, sua tarefa é construir uma piscina de comprimento Le xfaixas.

Como é construída uma piscina?

  • Ele contém um quadrado interno, cujas paredes horizontais são feitas de Ltraços consecutivos ( -) e cujas paredes verticais são feitas de 3x - 1barras ( |). Além disso, +existem 4 sinais em cada canto. Vamos dar um exemplo ( L = 10, x = 2):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Cada pista tem uma largura de 2 unidades verticais. O quadrado interno é preenchido com x-1separadores de faixa, consistindo em símbolos Lconsecutivos horizontalmente :. Depois de colocar os separadores de faixa, nossa piscina deve ficar assim:

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Uma piscina também contém um preenchimento (um quadrado externo), cujas paredes horizontais são (L + 4) se -cujas paredes verticais são (3x + 1) |s, que circundam o quadrado interno:

    + -------------- +
    | + ---------- + |
    | | | |
    | | | |
    | | :::::::::: | |
    | | | |
    | | | |
    | + ---------- + |
    + -------------- +
    

E essa é a nossa piscina ** de tamanho olímpico!


Especificações:

  • Para fins de design e funcionalidade, você tem a garantia de que 100 ≥ L ≥ 10e 15 ≥ x ≥ 2.

  • A saída deve ser exatamente como mostrado. A saída de um pool "verticalmente construído" * não é permitida.

  • Espaços à direita e à esquerda são permitidos.

  • Você pode receber e fornecer resultados através de qualquer método padrão .

  • Aplicam-se lacunas padrão .


Exemplos / casos de teste:

L = 20, x = 3

+ ------------------------ +
| + -------------------- + |
| | | |
| | | |
| | :::::::::::::::::::: | |
| | | |
| | | |
| | :::::::::::::::::::: | |
| | | |
| | | |
| + -------------------- + |
+ ------------------------ +



L = 50, x = 5:

+ ------------------------------------------------- ----- +
| + ------------------------------------------------- - + |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| | ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : | |
| | | |
| | | |
| + ------------------------------------------------- - + |
+ ------------------------------------------------- ----- +


L = 10, x = 15

+ -------------- +
| + ---------- + |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| | :::::::::: | |
| | | |
| | | |
| + ---------- + |
+ -------------- +

Isso é , então o código mais curto em bytes vence!

* A água pode fluir se for construída verticalmente: P

** Sim, eu sei que quanto mais as pistas são e quanto menor a piscina, menos o desenho parece uma piscina!

Mr. Xcoder
fonte
Sandbox , para quem pode ver as postagens excluídas.
Xcoder
O que deveria acontecer se x>=L??
CraigR8806
@ CraigR8806 O mesmo algoritmo. Apenas com mais pistas do que o comprimento da piscina. Eu tenho um pressentimento de que você errou a questão ...
Sr. Xcoder
E o caso, onde L=10e x=15? Não haveria mais pistas do que poderiam ser colocadas na piscina? Eu poderia ser mal-entendido a intenção
CraigR8806
@ CraigR8806 O comprimento não tem nada a ver com as pistas! Você pode testá-lo sozinho com uma das respostas existentes
Mr. Xcoder

Respostas:

13

Carvão , 32 bytes

NθNη↓Eθ×η:  B⁺θ²⁺׳η¹↖←B⁺θ⁶⁺׳η³

Experimente online!

-4 graças a Neil .

AST:

Program
├N: Input Number
│└θ: Identifier θ
├N: Input Number
│└η: Identifier η
├Print
│├↓: Down
│└E: Map
│ ├θ: Identifier θ
│ └×: Product
│  ├η: Identifier η
│  └':  ': String ':  '
├B: Box
│├⁺: Sum
││├θ: Identifier θ
││└2: Number 2
│└⁺: Sum
│ ├×: Product
│ │├3: Number 3
│ │└η: Identifier η
│ └1: Number 1
├Move
│└↖: Up Left
├Move
│└←: Left
└B: Box
 ├⁺: Sum
 │├θ: Identifier θ
 │└6: Number 6
 └⁺: Sum
  ├×: Product
  │├3: Number 3
  │└η: Identifier η
  └3: Number 3
Erik, o Outgolfer
fonte
wow carvão tem esse desafio para baixo :)
Downgoat
Você permaneceu fiel ao seu nome - você me superou.
notjagan
2
Como sempre, solicitação de explicação.
CalculatorFeline
@CalculatorFeline Sim, não tenho tempo para fazer todas essas explicações enquanto procuro algo para superar ... também é possível verificar o AST usando o -aargumento da linha de comando.
Erik the Outgolfer
por que -a
gera
12

Carvão , 40 39 37 bytes

NθNηB⁺θ⁶⁺׳η³↘→B⁺θ²⁺׳η¹→F⁻η¹«M³↓P×:θ

Experimente online!

Eu sei que Neil já tem uma resposta de carvão vegetal do mesmo tamanho, mas eu tomei uma abordagem um pouco diferente, então achei que também poderia postar a minha.

Explicação

NθNηB⁺θ⁶⁺׳η³↘→B⁺θ²⁺׳η¹→F⁻η¹«M³↓P×:θ
NθNη                                         take the two inputs as numbers in θ and η
      B⁺θ⁶⁺×³η³                               draw a rectangle θ + 6 by 3η + 3
                                               (characters default to |, - and +)
                ↘→                             move the cursor down one and right two
                   B⁺θ²⁺×³η¹                  draw a rectangle θ + 2 by 3η + 1
                             F⁻η¹«            for ι (unused) from 0 up until η - 1:
                                   M³↓            move the cursor down by 3
                                       P×:θ       print θ :s without moving the cursor
                                               [implicit end of for]
notjagan
fonte
11
Explicação, por favor.
CalculatorFeline
@CalculatorFeline Adicionado.
notjagan
11
Huh, então o terceiro parâmetro para é opcional? Bom, isso me salva dois bytes!
Neil
11

Carvão, 40 38 36 31 bytes

A⁺²NθA⁺¹×³NηUOθη:¶¶Bθη↖←B⁺⁴θ⁺²η

Experimente online! Link é a versão detalhada do código. Explicação:

A⁺²Nθ       Assign(Plus(2, InputNumber()), q);

As primitivas de desenho do carvão vegetal usam a contagem geral de caracteres, incluindo +s; no entanto, a entrada é apenas o número de -s; portanto, precisamos adicionar 2 para obter a largura da parede interna.

A⁺¹×³Nη     Assign(Plus(1, Times(3, InputNumber())), h);

Calcule novamente a altura da parede interna, inclusive a linha inferior, de modo que três por pista mais uma.

UOθη:¶¶     Oblong(q, h, ":\n\n");

Desenhe as pistas. Este é simplesmente um retângulo preenchido com :s separados verticalmente por duas linhas em branco (as pilcrows representam caracteres de nova linha).

Bθη         Box(q, h);

O Rectanglecomando é exatamente o que precisamos para desenhar a parede interna. Editar: Boxpermite que você omita seu terceiro parâmetro, economizando 2 bytes.

↖           Move(:UpLeft);
←           Move(:Left);
B⁺⁴θ⁺²η     Box(Plus(4, q), Plus(2, h));

E novamente para desenhar a parede externa, exceto um pouco mais larga e alta, e centralizada na parede interna.

Neil
fonte
11
Por que os links para o código Charcoal no TIO nunca são para o código real?
Jonathan Allan
11
@ JonathanAllan Eu vinculo ao código detalhado porque é mais legível, além de adicionar o argumento para gerar o código sucinto automaticamente para fins de verificação.
30517 Neil
... mas como 219 caracteres são mais legíveis que 40? : p
Jonathan Allan
Eu poderia ter apenas olhou mais difícil e notou esta dica :)
Jonathan Allan
11
Como sempre, por favor, explique.
CalculatorFeline
8

T-SQL, 284 281 bytes

DECLARE @ INT,@x INT,@S VARCHAR(MAX)='+--d--+b| +d+ |b'SELECT @=L,@x=x FROM t
P:SET @S+='| |s| |b| |s| |b| |c| |b'SET @x-=1IF @x>0GOTO P
PRINT REPLACE(REPLACE(REPLACE(REPLACE(LEFT(@S,LEN(@S)-6)+'+d+ |b+--d--+','d',REPLICATE('-',@)),'b',CHAR(13)),'s',SPACE(@)),'c',REPLICATE(':',@))

A entrada é obtida das colunas INT L e x na tabela preexistente t , de acordo com nossos métodos de entrada permitidos .

Basicamente, estou criando uma sequência longa com letras representando os caracteres repetidos (d = traços, s = espaços, c = dois pontos, b = quebra de linha) e, em seguida, SUBSTITUI todos eles no final com os preenchimentos apropriados.

Formatado:

DECLARE @ INT,@x INT,@S VARCHAR(MAX)='+--d--+b| +d+ |b'
SELECT @=L,@x=x FROM t
P:
    SET @S+='| |s| |b| |s| |b| |c| |b'
    SET @x-=1
IF @x>0 GOTO P
PRINT REPLACE(REPLACE(REPLACE(REPLACE( LEFT(@S,LEN(@S)-6)+'+d+ |b+--d--+'
     ,'d',REPLICATE('-',@))
     ,'b',CHAR(13))
     ,'s',SPACE(@))
     ,'c',REPLICATE(':',@))

Dentro do loop, anexo 2 linhas de espaços em branco e 1 linha de dois pontos; depois, no final, corto essa linha divisória e anexo a borda da piscina antes de executar as substituições.

EDIT : salvou 3 bytes alternando @para a variável usada com mais freqüência e trocando a ordem de inicialização.

BradC
fonte
8

JavaScript (ES6), 137 124 bytes

Joguei um pouco no meu telefone, mais para seguir.

x=>y=>`+--0--+
| +0+ |
${((a=`| |1| |
`)+a+`| |2| |
`).repeat(y-1)+a+a}| +0+ |
+--0--+`.replace(/\d/g,n=>"- :"[n].repeat(x))

Tente

f=
x=>y=>`+--0--+
| +0+ |
${((a=`| |1| |
`)+a+`| |2| |
`).repeat(y-1)+a+a}| +0+ |
+--0--+`.replace(/\d/g,n=>"- :"[n].repeat(x))
oninput=_=>o.innerText=f(+i.value)(+j.value);o.innerText=f(i.value=50)(j.value=5)
input{font-family:sans-serif;margin:0 5px 0 0;width:50px;}
<label for=i>L: </label><input id=i type=number><label for=j>x: </label><input id=j type=number><pre id=o>

Shaggy
fonte
Eu gosto deste porque é interativo: D
xDaizu
@xDaizu, confira alguns dos meus outras soluções JS, então;)
Shaggy
6

Python 2 , 124 120 117 bytes

-2 bytes graças ao Hyper Neutrino

l,x=input()
o='+--%s--+\n| +%s+ |\n'%(('-'*l,)*2)
print o+'| |%s| |\n'*(x*3-1)%((' '*l,' '*l,':'*l)*x)[:-1]+o[-2::-1]

Experimente online!

Cajado
fonte
122 bytes (a variável té desnecessário)
HyperNeutrino
4

SOGL V0.12 , 52 51 bytes

:┌* +1Ο;@*┐1ΟG∙⁴++⁰
b3*Ie4+⁰b3*He⁰32žbH∫3*2+4;e :*ž

Experimente aqui!
Nada mal, considerando que 20 bytes disso é uma função retangular, para a qual o carvão vegetal está embutido.

Explicação:

Rectangle function: (example: on stack 4, 2)
:                   duplicate the top of stack (X pos)      [4, 2, 2]
 ┌*                 get that many "-"es                     [4, 2, "--"]
    +               push "+"                                [4, 2, "--", "+"]
     1Ο             wrap the dashes in pluses               [4, 2, "+--+"]
       ;            get the duplicated X position           [4, "+--+", 2]
        @*          get that many spaces                    [4, "+--+", "  "]
          ┐         push "|"                                [4, "+--+", "  ", "|"]
           1Ο       wrap the spaces with "|"                [4, "+--+", "|  |"]
             G      get the Y value ontop                   ["+--+", "|  |", 4]
              ∙     get an array with that many strings     ["+--+", ["|  |", "|  |", "|  |", "|  |"]]
               ⁴    duplicate the dashes wrapped in pluses  ["+--+", ["|  |", "|  |", "|  |", "|  |"], "+--+"]
                ++  add everything to one array             [["+--+", "|  |", "|  |", "|  |", "|  |", "+--+"]]
Main function: (example input: 2, 5)
b3*                              push variable B (input 1, Y length) multiplied by 3                     [6]
   I                             increase it                                                             [7]
    e4+                          push variable E (input 2, X length) + 4                                 [7, 9]
       ⁰                         execute the rectangle function [in X: E+4, Y: b*3+1]                    [["+---------+","|         |","|         |","|         |","|         |","|         |","|         |","|         |","+---------+"]]
        b3*                      push variable B * 3                                                     [["+---------+",..,"+---------+"], 6]
           H                     decrease it                                                             [["+---------+",..,"+---------+"], 5]
            e                    push variable E                                                         [["+---------+",..,"+---------+"], 5, 5]
             ⁰                   execute the rectangle function [on X: E, Y: B*3-1]                      [["+---------+",..,"+---------+"], ["+-----+","|     |","|     |","|     |","|     |","|     |","+-----+"]]
              32ž                at coordinates [3;2] (1-indexed) in the first rectangle put in the 2nd  [["+---------+",
                                                                                                           "| +-----+ |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| |     | |",
                                                                                                           "| +-----+ |",
                                                                                                           "+---------+"]
                 bH∫             iterate over the numbers from 1 to B-1:                                 [[...], 1]
                    3*2+           push pop()*3+2                                                        [[...], 5]
                        4;         push 4 one below the stack                                            [[...], 4, 5]
                          e        push the variable E (X length)                                        [[...], 4, 5, 5]
                            :*     get that many colons                                                  [[...], 4, 5, ":::::"]
                              ž    insert [at coordinates [4; cIter*3+2] the colons]                     
dzaima
fonte
4

C # (.NET Core) , 202 bytes

(L,x)=>{char p='+',n='\n',e=' ';string v="|",r="",s=p+new string('-',L+4)+p+n,q=v+e+p+new string('-',L)+p+e+v+n;r+=s+q;for(int i=0;i<3*x-1;)r+=v+e+v+new string(i++%3<2?e:':',L)+v+e+v+n;r+=q+s;return r;}

Experimente online!

Charlie
fonte
4

Python 2 , 128 126 bytes

L,x=input()
k='+'+'-'*(L+4)+'+\n| +'+'-'*L+'+ |\n'
f=lambda k:'| |'+k*L+'| |\n'
print k+f(':').join([f(' ')*2]*x)[:-1]+k[::-1]

Experimente online!

-2 bytes graças a @ Mr.Xcoder

HyperNeutrino
fonte
126 bytes
Sr. Xcoder
@ Mr.Xcoder direito, obrigado, eu não sei o que eu estava pensando com esses suportes extras: P
HyperNeutrino
3

PHP , 153 bytes

for(;$i-2<$z=3*$argv[2]+1;$i++)echo str_pad(strrev($r=["--+","+ |","| |"][!($b=$i>1&$i<$z)?$i&&$i<$z+1?1:0:2]),$argv[1]+3,"- :"[$b?$i%3!=1?1:2:0])."$r
";

Experimente online!

Jörg Hülsermann
fonte
2

Carvão , 36 bytes

NθNηFη«M³↑P×θ:»←B⁺θ²⁺׳η¹↖←B⁺θ⁶⁺׳η³

Experimente online!

Este é um algoritmo mais carvão-y do que minha outra resposta.

Erik, o Outgolfer
fonte
11
O carvão assumiu oficialmente todo o desafio. 4/10 respostas estão em carvão ...
Mr. Xcoder
@ Mr.Xcoder Bem, é uma linguagem projetada especificamente para o golfe ascii-art, e é isso que você ganha com isso. ;)
Erik the Outgolfer
11
Pedido de explicação.
CalculatorFeline
@ Mr.Xcoder E três deles são do mesmo comprimento também!
Neil
2

C (gcc) , 195 bytes

#define P printf
y;f(L,l){char s[L+1],t[L+1];memset(s,45,L);memset(t,58,L);t[L]=s[L]=0;P("+-%s-+\n|+%s+|\n",s,s);for(y=3*l;y-->1;y%3?P("||%*c||\n",L,32):P("||%s||\n",t));P("|+%s+|\n+-%s-+",s,s);}

Experimente online!

escoteiro
fonte
1

Perl 5 , 124 + 1 (-a) = 125 bytes

say$o='+'.'-'x($l=pop@F),$t="----+
",$i="| $o+ |
",$e=($d="| |").$"x$l.$d,$/,$e;say$d.':'x$l."$d
$e
$e"for 2..$_;say$i,$o,$t

Experimente online!

Xcali
fonte