Anda adalah Tuan Rumah Olimpiade!

17

Anda menjadi tuan rumah Olimpiade, dan perlu membangun kolam yang fantastis untuk kesempatan ini, tetapi para penyelia sering berubah pikiran tentang dimensi, dan perlu cara cepat untuk membangunnya kembali dengan ukuran yang diminta!


Diberi dua bilangan bulat, Ldan x, tugas Anda adalah membangun kolam renang panjang Ldan xjalur.

Bagaimana kolam dibangun?

  • Ini berisi kuadrat dalam, yang dinding horizontal terbuat dari Ltanda hubung berturut - turut ( -), dan dinding vertikal yang terbuat dari 3x - 1bar ( |). Selain itu, 4 +tanda terletak di setiap sudut. Mari kita ambil contoh ( L = 10, x = 2):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Setiap jalur memiliki lebar 2 unit vertikal. Alun-alun bagian dalam diisi dengan x-1pemisah jalur, terdiri dari simbol L- :simbol yang berurutan secara horizontal . Setelah meletakkan pemisah jalur, kolam kami akan terlihat seperti ini:

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Kolam juga berisi padding (kotak luar), yang dinding horizontal (L + 4) -dan dinding vertikal (3x +1) |, yang mengelilingi kotak bagian dalam:

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

Dan itulah kolam renang ** berukuran olimpiade kami!


Spesifikasi:

  • Untuk tujuan desain dan fungsionalitas, Anda dijamin akan 100 ≥ L ≥ 10dan 15 ≥ x ≥ 2.

  • Outputnya harus persis seperti yang ditunjukkan. Outputing "pool yang dibangun secara vertikal" * tidak diizinkan.

  • Ruang tertinggal dan terdepan diizinkan.

  • Anda dapat mengambil input dan memberikan output melalui metode standar apa pun .

  • Berlaku celah default .


Contoh / Uji kasus:

L = 20, x = 3

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



L = 50, x = 5:

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


L = 10, x = 15

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

Ini adalah , jadi kode terpendek dalam byte menang!

* Air bisa mengalir keluar jika dibangun secara vertikal: P

** Ya, saya sadar bahwa semakin banyak jalur dan semakin pendek kolam, semakin sedikit gambar yang tampak seperti kolam!

Tuan Xcoder
sumber
Sandbox , bagi mereka yang dapat melihat posting yang dihapus.
Tn. Xcoder
Apa yang harus terjadi jika x>=L??
CraigR8806
@ CraigR8806 Algoritma yang sama. Hanya dengan lebih banyak jalur dari pada panjang kolam. Saya merasa Anda salah membaca pertanyaan ...
Tn. Xcoder
Bagaimana dengan kasing di mana L=10dan di mana x=15? Tidak akan ada lebih banyak jalur daripada yang bisa ditempatkan di kolam? Saya bisa salah paham maksudnya
CraigR8806
@ CraigR8806 Panjangnya tidak ada hubungannya dengan jalur! Anda dapat mengujinya sendiri dengan salah satu jawaban yang ada
Tn. Xcoder

Jawaban:

13

Arang , 32 byte

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

Cobalah online!

-4 Terima kasih kepada 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 the Outgolfer
sumber
wow Charcoal telah mengatasi tantangan ini :)
Downgoat
Anda tetap setia pada nama Anda - Anda membuat saya kalah besar.
notjagan
2
Seperti biasa, permintaan penjelasan.
CalculatorFeline
@ CalculatorFeline Ya, saya tidak punya waktu untuk melakukan semua penjelasan itu sementara saya mencari sesuatu untuk mengungguli ... juga Anda dapat memeriksa AST menggunakan -aargumen baris perintah.
Erik the Outgolfer
mengapa -amemunculkan kesalahan> _ <
Erik the Outgolfer
12

Arang , 40 39 37 byte

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

Cobalah online!

Saya tahu Neil sudah memiliki jawaban Arang sekitar panjang yang sama, tetapi saya mengambil sedikit pendekatan yang berbeda jadi saya pikir saya mungkin juga posting saya.

Penjelasan

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
sumber
1
Mohon penjelasannya.
CalculatorFeline
@CalculatorFeline Ditambahkan.
notjagan
1
Hah, jadi parameter ketiga adalah opsional? Bagus, itu menyelamatkan saya dua byte!
Neil
11

Arang, 40 38 36 31 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Primitif gambar Charcoal menggunakan jumlah karakter keseluruhan termasuk +s, namun inputnya hanya jumlah -s, jadi kita perlu menambahkan 2 untuk mendapatkan lebar dinding bagian dalam.

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

