Jesteś gospodarzem Igrzysk Olimpijskich!

17

Organizujesz igrzyska olimpijskie i na tę okazję musisz zbudować fantastyczną pulę, ale przełożeni często zmieniają zdanie na temat wymiarów i potrzebują szybkiego sposobu na odbudowanie go o żądanym rozmiarze!


Biorąc pod uwagę dwie liczby całkowite, La xTwoim zadaniem jest zbudowanie basenu długości Li linii x.

Jak budowany jest basen?

  • Zawiera wewnętrzny kwadrat, którego poziome ściany są wykonane z Lkolejnych kresek ( -), a pionowe ściany z 3x - 1prętów ( |). Dodatkowo +w każdym rogu znajdują się 4 znaki. Weźmy przykład ( L = 10, x = 2):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Każda linia ma szerokość 2 jednostek pionowych. Wewnętrzny kwadrat jest wypełniony x-1separatorami linii, składającymi się z Lpoziomo następujących po sobie :symboli. Po umieszczeniu separatorów linii nasza pula powinna wyglądać następująco:

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Pula zawiera również wypełnienie (zewnętrzny kwadrat), którego poziomymi ścianami są (L + 4) -si pionowymi ścianami (3x + 1) |s, które otaczają wewnętrzny kwadrat:

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

I to jest nasz basen olimpijski **!


Okular:

  • Dla celów projektowych i funkcjonalnych masz gwarancję, że 100 ≥ L ≥ 10i 15 ≥ x ≥ 2.

  • Dane wyjściowe muszą być dokładnie takie, jak pokazano. Generowanie puli „zbudowanej pionowo” * jest niedozwolone.

  • Dozwolone są spacje końcowe i wiodące.

  • Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe dowolną standardową metodą .

  • Obowiązują domyślne luki .


Przykłady / przypadki testowe:

L = 20, x = 3

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



L = 50, x = 5:

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


L = 10, x = 15

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

To jest , więc wygrywa najkrótszy kod w bajtach !

* Woda może wypłynąć, jeśli jest zbudowana pionowo: P

** Tak, wiem, że im więcej pasów i im krótsza jest pula, tym mniej rysunek wygląda jak pula!

Pan Xcoder
źródło
Piaskownica , dla tych, którzy mogą wyświetlać usunięte posty.
Pan Xcoder,
Co powinno się stać, jeśli x>=L?
CraigR8806
@ CraigR8806 Ten sam algorytm. Tylko z większą liczbą pasów niż długość basenu. Mam wrażenie, że pomyliłeś pytanie ...
Pan Xcoder,
Co ze sprawą, gdzie L=10i x=15? Czy nie byłoby więcej pasów, niż można by umieścić w basenie? Mogę nie
rozumieć
@ CraigR8806 Długość nie ma nic wspólnego z liniami! Możesz to przetestować sam, korzystając z jednej z istniejących odpowiedzi
Mr. Xcoder,

Odpowiedzi:

13

Węgiel drzewny , 32 bajty

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

Wypróbuj online!

-4 dzięki Neilowi .

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 the Outgolfer
źródło
wow Charcoal ma to wyzwanie :)
Downgoat
Pozostałaś wierna swojemu imieniu - rozgromiłeś mnie.
notjagan
2
Jak zwykle prośba o wyjaśnienie.
CalculatorFeline,
@CalculatorFeline Tak, nie mam czasu na te wszystkie wyjaśnienia, gdy szukam czegoś do gry w golfa ... możesz też sprawdzić AST za pomocą -aargumentu wiersza poleceń.
Erik the Outgolfer
dlaczego -apodnosi błąd> _ <
Erik the Outgolfer
12

Węgiel drzewny , 40 39 37 bajtów

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

Wypróbuj online!

Wiem, że Neil ma już odpowiedź na węgiel drzewny o tej samej długości, ale podjąłem trochę inne podejście, więc pomyślałem, że równie dobrze mogę wysłać moją.

Wyjaśnienie

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
źródło
1
Proszę o wyjaśnienie.
CalculatorFeline,
@CalculatorFeline Dodano.
notjagan
1
Huh, więc trzeci parametr jest opcjonalny? Fajnie, to oszczędza mi dwa bajty!
Neil
11

Węgiel drzewny, 40 38 36 31 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Prymitywy rysunkowe Węgla drzewnego wykorzystują ogólną liczbę znaków, w tym +s, jednak wejście jest tylko liczbą -s, więc musimy dodać 2, aby uzyskać szerokość wewnętrznej ściany.

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

