Напишите программу, которая принимает строку из четырех символов, ()[]
которая удовлетворяет этим требованиям:
- Каждая левая скобка
(
имеет соответствующую правую скобку)
. - Каждая левая скобка
[
имеет соответствующую правую скобку]
. - Соответствующие пары скобок и скобок не будут перекрываться. Например
[(])
, недопустимо, потому что соответствующие скобки не полностью содержатся в соответствующих скобках, и наоборот. - Первый и последний символы - это совпадающая пара скобок или скобок. Так
([]([]))
и[[]([])]
есть, но[]([])
это не так.
( Грамматика для формата ввода есть <input> ::= [<input>*] | (<input>*)
.)
Каждая пара соответствующих скобок и скобок оценивается как неотрицательное целое число:
- Значения пар внутри соответствующих скобок суммируются . Пустое совпадение
()
имеет значение0
. - Значения пар внутри соответствующих скобок умножаются . Пустое совпадение
[]
имеет значение1
.
( Сумма или произведение одного числа является тем же самым числом.)
Например, ([](())([][])[()][([[][]][][])([][])])
может быть разбит и оценен как 9
:
([](())([][])[()][([[][]][][])([][])]) <input>
(1 (0 )(1 1 )[0 ][([1 1 ]1 1 )(1 1 )]) <handle empty matches>
(1 0 2 0 [(1 1 1 )2 ]) <next level of matches>
(1 0 2 0 [3 2 ]) <and the next>
(1 0 2 0 6 ) <and the next>
9 <final value to output>
Другой пример:
[([][][][][])([][][])([][][])(((((([][]))))))] <input>
[(1 1 1 1 1 )(1 1 1 )(1 1 1 )((((((1 1 ))))))]
[5 3 3 (((((2 )))))]
[5 3 3 ((((2 ))))]
[5 3 3 (((2 )))]
[5 3 3 ((2 ))]
[5 3 3 (2 )]
[5 3 3 2 ]
90 <output>
Ваша программа должна оценить и напечатать целое число, представленное всей входной строкой. Вы можете предположить, что ввод действителен. Самый короткий код в байтах побеждает.
Вместо программы вы можете написать функцию, которая принимает строку и печатает или возвращает целое число.
code-golf
arithmetic
balanced-string
recursion
Кальвин Хобби
источник
источник
Ответы:
CJam, 23
С БОЛЬШИМИ кредитами Денису! Попробуйте онлайн
Объяснение:
Программа преобразует входные данные в выражение CJam, а затем оценивает его.
[…]
становится[…1]:*
(добавить 1 и умножить)(…)
становится[…0]:+
(добавить 0 и добавить)источник
q"])(""1]:*0]:+["4/ers~
Common Lisp - 98
(
на(+
[
на(*
]
на)
Это требует
cl-ppcre
загрузки библиотеки в текущее изображение lisp.объяснение
Функции
*
и+
являются переменными и возвращают свое нейтральное значение, когда не приводятся аргументы. Для ваших примеров, оцененная форма lisp:и
Без регулярных выражений - 183 байта
Да ладно, Лисп - 16 байт (экспериментальный)
Другие языки настолько лаконичны, что я испытываю желание создать свой собственный язык для игры в гольф на основе Common Lisp для более коротких манипуляций со струнами. В настоящее время нет спецификаций, и функция eval является следующей:
тесты:
s
и два стека,p
иq
.p
.<
: выскакиваетp
и толкает кq
.r
: заменяет вs
(должно быть строкой) символы вq
символы вp
; результат сохраняется вs
;p
иq
опустошены.R
: чтение из строкиs
, сохранение результата в переменнойs
.E
: eval forms
, сохранить результат вs
.источник
Pyth,
353433 байтаДемонстрация.
1 байт благодаря @Jakube.
Начнем с разбора ввода. Формат ввода близок к Python, но не совсем. Нам нужны запятые после каждой группы в скобках или в скобках. Запятая в конце группы в скобках не нужна, но безвредна. Для этого мы используем этот код:
Это оставит лишние
,
в конце строки, что обернет весь объект в кортеж, но это безвредно, потому что кортеж будет суммироваться, и поэтому будет иметь значение, равное его элементу.Теперь, когда строка проанализирована, мы должны найти ее значение. Это делается с помощью пользовательской функции
y
, которая вызывается для анализируемого объекта. функция определяется следующим образом:источник
Emacs lisp, 94
Формат выглядит очень странным, поэтому я подумал, что может сработать простое преобразование:
Промежуточный формат выглядит примерно так (для примера в вопросе):
Нам помогает тот факт, что сложение и умножение уже делают то, что мы хотим, с пустым списком аргументов.
Дегольфед, и интерактив, для вас удовольствие от игры:
источник
interactive
(вместо строки буфера используйте read-from-string).Сетчатка , 111 байт
Дает вывод в одинарный.
Каждая строка должна идти в свой собственный файл, но вы можете запустить код как один файл с
-s
флагом. Например:Объяснение приходит позже.
источник
Ява, 349 символов
Простой рекурсивный подход. Ожидается, что строка будет первым аргументом, используемым для вызова программы.
Expanded:
источник
Perl 5, 108
Сделано в качестве переводчика, а не переписывать и оценивать. Не очень хороший показ, но в любом случае интересно писать.
Un-golfed:
источник
Питон, 99
Я пробовал различные методы, но самый короткий, который я мог получить, был просто заменой и оценкой. Я был приятно удивлен, обнаружив, что могу оставить все завершающие
,
элементы, так как Python может анализировать,[1,2,]
а конечная запятая просто помещает все в кортеж. Только другие не просто часть будет вполнеord(c)%31%7
отделить из различных символов (это имеет значение2
,3
,1
,0
для(
,)
,[
,]
соответственно)источник
Ява, 301
немного другой подход, чем ответ TheNumberOne, хотя мой тоже рекурсивный по своей природе. Ввод берется из командной строки. Метод void сохраняет несколько байтов при удалении ненужных символов.
расширен:
источник
Python,
117110109 байтОдин аспект, с которым я боролся, заключается в том, что функция в основном имеет два возвращаемых значения: произведение / сумма и новую позицию в строке. Но мне нужна функция, которая возвращает только результат, поэтому возврат кортежа не работает. Эта версия использует «ссылочный» аргумент (список с одним элементом), чтобы передать позицию обратно из функции.
У меня есть более короткая версия (103 байта), которая использует глобальную переменную для позиции. Но это будет работать только при первом звонке. И функция, которая работает только один раз, кажется немного подозрительной. Не уверен, что это будет приемлемо для кода гольф.
Алгоритм простой рекурсии. Я попробовал несколько вариантов выражения, которое обновляет продукт / сумму. Я придумал несколько версий одинаковой длины, но ни одна из них не стала короче.
Я вроде ожидал, что подход, который превращает это в выражение, которое оценивается, вероятно, победит. Но, как говорится: «Повторять - это человеческое, повторять божественное».
источник
Clojure - 66 байт
Обратите внимание, что
([] (()) ([] []) [()] [([[] []] [] []) ([] [])])
это действительная форма Clojure. Так:g
.g
функция применяется+
или*
к результату вызоваg
подэлементов своих аргументов.x
в пустой последовательности;(map g x)
возвращаетnil
иapply
возвращает нейтральное значение для операции.источник
JavaScript (ES6), 116 байт
источник