Prelude - это эзотерический язык программирования, который имеет очень мало, но необычных ограничений на то, что составляет действительную программу. Любой блок печатного текста ASCII («блок» означает, что строки печатного ASCII разделены символами новой строки - 0x0A) действительны при условии, что:
- Каждый (вертикальный) столбец текста содержит не более одного
(
и)
. - Не обращая внимания на их вертикальное положение,
(
и)
сбалансированы, то есть каждый(
в паре с ровно одним)
справа от него, и наоборот.
Напишите программу или функцию, которая, учитывая строку, содержащую печатный ASCII и символы новой строки, определяет, является ли она допустимой программой Prelude. Вы можете получить ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции. Результат может быть возвращен или распечатан в STDOUT, используя любые два фиксированных значения истинности / ложности по вашему выбору.
Вы не должны предполагать, что вход является прямоугольным.
Это код гольф, поэтому выигрывает самое короткое представление (в байтах).
Примеры
Ниже приведены действительные программы Prelude (фактически они даже являются настоящими программами Prelude):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
И вот несколько входов, все из которых являются недействительными :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
источник
)
и 2(
. Разве это не должно быть только 1 на строку?Ответы:
CJam,
5756 байтСлишком долго, можно много играть в гольф. Объяснение будет добавлено, как только я пойду в гольф.
Краткое объяснение
В коде есть две проверки:
Number of "(" - Number of ")"
) должны дополнять друг друга. Поэтому, когда вы добавляете их, это должно привести к 0. Любая часть, которая не имеет этого свойства, заставляет весь ввод иметь несоответствующие скобки.Number of "(" - Number of ")"
не может быть отрицательным для правостороннего блока.Попробуйте онлайн здесь
источник
Python 2,
128119105 байтЗнаете ли вы, что вы можете сопоставить None в Python 2?
объяснение
Мы хотим начать с транспонирования Prelude, чтобы столбцы стали строками. Обычно мы делаем это с помощью
zip
, но, посколькуzip
усекается до самой короткой длины строки иitertools.zip_longest
слишком длинны для код-гольфа, кажется, что нет короткого способа сделать то, что мы хотим ...За исключением картирования
None
:К сожалению (или, скорее, к счастью для всех целей, не связанных с гольфом), это работает только в Python 2.
Что касается
n
иv
:n
действует как стек, считая1 - <number of unmatched '(' remaining>
. Для каждого, что(
мы видим, мы вычитаем 1, и для каждого, что)
мы видим, мы добавляем 1. Следовательно, еслиn >= 2
в какой-то момент мы увидели слишком много)
s и программа недействительна. Еслиn
не заканчивается на 1, то у нас есть хотя бы один непревзойденный(
остаток.v
проверяет правильность и начинается с 1. Если программа когда-либо является недействительной (n >= 2
илиA+B >= 2
), тоv
становится 0, чтобы отметить недействительность.Следовательно, если программа действительна, то к концу мы должны иметь
n = 1, v = 1
. Если программа недействительна, то к концу мы должны либо иметьv = 0
, либоv = 1, n <= 0
. Поэтому действительность может быть кратко выражена какn*v>0
.(Спасибо @feersum за множество хороших предложений, которые заняли 14 байтов!)
Предыдущее, более читаемое представление:
источник
map
...def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
or
в цепочку сравнения, но я не думал о том, чтобы перейти|=
в*=
. Тем не менее, снял еще один байт, сделав вещи еще более задом наперед :)J, 64 байта
Ввод - это строка с завершающим переводом строки. Выход 0 или 1.
Пример использования
Метод заключается в следующем
];.2
(
/)
/anything else
в1
/-1
/0
1 _1 0{~[:'()'&i.]
s=.+/@:
наречие, которое добавляется к глаголу суммы выходных данных массива глаголовдобавить значения в столбцах
]s
()
баланс в каждом префиксе[:(0>])s)[:+/\]
()
баланс во всем списке (т.е. в последнем префиксе)|@{:@]
добавьте abs (значения) в столбцы и проверьте для каждого элемента максимальное значение 1
(1<|s)s
так как все предыдущие проверки дали положительный результат при неудаче, мы складываем их и сравниваем с 0, чтобы получить достоверность ввода
0=]
источник
J, 56 байт
Это анонимная функция, принимающая строку с завершающим переводом строки и возвращающая 0 или 1. Чтение справа налево:
];.2 y
Как и в другом представлении J, вырезает строкуy
во всех вхождениях своего последнего символа (именно поэтому для ввода требуется завершающий символ новой строки) и создает прямоугольную матрицу, строки которой представляют собой фрагменты, дополненные пробелами при необходимости.'()'=/
сначала сравнивает каждый символ в этой матрице,(
а затем)
возвращает список из двух матриц 0-1.+.^:_1]0|:
превращает этот список из двух матриц в одну матрицу комплексных чисел. До сих пор программа превращает каждый(
входной элемент в 1, каждый)
в i, а каждый другой символ в 0.b=.+/
присваивает сумму строк этой сложной матрицыb
.-.|b
составляет список 1- | z | для каждого z вb
. Условие, что каждый столбец содержит не более одной круглой скобки, переводится на все эти числа 1- | z | быть неотрицательным.+/\*:b
вектор бегущих сумм квадратов чисел вb
. Если каждый столбец содержит не более одной круглой скобки, все квадраты чисел вb
0, 1 или -1. В,
сцепляет этот вектор с вектором 1- | г | 'с.теперь все, что нам нужно сделать, это проверить, что записи нашего связанного вектора
v
являются неотрицательными числами вещественных чисел, это почти так*/0<:v
, за исключением того, что это вызывает ошибку, если некоторые записиv
не являются действительными, поэтому мы заменяем<:
на то,<: ::0:
что просто возвращает 0 в случае ошибки ,источник
0={:+/\*:b
например(
, не действует.0=(-|)v
на 2 байта короче для проверки неотрицательных реалов. (Давайте победим CJam!: P)inv
вместо того, чтобы^:_1
сохранить еще один байт.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
.