Olimpiyatların Ev Sahibi Sizsiniz!


17

Olimpiyat Oyunlarına ev sahipliği yapıyorsunuz ve fırsat uğruna harika bir havuz inşa etmeniz gerekiyor, ancak süpervizörler genellikle boyutlarla ilgili fikirlerini değiştiriyor ve istenen boyutta yeniden inşa etmek için hızlı bir yola ihtiyaç duyuyorlar!


İki tamsayı verildiğinde Lve xgöreviniz uzunluk Lve xşeritlerden oluşan bir yüzme havuzu inşa etmektir .

Havuz nasıl inşa edilir?

  • Yatay duvarları Lardışık kesiklerden ( -) yapılmış ve dikey duvarları 3x - 1çubuklardan ( |) yapılmış bir iç kare içerir . Ayrıca, +her köşede 4 işaret bulunur. Bir örnek verelim ( L = 10, x = 2):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Her şerit 2 dikey birimin genişliğine sahiptir. İç kare, yatay olarak ardışık sembollerden x-1oluşan şerit ayırıcılar ile doldurulur . Şerit ayırıcıları yerleştirdikten sonra havuzumuz şöyle görünmelidir:L:

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Bir havuz ayrıca yatay duvarları (L + 4) s ve dikey duvarları (3x + 1) s olan ve iç kareyi çevreleyen bir dolgu (dış kare) içerir :-|

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

Ve bu bizim olimpik boyuttaki ** yüzme havuzumuz!


Özellikleri:

  • Tasarım ve işlevsellik amacıyla, 100 ≥ L ≥ 10ve 15 ≥ x ≥ 2.

  • Çıktı tam olarak gösterildiği gibi olmalıdır. "Dikey olarak oluşturulmuş" * havuzunun çıkışına izin verilmez.

  • Sondaki ve öndeki boşluklara izin verilir.

  • Herhangi bir standart yöntemle girdi alabilir ve çıktı sağlayabilirsiniz .

  • Varsayılan Loopholes geçerlidir.


Örnekler / Test örnekleri:

L = 20, x = 3

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



L = 50, x = 5:

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


L = 10, x = 15

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

Bu , bu yüzden bayt içindeki en kısa kod kazanır!

* Su dikey olarak inşa edilirse akabilir: P

** Evet, şeritlerin ne kadar çok olduğunu ve havuz ne kadar kısa olursa, çizimin bir havuz gibi göründüğünün farkındayım!


Korumalı alan , silinen yayınları görüntüleyenler için.
Bay Xcoder

Ne olur x>=L??
CraigR8806

@ CraigR8806 Aynı algoritma. Sadece havuzun uzunluğundan daha fazla şeritli. Soruyu yanlış kullandığınızı hissediyorum ...
Bay

Ne dava hakkında L=10ve x=15? Havuza yerleştirilebileceğinden daha fazla şerit olmaz mı?
Niyeti

@ CraigR8806 Uzunluğun şeritlerle ilgisi yok! Mevcut yanıtlardan biriyle kendiniz test edebilirsiniz
Bay Xcoder

Yanıtlar:


13

Kömür , 32 bayt

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

Çevrimiçi deneyin!

-4 Neil sayesinde .

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

vay Kömür bu meydan okuma var :)
Downgoat

Adınıza sadık kaldınız - beni geride bıraktınız.
notjagan

2
Her zamanki gibi açıklama talebi.
CalculatorFeline

@CalculatorFeline Evet, outgolf'a bir şey ararken tüm bu açıklamaları yapmak için zamanım yok ... Ayrıca -akomut satırı argümanını kullanarak AST'yi kontrol edebilirsiniz .
Outgolfer Erik

neden -ahata
veriyor

12

Kömür , 40 39 37 bayt

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

Çevrimiçi deneyin!

Neil'in zaten aynı uzunlukta bir Kömür cevabı olduğunu biliyorum , ama biraz farklı bir yaklaşım izledim, bu yüzden benimkini de gönderebileceğimi düşündüm.

açıklama

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
Açıklama lütfen.
CalculatorFeline

@CalculatorFeline Eklendi.
notjagan

1
Ha, üçüncü parametre isteğe bağlı mı? Güzel, bu beni iki bayt kurtardı!
Neil

11

Kömür, 40 38 36 31 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

Kömürün çizim ilkelleri +s dahil olmak üzere genel karakter sayısını kullanır , ancak giriş sadece -s sayısıdır , bu nedenle iç duvarın genişliğini elde etmek için 2 eklememiz gerekir.

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

İç duvarın yüksekliğini, alt sıra dahil olmak üzere tekrar hesaplayın, böylece şerit başına üç artı bir tane.

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

Şeritleri çizin. Bu, :iki boş satırla dikey olarak ayrılmış s ile dolu bir dikdörtgen (sütunlar yeni satır karakterlerini temsil eder).

Bθη         Box(q, h);

RectangleKomut tam olarak iç duvar çizmek gerekir şeydir. Düzenle: Boxüçüncü parametresini atlamanızı sağlayarak bana 2 bayt kazandırır.

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

Ve tekrar dış duvarı çizmek için, biraz daha geniş ve daha uzun ve iç duvar üzerinde ortalanmış.


1
Neden TIO'daki Kömür kodunun bağlantıları asla gerçek koda değil?
Jonathan Allan

1
@JonathanAllan Daha okunabilir olduğu için ayrıntılı koda bağladım, ayrıca doğrulama amacıyla özlü kodu otomatik olarak oluşturmak için argümanı ekliyorum.
Neil

... ama 219 karakter 40'tan daha fazla nasıl okunabilir? : p
Jonathan Allan

Ben sadece daha sert görünüyordu ve bu ipucu fark :)
Jonathan Allan

1
Her zamanki gibi lütfen açıklayınız.
CalculatorFeline

8

T-SQL, 284281 bayt

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

Giriş INT sütun alınan L ve X , önceden var olan Tablo içinde t , bizim, girdi yöntemlere göre .

Temelde tekrarlanan karakterleri temsil eden harflerle uzun bir dize oluşturuyorum (d = tire, s = boşluk, c = iki nokta, b = satır sonu), sonra hepsini uygun dolgularla değiştirin.

biçimlendirilmiş:

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

Döngünün içine 2 satır boşluk ve 1 satır iki nokta üst üste eklerim, sonunda sonunda bu ayırıcı satırı keser ve değiştirmeleri gerçekleştirmeden önce havuz kenarlığını eklerim.

EDIT : @En sık kullanılan değişkene geçip başlatma sırasını değiştirerek 3 bayt kaydetti .


8

JavaScript (ES6), 137 124 bytes

Golfed it down a bit on my phone, more to follow.

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

Try it

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>


I like this one because it's interactive :D
xDaizu

@xDaizu, check out some of my other JS solutions, so ;)
Shaggy


4

SOGL V0.12, 52 51 bytes

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

Try it Here!
Not bad considering that 20 bytes of this is a rectangle function, which charcoal has a built-in for.

Explanation:

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

Try it online!



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

Try it online!


3

Python 2, 97 bytes

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

Try it online!


Python 2, 98 bytes

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

Try it online!


2

Charcoal, 36 bytes

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

Try it online!

This is a more Charcoal-y algorithm than my other answer.


1
Charcoal has officially taken over the whole challenge. 4/10 answers are in Charcoal...
Mr. Xcoder

@Mr.Xcoder Well, it's a language specifically designed to golf ascii-art, so that's what you get for it. ;)
Erik the Outgolfer

1
Explanation request.
CalculatorFeline

@Mr.Xcoder And three of them are the same length too!
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);}

Try it online!


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

Try it online!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.