Hitung ketinggian dinding bagian dalam, sekali lagi, termasuk baris bawah, jadi tiga per jalur ditambah satu.

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

Gambar jalur. Ini hanyalah sebuah persegi panjang yang diisi dengan :s yang dipisahkan secara vertikal oleh dua garis kosong (pilcrow mewakili karakter baris baru).

Bθη         Box(q, h);

The Rectangleperintah persis apa yang kita butuhkan untuk menarik dinding bagian dalam. Sunting: Boxmemungkinkan Anda menghilangkan parameter ketiga, menghemat saya 2 byte.

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

Dan lagi untuk menggambar dinding luar, kecuali sedikit lebih lebar dan lebih tinggi, dan berpusat di dinding bagian dalam.

Neil
sumber
1
Mengapa tautan ke kode Arang di TIO tidak pernah ke kode aktual?
Jonathan Allan
1
@JonathanAllan Saya menautkan ke kode verbose karena lebih mudah dibaca, ditambah saya menambahkan argumen untuk menghasilkan kode ringkas secara otomatis untuk keperluan verifikasi.
Neil
... tetapi bagaimana 219 karakter lebih mudah dibaca dari 40? : p
Jonathan Allan
Saya bisa saja terlihat lebih keras dan memperhatikan tip ini :)
Jonathan Allan
1
Seperti biasa, tolong jelaskan.
CalculatorFeline
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(':',@))

Input diambil dari kolom INT L dan x dalam tabel yang sudah ada t , sesuai metode input yang diizinkan .

Pada dasarnya saya membuat string panjang dengan huruf yang mewakili karakter yang diulang (d = tanda hubung, s = spasi, c = titik dua, b = garis istirahat), lalu GANTI semuanya pada akhirnya dengan pengisi yang sesuai.

Diformat:

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

Di dalam loop saya menambahkan 2 baris kosong dan 1 baris titik dua, kemudian pada akhirnya saya memotong baris pembagi itu dan menambahkan batas pool sebelum melakukan penggantian.

EDIT : Disimpan 3 byte dengan beralih @ke variabel yang paling sering digunakan, dan bertukar urutan inisialisasi.

BradC
sumber
8

JavaScript (ES6), 137 124 byte

Golf itu turun sedikit di ponsel saya, lebih banyak untuk mengikuti.

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

Cobalah

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
sumber
Saya suka yang ini karena interaktif: D
xDaizu
@ xDaizu, periksa beberapa solusi JS saya yang lain, jadi;)
Shaggy
6

Python 2 , 124 120 117 byte

-2 byte berkat 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]

Cobalah online!

tongkat
sumber
122 byte (variabel Anda ttidak perlu)
HyperNeutrino
4

SOGL V0.12 , 52 51 byte

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

Coba Di Sini!
Tidak buruk mengingat bahwa 20 byte ini adalah fungsi persegi panjang, yang memiliki built-in untuk arang.

Penjelasan:

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

Cobalah online!

Charlie
sumber
4

Python 2 , 128 126 byte

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]

Cobalah online!

-2 byte terima kasih kepada @ Mr.Xcoder

HyperNeutrino
sumber
126 byte
Mr. Xcoder
@ Mr.Xcoder Benar, terima kasih, saya tidak tahu apa yang saya pikirkan dengan tanda kurung tambahan: P
HyperNeutrino
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
";

Cobalah online!

Jörg Hülsermann
sumber
3

Python 2 , 97 byte

L,x=input()
for i in'01'+'223'*~-x+'2210':r=('+|||-   -+||'+L*'-- :')[int(i)::4];print r+r[2::-1]

Cobalah online!


Python 2 , 98 byte

L,x=input()
s='+---| +-%s+-+---'%'|:'.join(['| '*5]*x)
while s:print s[:3]+s[3]*L+s[2::-1];s=s[4:]

Cobalah online!

Tidak
sumber
2

Arang , 36 byte

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

Cobalah online!

Ini adalah algoritma yang lebih Charcoal-y daripada jawaban saya yang lain.

Erik the Outgolfer
sumber
1
Arang telah secara resmi mengambil alih seluruh tantangan. 4/10 jawaban ada di Charcoal ...
Mr. Xcoder
@ Mr.Xcoder Ya, ini adalah bahasa yang dirancang khusus untuk bermain ascii-art, jadi itulah yang Anda dapat. ;)
Erik the Outgolfer
1
Permintaan penjelasan.
CalculatorFeline
@ Mr.Xcoder Dan tiga dari mereka juga memiliki panjang yang sama!
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);}

Cobalah online!

scottinet
sumber
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

Cobalah online!

Xcali
sumber