Ваша задача состоит в том, чтобы расширить некоторые скобки во входных данных программы, как показано ниже:
- Найдите строку s между двумя соответствующими скобками
[
и]
, с одной цифрой n после закрывающей скобки. - Снимите скобки.
- Замените s на себя, повторяя n раз. (Если n равно 0, просто удалите s .)
- Переходите к шагу 1 до тех пор, пока на входе не останется подходящих скобок.
Дополнительные правила и разъяснения:
- Вы примете ввод и дадите вывод любым допустимым способом.
- Конечный перевод строки в выводе разрешен.
- Вам нужно только обрабатывать печатный ASCII на входе.
- Вы можете предположить, что все скобки совпадают, т.е. вы никогда не получите ввод
[]]]]
или[[[[]
. - Вы можете предположить, что после каждой закрывающей скобки
]
есть цифра.
Тестовые случаи:
Input -> Output
[Foo[Bar]3]2 -> FooBarBarBarFooBarBarBar
[one]1[two]2[three]3 -> onetwotwothreethreethree
[three[two[one]1]2]3 -> threetwoonetwoonethreetwoonetwoonethreetwoonetwoone
[!@#[$%^[&*(]2]2]2 -> !@#$%^&*(&*($%^&*(&*(!@#$%^&*(&*($%^&*(&*(
[[foo bar baz]1]1 -> foo bar baz
[only once]12 -> only once2
[only twice]23456789 -> only twiceonly twice3456789
[remove me!]0 ->
before [in ]2after -> before in in after
Поскольку это код-гольф , выигрывает самый короткий ответ на каждом языке. Удачи!
code-golf
string
compression
decode
MD XF
источник
источник
s
никогда не должна содержать других скобок? Например, попытка решить проблему[Foo[Bar]3]2
путем расширения строки вFoo[Bar
3 раза приведет кFoo[BarFoo[BarFoo[Bar]2
[a[b]2c[d]2e]2
? Вы получаетеabbcddeabbcdde
расширениеb
иd
сначала, ноababcdbcdedbabcdbcdede
расширениеa[b
иd]2e
сначала.Ответы:
Гема , 17 знаков
Образец прогона:
источник
Сетчатка ,
242322 байтаПопробуйте онлайн! Это практически встроенная в Retina 1. Редактирование: 1 байт сохранен благодаря @Kobi.
4745 байт в сетчатке 0.8.2:Попробуйте онлайн!
источник
Haskell ,
10196 байтПопробуйте онлайн! Вместо использования регулярного выражения, как большинство других ответов, здесь реализован рекурсивный синтаксический анализатор.
-5 байт благодаря BMO !
источник
(%)
вас спасает 1 байт и['1'..d]
еще 4, смотрите это .Perl 5 ,
343329 + 1 (-p
) = 30 байтПопробуйте онлайн!
Сократите это с помощью @Shaggy и @TonHospel.
источник
]
.perl -pe 's/.([^[]*?)](.)/$1x$2/e&&redo'
иperl -pe 's/.([^][]*)](.)/$1x$2/e&&redo'
Japt v2 ,
212019 байтСохранено 2 байта благодаря @Shaggy
Проверьте это онлайн!
e
является рекурсивной заменой, которая делает одну замену за раз, пока больше не будет совпадений. В этом случае совпадения регулярного выражения/\[([^[]*?)](\d)/g
заменяются на <внутренний текст>, повторяемый <цифра> раз, пока совпадений больше нет.В соответствии с тем, что я планировал ( здесь ), это регулярное выражение должно в конечном итоге быть как минимум на
32 байта короче:источник
]
есть цифра », вы можете заменить(\d
на(.
.\[
на.
JavaScript,
716766 байтУ меня было 54-байтовое решение, но оно было испорчено вторым тестовым примером! :(
Тестовые случаи
источник
Python 3 ,
110,93,92 байтаПопробуйте онлайн!
-17 байт благодаря pizzapants184 -1 байт благодаря Кевину Круйссену
источник
in
.(\d)
на(.)
, потому что мы знаем, что за квадратной скобкой]
всегда следует цифра.Scala , 173 байта
Попробуйте онлайн!
Expanded:
Старое решение
Scala ,
219215213212199байтовПопробуйте онлайн!
Expanded:
Где l - это список строк, которые мы будем обрабатывать.
Спасибо Кевину Круйссену за -1 байт
Пошел с 212 по 199, убрав неиспользуемый параметр, не обратил внимания.
источник
(\d)
на(.)
, потому что мы знаем, что за квадратной скобкой]
всегда следует цифра.Сложено ,
3938 байтСэкономили 1 байт благодаря Shaggy, отыграли регулярное выражение!
Попробуйте онлайн!
Просто рекурсивно заменяет регулярное выражение
'\[([^[\]]+)](.)'
на правило повторения.источник
]
.Питон 3,
15514810197 байтПопробуйте онлайн
Спасибо HyperNeutrino и Mego за -47 байтов и user202729 за -4 байта.
источник
def f(x):a=x.rfind('[');b=x.find(']',a);return f(x[:a]+x[a+1:b]*int(x[b+1])+x[b+2:])if~a else x
JavaScript -
777572 байтаИзменить: обновленное регулярное выражение с рекомендацией Shaggy
Отрывок:
Показать фрагмент кода
источник
f=
!QuadR с
≡
аргументом,3028 байтПопробуйте онлайн!
\[[^[]+?].
заменить "[
не[
вещи"]
символ» с¯2↓⍵M
уронить последние два символа M ATCH ( «]
цифра„)1↓
упадет первый символ (“[
»)⊂
Вложите следует рассматривать как единое целое(
...)⍴
г eshape длину:⌽⍵M
обратный M ATCH⊃
выбрать первую (цифру)⍎
оценки∊
е NLIST ( Свести)≡
повторять до тех пор, пока больше не произойдет никаких измененийЭквивалентная функция Dyalog APL составляет 47 байт:
Попробуйте онлайн!
источник
Java 8,
250249241239 байт-2 байта благодаря @JonathanFrech ( код содержит два непечатаемых символа ASCII, что можно увидеть в TIO-ссылке ниже).
Вздох ... Java с регулярным выражением настолько чертовски ограничена .. Я просто процитирую себя из другого ответа здесь:
Объяснение:
Попробуйте онлайн.
источник
Wolfram Language (Mathematica) , 86 байт
Попробуйте онлайн!
источник
С,
407368 байтСпасибо Джонатану Фреху за сохранение байтов.
игра в гольф (файл скобка.c):
разучился с программой:
Скомпилировано с gcc 5.4.1,
gcc bracket.c
источник
malloc
иrealloc
, в том числеstdlib.h
, самостоятельно.Красный , 147 байт
Ungolfed:
Я начал изучать диалект Parse Red только вчера, поэтому я уверен, что мой код можно улучшить и дальше. Parse несравненно более многословен, чем regex, но он очень понятный, гибкий и читаемый и может свободно смешиваться с остальным языком Red.
Попробуйте онлайн!
источник
Желе , 30 байт
Попробуйте онлайн!
Объяснение.
источник
C, 381 байт
Компактная версия:
Полная версия:
источник
Python, 80 байт
Попробуйте онлайн!
s("[Foo[Bar]3]2")
Обращенные[Foo[Bar]3]2
к''+('Foo'+('Bar')*3+'')*2+''
и оценивается.Сбой при вводе с кавычками в скобках (например
[']3
)источник