Vous êtes l'hôte des Jeux olympiques!

17

Vous êtes l'hôte des Jeux Olympiques et devez construire une piscine fantastique pour l'occasion, mais les superviseurs changent souvent d'avis concernant les dimensions et ont besoin d'un moyen rapide de le reconstruire avec la taille demandée!


Étant donné deux nombres entiers, Let xvotre tâche est de construire une piscine de longueur Letx voies.

Comment se construit une piscine?

  • Il contient un carré intérieur, dont les parois horizontales sont constituées de Ltirets consécutifs ( -), et dont les parois verticales sont constituées de 3x - 1barres ( |). De plus, 4 +panneaux se trouvent dans chaque coin. Prenons un exemple (L = 10, x = 2 ):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Chaque voie a une largeur de 2 unités verticales. Le carré intérieur est rempli de x-1séparateurs de voies, constitués de symboles Lconsécutifs horizontalement :. Après avoir mis les séparateurs de voies, notre piscine devrait ressembler à ceci:

    + ---------- +
    | |
    | |
    | :::::::::: | |
    | |
    | |
    + ---------- +
    
  • Une piscine contient également un rembourrage (un carré extérieur), dont les parois horizontales sont (L + 4) -s et dont les parois verticales sont (3x + 1) |s, qui entoure le carré intérieur:

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

Et c'est notre piscine de taille olympique **!


Spécifications:

  • Pour des raisons de conception et de fonctionnalités, vous êtes assuré que 100 ≥ L ≥ 10et 15 ≥ x ≥ 2.

  • La sortie doit être exactement comme indiqué. La sortie d'un pool "construit verticalement" * est interdite.

  • Les espaces de fin et de début sont autorisés.

  • Vous pouvez prendre des entrées et fournir des sorties par toute méthode standard .

  • Les échappatoires par défaut s'appliquent.


Exemples / cas de test:

L = 20, x = 3

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



L = 50, x = 5:

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


L = 10, x = 15

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

C'est du , donc le code le plus court en octets gagne!

* L'eau pourrait s'écouler si elle est construite verticalement: P

** Oui, je sais que plus les couloirs sont nombreux et plus la piscine est courte, moins le dessin ressemble à une piscine!

M. Xcoder
la source
Sandbox , pour ceux qui peuvent voir les messages supprimés.
M. Xcoder
Que devrait-il se passer si x>=L??
CraigR8806
@ CraigR8806 Le même algorithme. Juste avec plus de voies que la longueur de la piscine. J'ai l'impression que vous avez mal lu la question ...
M. Xcoder
Et le cas où L=10et x=15? N'y aurait-il pas plus de couloirs que ce qui pourrait être placé dans la piscine? Je pourrais mal comprendre l'intention
CraigR8806
@ CraigR8806 La longueur n'a rien à voir avec les voies! Vous pouvez le tester vous-même avec l'une des réponses existantes
M. Xcoder

Réponses:

13

Fusain , 32 octets

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

Essayez-le en ligne!

-4 merci à 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 le Outgolfer
la source
wow Charcoal a réussi ce défi :)
Downgoat
Vous êtes resté fidèle à votre nom - vous m'avez déjoué.
notjagan
2
Comme d'habitude, demande d'explication.
CalculatorFeline
@CalculatorFeline Oui, je n'ai pas le temps de faire toutes ces explications pendant que je cherche quelque chose à surpasser ... vous pouvez également vérifier l'AST en utilisant l' -aargument de ligne de commande.
Erik the Outgolfer
pourquoi -asoulève une erreur> _ <
Erik the Outgolfer
12

Fusain , 40 39 37 octets

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

Essayez-le en ligne!

je sais Neil a déjà une réponse au charbon de bois de la même longueur, mais j'ai adopté une approche légèrement différente, alors j'ai pensé que je pourrais aussi poster la mienne.

Explication

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
la source
1
Explication s'il vous plaît.
CalculatorFeline
@CalculatorFeline ajouté.
notjagan
1
Huh, donc le troisième paramètre est facultatif? Bien, cela me fait gagner deux octets!
Neil
11

Fusain, 40 38 36 31 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Les primitives de dessin de Charcoal utilisent le nombre total de caractères, y compris +s, mais l'entrée n'est que le nombre de -s, nous devons donc ajouter 2 pour obtenir la largeur de la paroi intérieure.

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

