Нарисуйте несколько 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

Python 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

Haskell, 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.