Вы хозяин олимпиады!


17

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


Дано два целых числа, Lи xваша задача - построить бассейн длины Lи xдорожек.

Как строится бассейн?

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

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

    + ---------- +
    | |
    | |
    | :::::::::: |
    | |
    | |
    + ---------- +
    
  • Пул также содержит отступ (внешний квадрат), горизонтальные стены которого (L + 4) -с, а вертикальные стены (3x + 1) |с, который окружает внутренний квадрат:

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

И это наш ** олимпийский бассейн **!


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

  • В целях дизайна и функциональности вам гарантировано, что 100 ≥ L ≥ 10и 15 ≥ x ≥ 2.

  • Вывод должен быть точно таким, как показано. Вывод "вертикально построенного" * пула не разрешен.

  • Трейлинг и ведущие пробелы разрешены.

  • Вы можете принимать и предоставлять данные любым стандартным способом .

  • Применяются стандартные лазейки .


Примеры / Тестовые случаи:

L = 20, х = 3

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



L = 50, х = 5:

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


L = 10, х = 15

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

Это , поэтому выигрывает самый короткий код в байтах !

* Вода может вытекать, если она построена вертикально: P

** Да, я знаю, что чем больше дорожек и чем короче пул, тем меньше рисунок выглядит как пул!


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

Что должно произойти, если x>=L??
CraigR8806

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

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

@ CraigR8806 Длина не имеет никакого отношения к полосам! Вы можете проверить это самостоятельно с помощью одного из существующих ответов
Mr. Xcoder,

Ответы:


13

Древесный уголь , 32 байта

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

Попробуйте онлайн!

-4 спасибо Нейлу .

АСТ:

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 Charcoal
справился с

Вы остались верны своему имени - вы превзошли меня.
notjagan

2
Как обычно, запрос на объяснение.
CalculatorFeline

@CalculatorFeline Да, у меня нет времени, чтобы сделать все эти объяснения, в то время как я ищу что-то, чтобы переиграть ... также вы можете проверить AST, используя -aаргумент командной строки.
Эрик Outgolfer

почему возникает -aошибка> _ <
Эрик Outgolfer

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
Да, так что третий параметр необязателен? Хорошо, это спасает меня от двух байтов!
Нил

11

Древесный уголь, 40 38 36 31 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

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

Примитивы рисования в Charcoal используют общее количество символов, включая +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 и X в существовавших ранее таблицах т , в соответствии с нашим разрешенными методами ввода .

По сути, я создаю длинную строку с буквами, представляющими повторяющиеся символы (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 ряд двоеточий, затем в конце я отсекаю этот разделительный ряд и добавляю границу пула перед выполнением замен.

РЕДАКТИРОВАТЬ : сохранить 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

Древесный уголь , 36 байт

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

Попробуйте онлайн!

Это более алгоритм Charcoal-y, чем мой другой ответ.


1
Древесный уголь официально взял на себя весь вызов. 4/10 ответов на
углях

@ Mr.Xcoder Ну, это язык, специально разработанный для гольфа ascii-art, так что вот что вы получите за это. ;)
Эрик Outgolfer

1
Объяснение запроса.
CalculatorFeline

@ Mr.Xcoder И три из них тоже одинаковой длины!
Нил


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.