Sei l'ospite delle Olimpiadi!


17

Ospiti i Giochi olimpici e devi creare un fantastico pool per il bene dell'occasione, ma i supervisori cambiano spesso idea delle dimensioni e hanno bisogno di un modo rapido per ricostruirlo con le dimensioni richieste!


Dati due numeri interi Le x, il tuo compito è quello di costruire una piscina di lunghezza Le xcorsie.

Come viene costruita una piscina?

  • Contiene un quadrato interno, le cui pareti orizzontali sono costituite da Ltrattini consecutivi ( -) e le cui pareti verticali sono costituite da 3x - 1barre ( |). Inoltre, 4 +segni si trovano in ogni angolo. Facciamo un esempio ( L = 10, x = 2):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Ogni corsia ha una larghezza di 2 unità verticali. Il quadrato interno è pieno di x-1separatori di corsia, costituiti da simboli Lorizzontalmente consecutivi :. Dopo aver inserito i separatori di corsia, il nostro pool dovrebbe apparire così:

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Una piscina contiene anche un'imbottitura (un quadrato esterno), le cui pareti orizzontali sono (L + 4) se le -cui pareti verticali sono (3x + 1) |, che circonda il quadrato interno:

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

E questa è la nostra piscina ** di dimensioni olimpiche!


Specifiche:

  • Ai fini di progettazione e funzionalità, è garantito che 100 ≥ L ≥ 10e 15 ≥ x ≥ 2.

  • L'output deve essere esattamente come mostrato. L'output di un pool "costruito verticalmente" * non è consentito.

  • Sono consentiti spazi secondari e iniziali.

  • È possibile accettare input e fornire output tramite qualsiasi metodo standard .

  • Si applicano scappatoie predefinite .


Esempi / casi di test:

L = 20, x = 3

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



L = 50, x = 5:

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


L = 10, x = 15

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

Questo è , quindi vince il codice più corto in byte !

* L'acqua potrebbe fuoriuscire se costruita in verticale: P

** Sì, sono consapevole che più sono le corsie e più corta è la piscina, meno il disegno sembra una piscina!


Sandbox , per coloro che possono visualizzare i post eliminati.
Mr. Xcoder,

Cosa dovrebbe succedere se x>=L??
CraigR8806,

@ CraigR8806 Lo stesso algoritmo. Solo con più corsie rispetto alla lunghezza della piscina. Ho la sensazione che tu abbia frainteso la domanda ...
Mr. Xcoder,

Che dire del caso in cui L=10e x=15? Non ci sarebbero più corsie di quelle che potrebbero essere collocate in piscina? Potrei fraintendere l'intento
CraigR8806,

@ CraigR8806 La lunghezza non ha nulla a che fare con le corsie! Puoi testarlo tu stesso con una delle risposte esistenti
Mr. Xcoder,

Risposte:


13

Carbone , 32 byte

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

Provalo online!

-4 grazie 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

wow Charcoal ha
raccolto

Sei rimasto fedele al tuo nome - mi hai superato.
Notjagan,

2
Come al solito, richiesta di spiegazione.
CalculatorFeline

@CalculatorFeline Sì, non ho tempo di fare tutte quelle spiegazioni mentre cerco qualcosa di più grande ... puoi anche controllare l'AST usando l' -aargomento della riga di comando.
Erik the Outgolfer,

perché -a
genera un

12

Carbone di legna , 40 39 37 byte

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

Provalo online!

So che Neil ha già una risposta al carbone di circa la stessa lunghezza, ma ho adottato un approccio un po 'diverso, quindi ho pensato di poter pubblicare anche la mia.

Spiegazione

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]

1
Spiegazione per favore.
CalculatorFeline

@CalculatorFeline Aggiunto.
Notjagan,

1
Eh, quindi il terzo parametro è facoltativo? Bello, questo mi fa risparmiare due byte!
Neil,

11

Carbone di legna, 40 38 36 31 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Le primitive di disegno di Charcoal usano il conteggio complessivo dei caratteri inclusi +s, tuttavia l'input è solo il numero di -s, quindi dobbiamo aggiungere 2 per ottenere la larghezza della parete interna.

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

Calcola di nuovo l'altezza della parete interna, compresa la riga inferiore, quindi tre per corsia più una.

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

Disegna le corsie. Questo è semplicemente un rettangolo riempito con :s separati verticalmente da due linee vuote (i caratteri a tratteggio rappresentano i caratteri di nuova riga).

Bθη         Box(q, h);

Il Rectanglecomando è esattamente ciò di cui abbiamo bisogno per disegnare la parete interna. Modifica: Boxconsente di omettere il suo terzo parametro, salvandomi 2 byte.

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

E ancora per disegnare il muro esterno, tranne leggermente più largo e più alto, e centrato sul muro interno.


1
Perché i collegamenti al codice carbone su TIO non sono mai al codice effettivo?
Jonathan Allan,

1
@JonathanAllan Mi collego al codice dettagliato perché è più leggibile, inoltre aggiungo l'argomento per generare automaticamente il codice sintetico a fini di verifica.
Neil,

... ma in che modo 219 caratteri sono più leggibili di 40? : p
Jonathan Allan,

Avrei potuto sembrare più duro e notare questo consiglio :)
Jonathan Allan,

1
Come al solito, per favore spiega.
Calcolatrice

8

T-SQL, 284 281 byte

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(':',@))

L'input è preso dalle colonne INT L e x nella tabella preesistente t , secondo i nostri metodi di input consentiti .

Fondamentalmente sto creando una lunga stringa con lettere che rappresentano i caratteri ripetuti (d = trattini, s = spazi, c = due punti, b = interruzione di riga), quindi SOSTITUALI tutti alla fine con i riempitori appropriati.

formattato:

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(':',@))

All'interno del ciclo aggiungo 2 file di spazi vuoti e 1 riga di due punti, quindi alla fine taglio la riga del divisore e aggiungo il bordo della piscina prima di eseguire i rimpiazzi.

EDIT : salvato 3 byte passando @alla variabile più utilizzata e scambiando l'ordine di inizializzazione.


8

JavaScript (ES6), 137 124 byte

Scivolando un po 'sul mio telefono, ne seguiranno altri.

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

Provalo

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>


Mi piace questo perché è interattivo: D
xDaizu il

@xDaizu, dai un'occhiata ad alcune delle mie altre soluzioni JS, quindi;)
Shaggy,


4

SOGL V0.12 , 52 51 byte

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

Provalo qui!
Non male considerando che 20 byte di questo è una funzione rettangolare, per cui il carbone ha un built-in.

Spiegazione:

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]                     

4

C # (.NET Core) , 202 byte

(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;}

Provalo online!



3

PHP , 153 byte

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
";

Provalo online!



2

Carbone , 36 byte

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

Provalo online!

Questo è un algoritmo più carbone-y rispetto alla mia altra risposta.


1
Il carbone ha assunto ufficialmente l'intera sfida. 4/10 risposte sono in carboncino ...
Mr. Xcoder

@ Mr.Xcoder Bene, è un linguaggio appositamente progettato per il golf ASCII-Art, quindi è quello che ottieni. ;)
Erik the Outgolfer,

1
Richiesta di spiegazione
CalculatorFeline

@ Mr.Xcoder E tre di loro hanno la stessa lunghezza!
Neil,

2

C (gcc) , 195 byte

#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);}

Provalo online!


1

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

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.