Oblicz ponownie wysokość wewnętrznej ściany, w tym dolnego rzędu, czyli trzy na linię plus jeden.

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

Narysuj linie. To jest po prostu wypełniony prostokąt: literą s oddzieloną pionowo dwiema pustymi liniami (pilcrows reprezentują znaki nowej linii).

Bθη         Box(q, h);

RectanglePolecenie jest dokładnie to, czego potrzebujemy, aby narysować ścianę wewnętrzną. Edytować:Box pozwala pominąć trzeci parametr, oszczędzając mi 2 bajty.

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

I jeszcze raz, aby narysować ścianę zewnętrzną, z wyjątkiem nieco szerszej i wyższej i wyśrodkowanej na ścianie wewnętrznej.

Neil
źródło
1
Dlaczego linki do kodu Charcoal w TIO nigdy nie do rzeczywistego kodu?
Jonathan Allan
1
@JonathanAllan Link do pełnego kodu, ponieważ jest on bardziej czytelny, a ponadto dodaję argument, aby automatycznie wygenerować zwięzły kod do celów weryfikacji.
Neil,
... ale w jaki sposób 219 znaków jest bardziej czytelnych niż 40? : p
Jonathan Allan,
Mogłem po prostu wyglądać mocniej i zauważyłem tę wskazówkę :)
Jonathan Allan,
1
Jak zwykle wyjaśnij.
CalculatorFeline,
8

T-SQL, 284 281 bajtów

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

Dane pobierane są z INT kolumn L i x w istniejącej tabeli t , zgodnie z naszymi dozwolonymi metodami wprowadzania .

Zasadniczo tworzę długi ciąg z literami reprezentującymi powtarzające się znaki (d = myślniki, s = spacje, c = dwukropki, b = podział linii), a następnie WYMIENIJ je wszystkie na końcu z odpowiednimi wypełniaczami.

Sformatowany:

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

Wewnątrz pętli dołączam 2 rzędy spacji i 1 rząd dwukropków, a następnie na końcu odcinam ten rząd rozdzielający i dołączam granicę puli przed wykonaniem zamiany.

EDYCJA : Zapisano 3 bajty, przełączając @się na najczęściej używaną zmienną i zamieniając kolejność inicjalizacji.

BradC
źródło
8

JavaScript (ES6), 137 124 bajtów

Grałem trochę w golfa na moim telefonie, więcej do naśladowania.

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

Spróbuj

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>

Kudłaty
źródło
Podoba mi się ten, ponieważ jest interaktywny: D
xDaizu
@xDaizu, sprawdź niektóre z moich innych rozwiązań JS, więc;)
Shaggy
6

Python 2 , 124 120 117 bajtów

-2 bajty dzięki 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]

Wypróbuj online!

Pręt
źródło
122 bajty (twoja zmienna tjest niepotrzebna)
HyperNeutrino,
4

SOGL V0.12 , 52 51 bajtów

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

Wypróbuj tutaj!
Nieźle, biorąc pod uwagę, że 20 bajtów to funkcja prostokąta, dla której węgiel ma wbudowaną funkcję.

Wyjaśnienie:

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
źródło
4

C # (.NET Core) , 202 bajty

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

Wypróbuj online!

Charlie
źródło
4

Python 2 , 128 126 bajtów

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]

Wypróbuj online!

-2 bajty dzięki @ Mr.Xcoder

HyperNeutrino
źródło
126 bajtów
Mr. Xcoder
@ Mr.Xcoder Racja, dzięki, nie wiem, co myślałem z tymi dodatkowymi nawiasami: P
HyperNeutrino
3

PHP , 153 bajty

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

Wypróbuj online!

Jörg Hülsermann
źródło
2

Węgiel drzewny , 36 bajtów

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

Wypróbuj online!

Jest to algorytm bardziej węglowy niż moja inna odpowiedź.

Erik the Outgolfer
źródło
1
Węgiel drzewny oficjalnie przejął całe wyzwanie. 4/10 odpowiedzi znajduje się w
kolorze
@ Mr.Xcoder Cóż, jest to język specjalnie zaprojektowany do gry w ascii-golfa, więc za to dostajesz. ;)
Erik the Outgolfer,
1
Żądanie wyjaśnienia.
CalculatorFeline,
@ Mr.Xcoder I trzy z nich są tej samej długości!
Neil
2

C (gcc) , 195 bajtów

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

Wypróbuj online!

szkocki
źródło
1

Perl 5 , 124 + 1 (-a) = 125 bajtów

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

Wypróbuj online!

Xcali
źródło