Codegolf — Развлечение С Подходящими Брекетами

  • Автор темы Grossboss
  • Обновлено
  • 22, Oct 2024
  • #1
На этот вопрос уже есть ответы здесь:

Кронштейны полностью совпадают? " ' // [

(43 ответа)

Закрыт 6 лет назад.

  • Конкурс заключается в создании программы или функции, принимающей произвольную строку. ( "\"" ("')") ("')"')
  • напоминающий исходный код, и проверяет, соответствуют ли «фигурные скобки» основным правилам "
  • соответствие брекетов. То есть количество левых и правых скобок должно совпадать, и вы ' or // не может быть правой скобки без соответствующей предшествующей левой скобки.
  • Вы можете использовать любую «скобу» среди
  • Ваша программа должна выводить/возвращать значение true-y или «Y», если ввод является допустимым, и значение false-y или «N», если ввод недопустим. /* */ and <(>) Подсчет очков < is not a valid "program" but { Ваш результат — это количество байтов в исходном коде за вычетом бонусов. [ is an illegal program if you go for this bonus.

Бонусы ( and < -20 за каждый дополнительный тип распорки, обработанный среди { comments and quotes, you get:

327 - 20 * 1 - 0 - 50 - 0 - 50 = 207 -30, если вы обрабатываете несколько типов фигурных скобок и не допускаете несовпадающих фигурных скобок, например

-50 баллов, если справишься комментарии (так же, как это делают C или Java) [ and ( -20 баллов, если вы обрабатываете оба типа комментариев.
-50, если игнорировать фигурные скобки внутри кавычки. Чтобы получить очки, вам также необходимо проверить соответствие котировок. Например:
является. Вам не нужно беспокоиться об экранированных символах. Итак, если ваша программа имеет длину 327 символов ASCII, дескрипторы

, не проверяет несоответствие и обрабатывает
очки
РЕДАКТИРОВАТЬ:

Добавлены бонусы за игнорирование скобок внутри
кавычки
РЕДАКТИРОВАТЬ 2:

Возвращаемые значения не могут быть любой строкой. Должно быть правдой/ложью 1/0 «Да»/«Нет» и т. д.

РЕДАКТИРОВАТЬ 3:

Grossboss


Рег
26 Nov, 2019

Тем
71

Постов
186

Баллов
561
  • 26, Oct 2024
  • #2

PHP, -4 (156 - 20*3 - 30 - 50 - 20)

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 {}[] 
  1. Он удаляет комментарии
  2. Он отфильтровывает все символы, отличные от (, ), [, ], {, }, <, >
  3. Он заменяет все пары (), [], {}, <> до тех пор, пока совпадений не останется.
  4. Печатает 1, если строка пуста, в противном случае — 0.

(Изменить: изменил регулярное выражение; исходный код теперь 156 вместо 175)

 

Delfin_serg


Рег
15 May, 2011

Тем
67

Постов
174

Баллов
539
  • 26, Oct 2024
  • #3

GolfScript, 38 символов – 3 × 20 – 30 = –52 балла

{

Принты [ if all the braces in the input are correctly balanced, >> eval('([{"("}])') >> eval('([{(}])') ^ SyntaxError: invalid syntax в противном случае.

Бонусные баллы за:

  • работа со всеми четырьмя типами брекетов: 3 × 20 баллов
  • не допускать несовпадающих скобок: 30 баллов

Это решение использует внутренний стек GolfScript для отслеживания того, какие фигурные скобки были замечены на данный момент. Когда встречается открывающая скобка, она помещается в стек; когда встречается закрывающая скобка, код проверяет, есть ли в стеке соответствующая открывающая скобка. Если есть, то он выскакивает; в противном случае контрольное значение (0), не соответствующее никаким скобкам, помещается в стек, гарантируя, что его невозможно будет извлечь.

Одно из таких контрольных значений помещается в стек в начале, чтобы предотвратить опустошение стека, если имеется слишком много закрывающих скобок. В конце программа просто проверяет, пуст ли стек, за исключением начального значения дозорного.

 

Sergeika


Рег
07 Jun, 2005

Тем
68

Постов
171

Баллов
521
  • 26, Oct 2024
  • #4

Perl, (136 130 129 символов - (20*3) - 30 - 50 - 20 - 50) == -81

<3 рекурсивных RE.

( ||answer||

Луа - 51

[

Что делает эта программа, так это оборачивает входную строку в { , then it matches it against a шаблон (не регулярное выражение). Шаблон соответствует началу строки, за которой следует строка, содержащая сбалансированные круглые скобки, а затем конец строки.
В случае успешного совпадения возвращается вся строка, которая преобразуется в i by eval(i) . Если матч не удался, min(Ans) is returned, which turns info or из-за } .

 

Abuzerkadayif


Рег
26 May, 2015

Тем
84

Постов
201

Баллов
661
  • 26, Oct 2024
  • #5

С, 70 62 61

{

В качестве альтернативы поддерживаются все типы кронштейнов: 147 – (3*20) = 87.

{0,1,-1}

Программа читает по одному символу за раз. Каждый раз, когда {0,1,2} is found a counter is incremented. Similarly, every time a ')' is found a counter is decremented. If the counter ever drops below iPart(2sin(2* , мы знаем cumSum( was found without a prior cumSum(iPart(2sin(2seq(inString("()",sub(Ans,X,1)),X,1,length(Ans not(min(Ans or Ans(dim(Ans . Когда мы достигнем EOF, если счетчик равен !(_=x[z='replace'](/("|').*?\1|\/\*.*?\*\/|[^({<[\]>})]/g,''),_.length-_[z](/[^({<[]/g,'').length) , we have success!

РЕДАКТИРОВАТЬ: Большое спасибо @ugoren!

 

Mehdi_mj


Рег
10 Jan, 2009

Тем
77

Постов
200

Баллов
605
  • 26, Oct 2024
  • #6

Общий Лисп (???)

Идея заключалась в том, чтобы подчеркнуть гибкость программы чтения Lisp и фактически разрешить использование других символов в качестве разделителей списка. К сожалению, кажется, что слишком много других частей синтаксиса языка (например, использование bool F(string x){int l=0,r=0;foreach(var c in x){if(c=='[')l++;if(c==']'){r++;if(r>l)return false;}return l==r;} as an abbreviation for using C = System.Console; namespace P{class P{static void Main(string[] a){while(true)C.WriteLine(F(C.ReadLine()));}static bool F(string x){int l=0,r=0;foreach(var c in x){if(c=='[')l++;if(c==']'){r++;if(r>l)return false;}}return l==r;}}} и различные синтаксисы комментариев ( using C = System.Console; namespace P { class P { static void Main(string[] a) { while(true) C.WriteLine(F(C.ReadLine())); } static bool F(string x) { int l = 0, r = 0; foreach (var c in x) { if (c == '[') l++; if (c == ']') { r++; if ( r > l ) return false; } return l == r; } } } rather than exit!/[()<>{}[\]]/ для комментариев в конце строки и while(s|//.*||+s/\($a\)//+s/\[$a]//+s/{$a}//+s/<$a>//){} instead of $a='[^()<>{}[\]]*'; )) вероятно, дисквалифицирует эту запись как "рабочую".

$a $_join'',<>;

При этом используется стандартная программа чтения Lisp (которая уже обрабатывает $_ и // , конечно) и определяет каждый новый набор разделителей как другой синтаксис построения списка. Они автоматически сопоставляются (т. е. несовпадения приводят к ошибке). Это не справляется ] к [ комментарии, но он обрабатывает } and { комментарии. Обрабатываются строки в двойных кавычках, включая escape-символы.

 

123777


Рег
19 Sep, 2006

Тем
73

Постов
194

Баллов
579
  • 26, Oct 2024
  • #7

Гольфскрипт 37

>

Предположим, что входные данные программы < . First, filter out all characters that are not ) (ASCII 40) или ( (ASCII 41):

perl bracevalidator.pl<inputfile;echo $?

Далее сгенерируйте массив из $_=join"",<>;$a='[^()<>{}[\]]*';while(s|//.*||+s/\($a\)//+s/\[$a]//+s/{$a}//+s/<$a>//){}exit!/[()<>{}[\]]/ to the length of the array:

Function(c$)c.Aggregate(Of Int32)(0,Function(s,i)If(s<0,s,If(i="["c,s+1,If(i="]"c,s-1,s))))=0

Теперь сгенерируйте все суффиксы отфильтрованной строки.

import sys b=[] for c in sys.stdin.read(): if c in '([{<':b+=[c] if c in ')]}>': if b[-1]!='([{<'[list(')]}>').index(c)]:print 0==1;break b.pop() else:print len(b)==0

Напомним, что в GolfScript cc f;if $?=0;then echo yes;else echo no;fi decrements integers and f увеличивает их.

Таким образом, проверка правильности круглых скобок эквивалентна проверке того, что суффикс, рассматриваемый как кодовый блок и примененный к 0, не опускается ниже 0 (так что закрывающих скобок больше, чем открытых) и что вся строка, когда рассматривается как блок кода и применяется к 0, возвращает 0 (чтобы было одинаковое количество открывающих и закрывающих круглых скобок).

Итак, примените каждый суффикс к cc f :

function check(str){ depth = 0; str = str.split(""); for(var z=0;z<str.length;z++){ if(str[z]=="{") str[z]+=depth++; if(str[z]=="}") str[z]+=--depth; if(depth<0) return "unmatched"; } return depth; }

А затем проверьте, что первый элемент (где вся строка рассматривается как функция) возвращает 0 и что ни один элемент не имеет значения ниже 0 (напомним, что пустой массив c=s=>{d=0;s=s.split("");for(z=0;z<s.length;z++){if(s[z]=="{")d++;if(s[z]=="}")--d;if(d<0)a="N"}return a||d?"N":"Y"} is falsey in GolfScript):

" ||answer||

гибкий, (70+4)-50=24

'

Чтобы компиляция прошла успешно, вам нужно использовать флаг z so I added 4 to my character count.

z

Код считывает символ за символом, увеличивая счетчик, если > is detected and decrementing a counter if a } обнаружен. Если счетчик равен нулю, когда ] is detected, then we know we don't have a matching ) и можно выйти. Простой k comments are matched (and ignored) via a regular expression for the minus fifty bonus.

 

Марина81


Рег
13 Oct, 2010

Тем
71

Постов
180

Баллов
575
  • 26, Oct 2024
  • #8

Bash: 369 байт — 110 бонус = 259

<

Оценка:

  • Работает со всеми четырьмя типами брекетов. 4x -20 = -80
  • обрабатывает несовпадающие скобки, -30

Вероятно, есть место для дальнейшего объединения цепочки элифов в && и ||, но когда я попробовал, начало проявляться какое-то странное поведение, поэтому я сдался :)

 

WerDY


Рег
22 Jun, 2006

Тем
60

Постов
187

Баллов
507
  • 26, Oct 2024
  • #9

Javascript: 392 383 387 345 символов - 210 бонусов = 135 баллов

{

Это функция, которая возвращает 0, если ввод недействителен, и 1, если он верен.

Во-первых, он использует регулярные выражения для удаления [ , ( , " ... " and ' ... ' последовательности.

Во-вторых, он распаковывает и запускает код, который посимвольно перебирает входную строку в поисках // ... \n , /* ... */ , function x(a){z=1;k="",a=a.replace(/\/\*.*?\*\/|\/\/.*?\n|".*?"|'.*?'/mg,"").split('');try{for(d in a){eval("c=a[d]//%(')k='(%[')k='[%{')k='{%<')k='<%)_(#%]_[#%}_{#%>_<#".replace(/#/g,"')k=k.substr(1);else z=0//").replace(/%/g,"'+k\nif(c=='").replace(/_/g,"')if(k.charAt(0)=='"))}}catch(e){z=0}return''==k&z==1&a.indexOf("'")<0&a.indexOf('"')<0} and e=exit;function f(){ s=$1;a=X;until [ "$a" = "" ];do a=${s::1};s=${s:1} if [ "$a" = \( ];then f "$s" \)||$e 1 elif [ "$a" = [ ];then f "$s" ]||$e 1 elif [ "$a" = \< ];then f "$s" \>||$e 1 elif [ "$a" = { ];then f "$s" }||$e 1 elif [ "$a" = \) ]||[ "$a" = ] ]||[ "$a" = \> ]||[ "$a" = } ] then [ $a = "$2" ]&&return||$e 1;fi;done;[ "$2" = "" ]||$e 1;};f "$1"&&$e 0||$e 1 , складывая их в строку // . When he founds ( , ) , ) and ( , it looks the top of the stack and if they match, he pops the stack, otherwise he sets a variable flex flex.l gcc lex.yy.c -lfl до нуля. Если произойдет какое-либо исключение, -lfl is set to zero.

В конце он проверяет, пуст ли стек и нет ли %{ a; %} %% "(" a++; ")" a?a--:exit(0); "//".* . <<EOF>> exit(!a); %% or (!\{0<},!& остаются, возвращая 1, если это так, и 0 в противном случае.

Спасибо @Charles за указание на ошибки в более ранних версиях.

 

Sgps


Рег
23 Apr, 2020

Тем
84

Постов
180

Баллов
620
  • 26, Oct 2024
  • #10

JavaScript (ES6), 92 115 байт

Ой, смотрите, я победил другой ответ на JavaScript без каких-либо бонусов.

[]

Версия без гольфа, удобная для разработчиков и ES5-(дружественная) версия:

{0\~}% #Stack is now [0, 1, 2, 1, 2, 1]

Возвращает версию строки с глубиной послесловия в скобках. Я использую эту функцию для целей оценки. Возможно, позже попробую получить бонусы.

 

Kaemve1996


Рег
27 Oct, 2019

Тем
81

Постов
215

Баллов
670
  • 26, Oct 2024
  • #11

Баш — 4 символа

0

Предполагая ) is your c source code file

Если вы хотите, чтобы он напечатал «да» или «нет», 43 символа:

( ||answer||

Python 2.7: 171 байт — 60 — 30 = 81 балл

\`{\>}+% #Stack is now ['(()())', '()())', ')())', '())', '))', ')' ]

Обрабатывает все типы скобок и не допускает несовпадающих скобок.

 

MoogSL


Рег
18 Dec, 2006

Тем
73

Постов
185

Баллов
600
  • 26, Oct 2024
  • #12

ВБ.нет 93c

Эта проверка проверяет, содержит ли код BrainF*ck сбалансированные квадратные скобки.

.,, #Stack is now '(()())' [0, 1, 2, 3, 4, 5] ||answer||

Perl, 106 байт — (3*20 + 30 + 50 + 0 + 0) бонус = −34 балла

0

Ожидается ввод из STDIN (несколько строк), а возврат задается в виде кода выхода: 1 для успешной проверки и 0 для несовпадающих фигурных скобок.

{[40.)]&}, #Stack is now '(()())'

Пример вызова:

  • Поддерживается/проверяется следующее: ) .. ( , '(123(abc)(hello))' .. {[40.)]&},.,,\`{\>}+%{0\~}%(!\{0<},!& , // .. #| ... |# , // .. /* ... */ .
  • Сбалансированные брекеты:
  • Никаких несоответствий для разных типов брекетов. ) .

Комментарии в стиле C++

Идея состоит в том, чтобы сначала сопоставить самые внутренние сбалансированные скобки и удалить их из строки до тех пор, пока все пары скобок не исчезнут. Если фигурная скобка оставлена, то возвращаемое значение равно 0, в противном случае все фигурные скобки правильно вложены и возвращается 1. ( :

(defun check-source(x)(labels((s(x y)(set-macro-character x y))(r(e)(s e(get-macro-character #)()))(lambda(s c)(read-delimited-list e s t)))(p(b e)(s b(r e))))(map'nil #'p"[{<""]}>")(listp(read-from-string(concatenate'string"("x")")))))

Сначала весь файл читается в переменной (defun check-source (x) (labels ((s (x y) (set-macro-character x y)) (r (e) (s e (get-macro-character #\) nil)) (lambda (s c) (read-delimited-list e s t))) (p (b e) (s b (r e)))) (map 'nil #'p "[{<" "]}>") (listp (read-from-string (concatenate 'string "(" x ")"))))) serves as abbreviation for the brace free stuff between an innermost brace pair:

/* … */

Переменная

#| … |#

Основной цикл удаляет комментарии C++ и пары фигурных скобок снизу вверх:

// ||answer||

Затем оставшаяся строка проверяется на наличие оставшихся скобок:

С# – 380 символов.

;

Непрерывно считывает введенные пользователем данные до тех пор, пока они не завершат работу, каждый раз возвращая значение «истина» или «ложь» относительно того, действительны ли введенные данные.

(quote foo)

Сокращенная форма – 239 символов.
И наконец

'foo ||answer||

сама функция — 112 символов (в сокращенном виде)

0 ||answer||

ЭкмаСкрипт 6:

(

) keeps a running total of the number of braces, then the second line checks if both the minimum and the last element are zero.

ТИ-БЕЙСИК, 39 байт

  • 0 maps ( Использованы два трюка: A,B,C,D;main(c){for(;~(c=getchar())&~A&~B&~C&~D;)c-40?c-41?c-91?c-93?c-'{'?c-'}'?c-60?c-62||D--:D++:C--:C++:B--:B++:A--:A++;puts(A|B|C|D?"N":"Y");} so I don't need to match A;main(c){for(;~c&~A;c=getchar())A-=c==41,A+=c==40;exit(!A);} and not not separately.
  • и false the last element with the whole list, rather than nil я
, чтобы сохранить закрывающую скобку.

 

SashaRub


Рег
01 Mar, 2006

Тем
73

Постов
185

Баллов
560
  • 26, Oct 2024
  • #13
not not

Питон, 7 байт true is the input. It handles () , print(not not("("..io.read"*a"..")"):match"^%b()$") and $/=$_;print!(<>!~m#^(([^][<{('"/)}>]|'[^']*'|"[^"]*"|/((?![*/])|\*((?!\*/).)*\*/|/[^\n]*+)|<(?1)>|\((?1)\)|\[(?1)]|{(?1)})*)$#s) Где

, игнорирует фигурные скобки в кавычках и разрешает несовпадающие фигурные скобки.

При ошибке генерируется синтаксическая ошибка!

0

Пример: 1 inside 0\{")]>}([<{"?.4/"4^^{0}* ;"n/=~}/;]! Изменить: это просто забавное частичное решение. Он не обрабатывает такие случаи, как <?php $x=preg_replace("!(//.*|/\*.*\*/|[^()[\]{}<>])!sm",'',$argv[1]);while(strlen($x)!=strlen($x=str_replace(str_split('()[]{}<>',2),'',$x)));print $x?0:1; etc.

 

Kinolog


Рег
06 Dec, 2005

Тем
85

Постов
211

Баллов
646