Вот несколько примеров ввода, поэтому я могу объяснить, в чем проблема:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Думайте об этой строке текста как о топографической карте некоторых гор. Каждый набор скобок иллюстрирует одну единицу высоты.
Если мы «рассмотрим» это со стороны, чтобы мы увидели горы вертикально, мы увидим:
4 5 cherries woohoo
1 2 3 moo lik e
i
Получив одну из этих топографических карт, выведите карту, но в вертикальном масштабе, как показано выше. Разделите различные элементы на карте с количеством символов до следующего элемента. Например, на выходе есть 4 пробела между moo
и i
. Аналогично, во входе между moo
и есть 4 символа i
.
Код, который делает это с наименьшим количеством символов, выигрывает.
code-golf
string
balanced-string
beary605
источник
источник
((1 2))))))))))3
должен быть недействительным, если запрещены отрицательные высоты.Ответы:
J,
87797270675756 символовБерет ввод с клавиатуры. Пример:
Объяснение:
Это объяснение основано на первой версии моей программы:
x=.1!:1[1
взять ввод с клавиатуры и положить его наx
потом(('('&([:+/=)-')'&([:+/=))\,.i.@#)
создает список всех индексов в string (i.@#
) и stitches (,.
) вместе с результатом(('('&([:+/=)-')'&([:+/=))\
глагола.(('('&([:+/=)-')'&([:+/=))\
этот глагол применяется ко всем префиксам строки (так на входеhello
было бы применить кh
,he
,hel
,hell
, иhello
. Он представляет собой вилку , которая подсчитывает количество открытых скобок ,('('&([:+/=)
а затем вычитает число близких скобок')'&([:+/=)
. Это дает мне список of Indends в строку и уровень, на котором должен находиться символ с этим индексом в выходных данных. При простом вводе это дает мне следующее:((' '$~{.@]),[{~{:@])"1
это глагол, который берет список, который я только что сгенерировал, а также вывод('( ) 'charsub x)
(который просто заменяет строку, заменяя все скобки пробелами внутриx
). Он берет хвост каждого элемента списка{:@]
и использует его как индекс в строке, чтобы получить символ[{~{:@]
. Затем к нему добавляется,
число пробелов, указанное в заголовке каждого элемента в списке(' '$~{.@])
. На предыдущем примере это дает мне:Затем я переставляю массив
|:
и обращаюсь к нему,|.
чтобы получить желаемый результат.источник
GolfScript
69Онлайн демо здесь .
Объяснение:
источник
APL (59)
Я предположил, что «база» должна быть пригодной для использования. (т.е.
(a(b))c(d)
действует). Если в этом нет необходимости, можно сохранить два символа.Объяснение:
T←⍞
: сохранить строку ввода в T'()'∘=¨T
: для каждого символа в T посмотрите, является ли это открывающей или закрывающей скобкой. Это дает список списков логических значений.1 ¯1∘ר
: умножить второй элемент в каждом из этих списков на -1 (поэтому открывающая скобка равна 1, закрывающая - -1, а любой другой символ - 0).+/¨
: взять сумму каждого внутреннего списка. Теперь у нас есть значение ∆y для каждого символа.P←
: магазин в П.R←1++\P
: взять промежуточный итог P, давая высоту для каждого символа. Добавьте один к каждому символу, чтобы символы за скобками находились в первой строке.(⍴T)∘⍴¨⍳⌈/R
: для каждого возможного значения y составьте список длиной до T, состоящий только из этого значения. (т.е. 1111 ..., 2222 .... и т. д.)R∘=¨
: для каждого элемента в этом списке посмотрите, равен ли он R. (Для каждого уровня у нас теперь есть список нулей и единиц, соответствующих тому, должен ли символ появляться на этом уровне).⍵×P=0
: для каждого из этих списков установите его на ноль, если P не равен нулю в этом месте. Это избавляет от символов с ненулевым delta-y, так что избавляется от скобок.⊃,/T\¨⍨
: для каждой глубины выберите из T символы, которые должны появиться.⊖↑
: создайте матрицу и поместите ее правой стороной вверх.источник
Tcl, 50
Вид обмана, но хорошо ..
Я использую escape-последовательности ascii, чтобы получить разницу строк,
^[[A
значит переместить курсор на 1 строку вверх,^[[B
переместить курсор на 1 строку вниз.источник
APL, 41 символ / байт *
Проверено на Dyalog, с
⎕IO←1
и⎕ML←3
окружающей средой. Это функция, которая принимает необходимые входные данные и возвращает выходные данные. Учитывая формулировку вопроса, я считаю, что это приемлемо. Если это не так, вот версия, которая читает из stdin и пишет в stdout, еще на 4 символа:Пояснение :
Примеры:
*: APL может быть сохранен во множестве устаревших однобайтовых кодировок, которые отображают символы APL в верхние 128 байтов. Поэтому для целей игры в гольф программа, которая использует только символы ASCII и символы APL, может быть оценена как chars = bytes.
источник
⍨
символ. Это выглядит как сочетание из¨
и~
символов?~
и¨
, хотя это отличается от символов обоих. Это оператор под названием Commute . В своей диадической форме он переворачивается аргументы двоичной функции он применяется к:(5-2)=(2-⍨5)
. Как монадической оператор оказывается двоичная функция в Монадический, дублируя правильный аргумент:(2*2)=(*⍨2)
. Он в основном используется для написания непрерывного потока функций справа налево, без необходимости ставить круглые скобки вокруг больших выражений и прыгать вокруг них. В гольфе это полезно, потому что3*⍨1-2
на один символ меньше чем(1-2)*3
:-)~
в J тогда.J, 56 символов
Другое 56-символьное решение J ... Я считаю глубину путем перевода
(
в ⁻1,)
в 1 и всех другие символы в 0, а затем принимать идущую сумму этого:[: +/\ 1 _1 0 {~ '()'&i.
. Остальное во многом похоже на решение @ Gareth.источник
Питон, 161 символ
источник
Питон, 130
источник
Рубин 1,9 (129)
Читает со стандартного ввода.
источник
//
в''
котором количество символов остается прежним, и избегаю ошибки в маркере.C, 132 символа
В описании не было указано, сколько входных данных должна была принять заявка, чтобы быть принятой, поэтому я остановился на пределах, которые наиболее соответствовали моим потребностям в гольфе (все еще работая с одним приведенным примером ввода). Позвольте мне воспользоваться этой возможностью, чтобы напомнить людям, что часто хорошей идеей является указание минимальных максимумов в описании ваших испытаний.
В коде есть два основных цикла. Первый цикл отправляет все символы, не являющиеся скобками, в соответствующую строку вывода, а второй цикл печатает каждую строку.
источник
С, 149 символов
бегите с цитируемым аргументом, egaout "((1 2) (3 (4 5) moo)) (i (lik (вишня) e (woohoo)))"
источник
Октава, 128
Очень похоже на мой последний ответ ...
Тест
Входные данные:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Выход:
источник
C #, 229 байт
Если нет никаких ограничений на начальное вертикальное пространство, вы можете использовать это (с отступом для ясности). Он инициализирует курсор вниз на одну строку для каждого
(
найденного перед печатью, затем перемещает курсор вверх и вниз, когда считываются скобки.источник
PowerShell ,
120119 байтПопробуйте онлайн!
Побочные эффекты: Символы
&
и'
изменяет высоту , как(
и)
, но дисплеи. Сравните результаты для:Менее гольф:
источник
VB.net (для S & G)
Не самый красивый код.
источник