Calculez la hauteur de la paroi intérieure, encore une fois, y compris la rangée du bas, donc trois par voie plus une.

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

Dessinez les voies. Il s'agit simplement d'un rectangle rempli de :s séparés verticalement par deux lignes vides (les pilcrows représentent des caractères de nouvelle ligne).

Bθη         Box(q, h);

La Rectanglecommande est exactement ce dont nous avons besoin pour dessiner la paroi intérieure. Edit: Boxpermet d'omettre son troisième paramètre, me faisant économiser 2 octets.

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

Et encore pour dessiner le mur extérieur, sauf légèrement plus large et plus haut, et centré sur le mur intérieur.

Neil
la source
1
Pourquoi les liens vers le code Charcoal chez TIO ne sont-ils jamais vers le code réel?
Jonathan Allan
1
@JonathanAllan Je crée un lien vers le code détaillé car il est plus lisible, et j'ajoute l'argument pour générer automatiquement le code succinct à des fins de vérification.
Neil
... mais comment 219 caractères sont-ils plus lisibles que 40? : p
Jonathan Allan
J'aurais pu regarder plus fort et remarquer cette astuce :)
Jonathan Allan
1
Comme d'habitude, veuillez expliquer.
CalculatorFeline
8

T-SQL, 284 281 octets

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'entrée est tirée des colonnes INT L et x dans le tableau préexistant t , selon nos méthodes d'entrée autorisées .

Fondamentalement, je crée une longue chaîne avec des lettres représentant les caractères répétés (d = tirets, s = espaces, c = deux-points, b = saut de ligne), puis REMPLACEZ-les tous à la fin avec les remplisseurs appropriés.

Formaté:

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

À l'intérieur de la boucle, j'ajoute 2 rangées de blancs et 1 rangée de deux-points, puis à la fin, je coupe cette ligne de séparation et j'ajoute la bordure du pool avant d'effectuer les remplacements.

EDIT : sauvegarde de 3 octets en passant @à la variable la plus utilisée et en inversant l'ordre d'initialisation.

BradC
la source
8

JavaScript (ES6), 137 124 octets

Je l'ai joué un peu sur mon téléphone, plus à suivre.

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

Essayez-le

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>

Hirsute
la source
J'aime celui-ci car il est interactif: D
xDaizu
@xDaizu, découvrez quelques-unes de mes autres solutions JS, donc;)
Shaggy
6

Python 2 , 124 120 117 octets

-2 octets grâce à 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]

Essayez-le en ligne!

Barre
la source
122 octets (votre variable tn'est pas nécessaire)
HyperNeutrino
4

SOGL V0.12 , 52 51 octets

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

Essayez-le ici!
Pas mal étant donné que 20 octets sont une fonction rectangulaire, pour laquelle le charbon de bois a une fonction intégrée.

Explication:

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
la source
4

C # (.NET Core) , 202 octets

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

Essayez-le en ligne!

Charlie
la source
4

Python 2 , 128 126 octets

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]

Essayez-le en ligne!

-2 octets grâce à @ Mr.Xcoder

HyperNeutrino
la source
126 octets
M. Xcoder
@ Mr.Xcoder Bien, merci, je ne sais pas ce que je pensais avec ces supports supplémentaires: P
HyperNeutrino
3

PHP , 153 octets

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

Essayez-le en ligne!

Jörg Hülsermann
la source
2

Fusain , 36 octets

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

Essayez-le en ligne!

Ceci est un algorithme plus Charcoal-y que mon autre réponse.

Erik le Outgolfer
la source
1
Le charbon de bois a officiellement pris le relais. 4/10 réponses sont en charbon de bois ...
M. Xcoder
@ Mr.Xcoder Eh bien, c'est un langage spécialement conçu pour le golf ascii-art, c'est donc ce que vous obtenez pour cela. ;)
Erik the Outgolfer
1
Demande d'explication.
CalculatorFeline
@ Mr.Xcoder Et trois d'entre eux ont la même longueur aussi!
Neil
2

C (gcc) , 195 octets

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

Essayez-le en ligne!

scottinet
la source
1

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

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

Essayez-le en ligne!

Xcali
la source