Намалюйте декілька ASCII-коробок


19

Візьміть два списки невід’ємних цілих чисел та виведіть поле ASCII, як визначено нижче.

  • Кути та перехрестя є плюсами: +(ASCII-код 43)
  • Вертикальні лінії - це бруски |(ASCII-код 124)
  • Горизонтальні лінії є мінусами -(ASCII-код 45)

Перший вхідний список вказує кількість мінусів між кожним знаком плюс у горизонтальному напрямку.

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

Простіше пояснити за допомогою кількох прикладів:

0    // No minuses between each + sign
0    // No bars between + signs

++
++

------------------
1 2   // First a single minus, then two minuses 
1 2   // First  one bar, then two bars

+-+--+
| |  |
+-+--+
| |  |
| |  |
+-+--+


------------------
1 0 3 0 2 0
2 1 0 0

+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

Роз'яснення:

  • Порядок введення та формат необов’язкові
  • Друкувати / відображати слід лише поля, але приймається пробіл або нові рядки.
  • Ви можете за бажанням додати 1 до всіх вхідних значень, якщо це зручніше. Другий приклад б тоді: 2 3; 2 3.

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


Відповіді:


5

MATL , 25 22 21 байт

'|-+ '2:"1tiYsQ(]E!+)

Використовує вхідні дані з 1доданими (дозволено викликом).

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

Пояснення

Код спочатку будує масив, що містить 1для кінцевого результату індекси стовпців непробільних символів та 0інше. Отже, якщо перший вхід є [2 1 4 1 3 1](був би [1 0 3 0 2 0]у форматі на основі 0), цей масив буде

1 0 1 1 0 0 0 1 1 0 0 1 1

Зверніть увагу, як довжина прогонів нулів пов'язана з введенням. Зокрема, цей масив будується так:

  1. Ініціалізуйте масив до одиничного 1.
  2. Обчисліть сукупну суму введення та додавання 1. У прикладі це наведено [3 4 8 9 12 13].
  3. Розширіть масив з кроку 1 шляхом присвоєння 1записів з (на основі 1) індексами, заданими кроком 2. Проміжні записи автоматично встановлюються на 0.

Аналогічний масив побудований для рядків. Другий вхід [3 2 1 1](або [2 1 0 0 ]) дає

1 0 0 1 0 1 1 1

Тепер другий масив множиться на 2, переміщується та додається з трансляцією до першого. Це дає 2D масив

3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3

Індексація у рядок '|-+ 'дає кінцевий результат у вигляді двовимірного масиву знаків. Оскільки індексація є модульною та на основі 1, індекс 0відповідає останньому елементу (пробілу).

'|-+ '                   % Push this string
      2:"       ]        % Do this twice
         1               % Push 1 (initial array)
          t              % Push another 1 (contents to be filled in)
           i             % Take input
            Ys           % Cumulative sum
              Q          % Add 1
               (         % Fill 1 into those entries of the array
                 E       % Multiply by 2
                  !      % Transpose
                   +     % Add, with broadcast
                    )    % Index (modular, 1-based) into the string

6

Пітон 2, 117 байт

def f(h,v):r="+"+"+".join("-"*i for i in h)+"+\n";print r+r.join(("|"+"|".join(" "*i for i in h)+"|\n")*i for i in v)+r

Спробуйте це на ideone.

Не чекаючи від цього занадто багато. Дійсно просте, просто використовує python приєднання та множення рядків, щоб зібрати все разом.


6

JavaScript (ES6), 83 байти

(a,b,g=(a,[s,t])=>t+a.map(n=>s.repeat(n)+t).join``+`
`)=>g(b,[g(a,` |`),g(a,`-+`)])

Вихідні дані включають два останніх рядки.


Ого. Тож подібні відповіді розміщені майже одночасно. ;)
Арнольд

(Однак ти побив мене за 2 хвилини та 2 байти.)
Арнаульд,

@Arnauld Ви витратили час на демо-версію ;-)
Ніл

