Ви господар господарів Олімпіади!


17

Ви проводите Олімпійські ігри, і вам потрібно зібрати фантастичний басейн заради цього випадку, але наглядові органи часто змінюють свою думку щодо розмірів, і потрібен швидкий спосіб відновити його із потрібним розміром!


Враховуючи два цілих числа, Lі x, ваше завдання - побудувати басейн довжиною Lі xсмугами.

Як будується басейн?

  • Він містить внутрішній квадрат, горизонтальні стінки якого виготовлені з Lпослідовних тире ( -), а вертикальні стінки виконані з 3x - 1брусків ( |). Крім того, +у кожному куті лежать 4 знаки. Давайте маємо приклад ( L = 10, x = 2):

    + ---------- +
    | |
    | |
    | |
    | |
    | |
    + ---------- +
    
  • Кожна смуга має ширину 2 вертикальних одиниці. Внутрішній квадрат заповнений x-1роздільниками смуг, що складаються з Lгоризонтально послідовних :символів. Після розміщення роздільників смуги руху наш басейн повинен виглядати так:

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Басейн також містить прокладки (зовнішній квадрат), горизонтальні стіни яких (L + 4) -s і вертикальні стіни яких (3x + 1) |s, що оточують внутрішній квадрат:

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

І це наш басейн ** з олімпійськими розмірами **!


Технічні характеристики:

  • З метою дизайну та функціональності ви гарантуєте, що 100 ≥ L ≥ 10і 15 ≥ x ≥ 2.

  • Вихід повинен бути точно таким, як показано. Виведення "вертикально вбудованого" * пулу заборонено.

  • Доступні пробіли та провідні місця.

  • Ви можете взяти вклад і надати вихід за допомогою будь-якого стандартного методу .

  • Застосовуються лазівки за замовчуванням .


Приклади / Тестові приклади:

L = 20, x = 3

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



L = 50, x = 5:

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


L = 10, x = 15

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

Це , тому найкоротший код у байтах виграє!

* Вода може витікати, якщо вона побудована вертикально: P

** Так, я знаю, що чим більше смуг і коротший басейн, тим менше малюнок виглядає як басейн!


Пісочниця - для тих, хто може переглядати видалені публікації.
Містер Xcoder

Що має статися, якщо x>=L??
CraigR8806

@ CraigR8806 Той самий алгоритм. Просто з більшою смугою, ніж довжина басейну. У мене таке відчуття, що ви неправильно прочитали питання ...
Містер Xcoder

А як щодо випадку, де L=10і x=15? Чи не було б більше доріжок, ніж можна було б розмістити в басейні? Я міг би нерозуміти наміри
CraigR8806

@ CraigR8806 Довжина не має нічого спільного з смугами! Ви можете перевірити його самим за допомогою однієї з існуючих відповідей
Містер Xcoder

Відповіді:


13

Вугілля деревне , 32 байти

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

Спробуйте в Інтернеті!

-4 завдяки Нілу .

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 Деревне вугілля
знищило

Ти залишився вірним своєму імені - ти перевершив мене.
notjagan

2
Як завжди, запит на пояснення.
CalculatorFeline

@CalculatorFeline Так, я не маю часу робити всі ці пояснення, коли я щось шукаю, щоб перевершити ... також ви можете перевірити AST, використовуючи -aаргумент командного рядка.
Ерік Аутгольфер

чому -aпіднімає помилку> _ <
Ерік Аутгольфер

12

Вугілля деревне , 40 39 37 байт

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

Спробуйте в Інтернеті!

Я знаю, що у Ніла вже є відповідь Вугільного вугілля приблизно однакової довжини, але я застосував трохи інший підхід, тому я зрозумів, що, можливо, також розміщу свою.

Пояснення

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
Пояснення будь ласка.
CalculatorFeline

@CalculatorFeline Додано.
notjagan

1
Так, третій параметр to необов'язковий? Приємно, що врятує мені два байти!
Ніл

11

Вугілля деревне, 40 38 36 31 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

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

Примітиви для малювання деревного вугілля використовують загальну кількість символів, включаючи +s, проте вхід - це лише кількість -s, тому нам потрібно додати 2, щоб отримати ширину внутрішньої стінки.

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

Обчисліть висоту внутрішньої стіни, знову ж таки, включаючи нижній ряд, так що три на смугу плюс одна.

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

Намалюйте смуги. Це просто прямокутник, заповнений :s вертикально розділеними двома порожніми лініями (стовпчики представляють символи нового рядка).

Bθη         Box(q, h);

RectangleКоманда саме те , що нам потрібно зробити внутрішню стінку. Редагувати:Box дозволяє опустити її третій параметр, заощадивши мені 2 байти.

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

І знову намалювати зовнішню стінку, за винятком трохи ширшої та високої, та зосередженої на внутрішній стіні.


1
Чому посилання на код деревного вугілля в TIO ніколи не є фактичним?
Джонатан Аллан

1
@JonathanAllan Я посилаюсь на багатослівний код, тому що він є більш читабельним, плюс я додаю аргумент для автоматичного створення короткого коду для цілей перевірки.
Ніл

... але як читається 219 символів, ніж 40? : p
Джонатан Аллан

Я міг би просто виглядати важче і помітив цю пораду :)
Джонатан Аллан

1
Як завжди, будь ласка, поясніть.
CalculatorFeline

8

T-SQL, 284 281 байт

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

Вхідні дані беруться з стовпців INT L і х в дотеперішніх таблицях т , в відповідно з нашим дозволеними методами введення .

В основному я створюю довгий рядок з літерами, що представляють повторювані символи (d = тире, s = пробіли, c = колонки, b = розрив рядка), а потім замінюю їх усі наприкінці відповідними наповнювачами.

Відформатовано:

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

Всередину петлі я додаю 2 ряди заготовок і 1 ряд колонок, потім в кінці відрізаю цей розділовий ряд і додаю межу пулу перед тим, як виконувати заміну.

EDIT : збережено 3 байти шляхом переходу @на найбільш часто використовувану змінну та заміни порядку ініціалізації.


8

JavaScript (ES6), 137 124 байт

Гольфував це трохи на своєму телефоні, більше слідкувати.

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

Спробуй це

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>


Мені це подобається, тому що він інтерактивний: D
xDaizu

@xDaizu, ознайомтеся з іншими моїми рішеннями JS, так;)
Shaggy


4

SOGL V0.12 , 52 51 байт

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

Спробуйте тут!
Непогано, якщо врахувати, що 20 байт - це функція прямокутника, для якої вугілля має вбудований.

Пояснення:

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]                     





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!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.