Так, я думаю. ^^ Цікаво, що моя версія складе 81 байт з двома останніми рядками.
Арнольд


1

Pyth, 45 байт

AQj.i*hlH]Js.i*hlG\+m*d\-G-mjb*d]XJ"+-""| "Hk

Програма, яка приймає введення двох розділених комами списків на STDIN і друкує результат.

Тут, мабуть, ще потрібно зробити кілька гольфу.

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

Пояснення надходять пізніше


1

Хаскелл, 55 байт

f[a,b]x=a:do n<-x;(b<$[1..n])++[a]
g x=f[f"+-"x,f"| "x]

Визначає функцію, gяка приймає два списки введення та повертає список, що містить рядки виводу


0

PowerShell v2 +, 89 байт

param($a,$b)($x="+$(($a|%{'-'*$_})-join'+')+")
$b|%{,"|$(($a|%{' '*$_})-join'|')|"*$_;$x}

Данг, не думаю, що я цілком можу зловити JavaScript.

Приймає вхід $aі $bяк явні масиви. Встановлює змінну $xяк верхній рядок полів на основі циклічного перегляду $aта деякого об'єднання рядків. Це інкапсульовано в паренах, тому він розміщений на трубопроводі. Потім ми пробираємося через $bкожну ітерацію, вкладаючи на конвеєр дві струни - однаковий рядок стилю, але з пробілами і |замість дефісів і +, і $x. Усі ці рядки зібрані з конвеєра з неявним Write-Outputзавершенням програми, з новим рядком за замовчуванням між ними.

Приклади

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(0) @(0)
++
++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,0,3,0,2,0) @(2,1,0,0)
+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,4,1) @(1,2,1)
+-+----+-+
| |    | |
+-+----+-+
| |    | |
| |    | |
+-+----+-+
| |    | |
+-+----+-+


0

Желе , 30 26 байт

Ḣị“+-“| ”ị@
1;+\Ṭ
Ç€,€/Ñ€Y

Перевірте це на TryItOnline

Як?

Запроваджений вхід - це список двох списків, [vertical, horizontal]і він використовує інкретований варіант
- тому приклад 3 приймає [[3,2,1,1], [2,1,4,1,3,1]]
Кожен з них потім перетворюється на булівський масив із зазначенням відповідно rowType або rowCharacterType, наприклад, [[1,0,0,1,0,1,1,1], [1,0,1,1,0,0,0,1,1,0,0,1,1]]
поля потім будуються, роблячи рядки з символи, ідентифіковані комбінаціями rowType та rowCharacterType - тобто, rowType ідентифікує або "+-"або, "| "і rowCharacterType ідентифікує одного з цих двох символів.

Ḣị“+-“| ”ị@ - Link 1, create a row: [rowType, [rowCharaterTypes]]
Ḣ           - head - get the rowType
  “+-“| ”   - list of strings ["+-", "| "]
 ị          - index into (if rowType is 1 "+-"; if rowType is 0 "| ")
         ị@ - index into with reversed operands (index into that from rowCharaterTypes)
                (replace each 1 in rowCharaters with "+" or "|" and each 0 with "-" or " ")

1;+\Ṭ - Link 2, create the Type lists from the inputs: int[] nCharacters
1;    - 1 concatenated with the input
  +\  - reduce with addition (accumulation provides the indices)
    Ṭ - boolean array with 1s at those indices
            As an example take the vertical of example 3:
            [3,2,1,1] -> [1,3,2,1,1] -> [1,4,6,7,8] -> [1,0,0,1,0,1,1,1]
            each of which will be passed as a rowType for Link 1

Ç€,€/Ñ€Y - Main link, takes one argument: [Vertical, Horizontal] (incremented option)
Ç€       - call the last link (2) for each of the two lists in the input
  ,€/    - pair each and reduce (making a list of [rowtype [rowCharacterTypes]])
     р  - call the next link (1) for each
       Y - join on line feeds
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.