길이 n의 모든 가새 문자열 생성


16

중괄호 문자열은 *()[]중괄호가 올바르게 일치 하는 문자로 구성된 문자열로 정의 됩니다.

[brace-string] ::= [unit] || [unit] [brace-string]
[unit]         ::= "" || "*" || "(" [brace-string] ")" || "[" [brace-string] "]"

유효한 괄호 문자열입니다.

((())***[]**)****[(())*]*

그러나 이것들은 아닙니다 :

)(
**(**[*](**)
**([*)]**

당신의 임무는 양의 정수가 주어지면 n숫자를 입력으로 사용하고 length의 유효한 모든 중괄호 문자열을 출력 (또는 반환) 하는 프로그램 (또는 함수)을 작성하는 것 n입니다.

명세서

  • 문자열을 임의의 순서로 출력 할 수 있습니다.
  • 다른 문자로 구분 된 목록 또는 문자열로 출력 할 수 있습니다.
  • 프로그램은 0을 올바르게 처리해야합니다. 길이가 0 인 1 개의 가능한 brace-string이 있으며 이는 빈 문자열 ""입니다.
  • 이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

테스트 사례

0. 
1. *
2. ** () []
3. *** ()* []* (*) [*] *() *[]
4. **** ()** []** (*)* [*]* (**) **() **[] *(*) *[*] (()) ()() ()[] ([]) [**] [()] [[]] []() [][] *()* *[]*

3
출력의 항목 수는 A025235입니다.
Gabriel Benamy

트윗 담아 가기 나는 그것이 전에 본 적이 있는지 궁금했습니다. 흥미 롭군
Esolanging 과일

2
승리 조건은 무엇입니까? 나는 가장 짧은 프로그램 (코드 골프)을 가정합니다.
Zgarb


1
모든 사람들이 이것이 코드 골프라고 가정하기 때문에 그에 따라 도전 과제에 태그를 지정합니다 (그렇지 않으면 모든 기존 답변이 다소 무의미합니다). 다른 우승 기준을 계획했다면 새로운 도전 과제를 게시하는 것을 고려할 수 있습니다.
Martin Ender

답변:


3

젤리, 29 바이트

@JonathanAllan 덕분에 -3 바이트

문제가 발생하거나 버그 / 오류가 있거나 중단 할 수있는 바이트가 있으면 알려 주십시오 .

“[(*)]”ṗµḟ”*œṣ⁾()Fœṣ⁾[]FµÐLÐḟ

온라인으로 사용해보십시오!

내가 가진 이전 솔루션 :

“[(*)]”ṗµḟ”*œṣ⁾()Fœṣ⁾[]FµÐL€Ṇ€Tị
“[(*)]”ṗµ¹ḟ”*œṣ⁾()Fœṣ⁾[]FµÐL€Ṇ€Tị
“[(*)]”ṗµ¹ḟ”*œṣ⁾()Fœṣ⁾[]FµÐL€Ṇ€×Jḟ0ị
“[(*)]”x⁸ṗ⁸Qµ¹ḟ”*œṣ⁾()Fœṣ⁾[]FµÐL€Ṇ€×Jḟ0ị
“[(*)]”x⁸ṗ⁸Qµ¹µḟ”*œṣ⁾()Fœṣ⁾[]FµÐL€Ṇ€×Jḟ0ị
“[(*)]”x⁸ṗ⁸Qµ¹µḟ”*œṣ⁾()Fœṣ⁾[]FµÐLµ€Ṇ€×Jḟ0ị

설명 (설명을위한 최선의 시도) :

Input n
“[(*)]”ṗ-All strings composed of "[(*)]" of length n
µḟ”*    -Filter out all occurences of "*"
œṣ⁾()   -Split at all occurences of "()"
F       -Flatten
œṣ⁾[]   -Split at all occurences of "[]"
F       -Flatten
µÐL     -Repeat that operation until it gives a duplicate result
Ðḟ      -Filter

필터링 ( “[(*)]”ṗµḟ”*œṣ⁾()Fœṣ⁾[]FµÐLÐḟ)을 사용하여 3 바이트를 절약 할 수 있습니다.
Jonathan Allan

15

프롤로그, 69 바이트

s-->[];e,s.
e-->"*";"(",s,")";"[",s,"]".
b(N,A):-length(A,N),s(A,[]).

Prolog의 가장 흥미로운 속성 중 하나는 많은 경우 프로그램을 거꾸로 실행할 수 있다는 것입니다. 예를 들어, 어떤 것이 참인지 테스트하는 대신 그것이 참인 모든 솔루션을 생성 할 수 있고 문자열의 길이를 확인하는 대신 주어진 길이의 모든 문자열을 생성 할 수 있습니다. (Prolog의 또 다른 좋은 특성은 각 술어 정의가 끝난 후 공백이 필요하고 공백만큼 저렴하게 줄 바꿈을 삽입 할 수 있다는 것입니다. 따라서 골프 프로그램조차도 종종 읽을 수 있습니다.)

위의 b내용은 문자열이 주어진 길이를 가지고 질문에 정의 된 "괄호 문자열"인지 여부를 테스트 하는 조건 자 (함수와 동등 함) 를 정의합니다. 특히 Prolog의 문법 / 정규식 / 패턴 일치 지원을 통해이 유형의 표현을 정의하는 데 도움이되는 짧은 설탕을 제공합니다 (분명히 표준 / 이식 가능하지만 원래 답을 쓰는 동안 나는 이것을 알지 못했기 때문에 대답은 하나의 Prolog 구현에서만 작동한다고 가정했지만 표준을 준수하는 모든 구현에서 작동하는 것으로 보입니다). 이 프로그램은 상당히 직접 영어로 번역 될 수 있습니다. 처음 두 줄은 " s 는 빈 문자열이거나 e 다음에 s가 옵니다 . a 전자는 별표 또는 S 괄호 또는 S 대괄호를 ". 세번째 줄과 같이 해석 될 수는" (B)N이 될 수 경우 A는 길이리스트이며 N은A는 가 인 s는 널 (null)이어서 끈."

나는 쓰기 몇 가지 처리했다 s(따라서 그리고 b그들이 (모두 이유이다 정확히 하나의 방법으로 각 "중괄호 문자열을"일치 그래서) s와이 e아니라 하나의 술어로 그룹화보다 존재할 필요가). 이것은 그것들을 완전히 뒤집을 수있게한다. 따라서 b문자열이 주어진 길이의 중괄호 문자열인지 테스트하는 것 외에도 주어진 길이의 모든 "중괄호 문자열"을 생성하는 데 사용될 수 있습니다 문자열이지만 거의 가장 유용한 작동 모드입니다). 구현이 생성, 예를 재귀 , 코드는 가능한 모든 생성 전자 출력의 필요한 길이보다 더 이상들, 모든 가능한 추가 남은 공간에 맞는 s; 인수의 길이를 미리 ( b 이내 ) 지정했기 때문에 Prolog 엔진은 주어진 길이보다 긴 출력을 생성 할 수 없다는 것을 알고 재귀가 종료되도록합니다.

다음은 작동중인 프로그램의 예입니다.

| ?- b(4,A),format("~s ",[A]),fail.
**** **() **[] *()* *(*) *[]* *[*] ()** ()() ()[] (*)* (**) (()) ([]) []** []() [][] [*]* [**] [()] [[]]

프로그램을 "앞으로"또는 "뒤로"실행할지 여부를 지정하는 데 필요한 구문에 약간의 비용이들 것 같습니다. 펄은 그런 종류의 모든 비트에 대해 1 바이트를 지불합니다
Sparr

글쎄, 당신은 끝에있는 인수가 항상 반환 값이라는 규칙을 만든 다음 인수 순서를 반대로하여 프로그램을 실행하는 방법을 지정할 수 있습니다. 골프 언어가 입력을 받았는지 여부를 조사하여 부분적으로해야 할 일을 파악하는 것이 일반적이며, 이는 비슷한 원리입니다. 그러나 일반적으로 가능한 모든 언어에 적용되는 규칙을 만드는 것은 어렵습니다. 같은 내장 명령을 실행 length하고 append어느 쪽이든 둥근 것은 언어의 기본적인 부분이며, 사용자 기능은 종종 같은 않습니다.

흠. 귀하의 예에 문제의 행동을 유발 한 징후가 있다고 가정했습니다.
Sparr

아냐, 전적으로 어떤 주장이 제기 되었기 때문이다. 위의 프로그램에서 나는 다음과 같이 쓴다 length(A,N). if N가 주어지고 A그렇지 않은 경우 (프로그램에서 요청 된 방식으로 술어가 사용 length되면 발생 함 ) 알 수없는 요소 A로 구성된 목록을 생성합니다 N. 목록의 길이 length측정하기 위해 사용 하는 것이 더 일반적으로 사용됩니다 (Prolog 프로그래밍에서는 "뒤로"사용하는 것이 일반적이지만). 대부분의 술어는 거의 같은 방식으로 작동합니다 (역방향을 바꾸려고 시도하면 무한 루프를 구성하기 때문에 이것이 일반적입니다).

1
@ ais523 -->및 DCG는 일반적으로 표준 ISO 프롤로그 입니다.
페이탈 라이즈

5

하스켈, 101 94 바이트

Zgarb가 7 바이트를 절약했습니다!

b 0=[""]
b n=[x++y|k<-[1..n],x<-u k,y<-b$n-k]
u 1=["*"]
u n=[a:s++b|s<-b$n-2,a:b<-["()","[]"]]

정의에 따라 거의 간단하지만 ""사례가 이동했습니다.

사용하다:

*Main> map b [0..3]
[[""],["*"],["**","()","[]"],["***","*()","*[]","()*","[]*","(*)","[*]"]]
*Main> length $ b 10
21595

(두 번째 계산은 느린 컴퓨터에서 1 초도 걸리지 않습니다.)

또한 함수 생성에 대해 생각하면서 생각해 낸 또 다른 접근법의 결과를 공유하고 싶습니다. length의 모든 괄호 문자열 을 포함하는 문자열 목록 b 의 목록을 정의합니다 . 마찬가지로 size의 모든 원자를 포함합니다 . 한 가지 좋은 점은 코드가 숫자를 사용하지 않는다는 것입니다. 그것은 완전히 golfed되지 않습니다 및 인라인 될 수 있으며, 그것은 확실히 몇 가지 다른 골프의 기회를 벗어났습니다. 불행히도 첫 번째 버전보다 짧아 질 수는 없지만 더 빠르게 계산 됩니다.b!!nnu!!nn-1uilength $ b !! 10

b=[""]:b%u
u=["*"]:map i b
i=concatMap(\s->['(':s++")",'[':s++"]"])
(b:c)%f=zipWith(++)[[x++y|x<-b,y<-e]|e<-f]([]:c%f)

두 바이트를 저장 b$n-k하고 b$n-2. 또한 마지막 줄에서을 수행 a:b<-["()","[]"]하고 돌아올 수 있습니다 a:s++b.
Zgarb

오 사용하고 싶었지만 ["()","[]"]코드 크기를 개선하는 방법을 알 수 없었습니다. 감사!
Christian Sievers

4

수학, 116 바이트

#<>""&/@Select[Characters@"*([)]"~Tuples~#,(#/."*"->Nothing//.{a___,"(",")",b___}|{a___,"[","]",b___}:>{a,b})=={}&]&

설명

Characters@"*([)]"

문자열의 문자 찾기 "*([)]"을주는, List {"*", "(", "[", ")", "]"}.

... ~Tuples~#

위 목록에서 튜플을 length로 찾습니다 n.

(#/."*"->Nothing//.{a___,"(",")",b___}|{a___,"[","]",b___}:>{a,b})=={}&

튜플의 균형이 맞는지 확인하는 부울 함수 :

#/."*"->Nothing

"*"입력에서 모두 삭제하십시오 .

... //.{a___,"(",")",b___}|{a___,"[","]",b___}:>{a,b}

반복의 모든 연속 발생, 삭제 "("")"또는 "[""]"입력이 변경되지 않습니다까지합니다.

... =={}

결과가 비어 있는지 확인하십시오 List.

Select[ ... , ... ]

True부울 함수가 적용될 때 주는 튜플을 찾으십시오 .

#<>""&/@

List문자를 Strings 로 변환하십시오 .


2
다소 예기치 않게 {x=a___,"(",")",y=b___}|{x,"[","]",y}작동하는 것 같습니다.
Martin Ender 2016

4

파이썬 2, 128 바이트

n=input()
for i in range(5**n):
 try:s=','.join('  "00([*])00"  '[i/5**j%5::5]for j in range(n));eval(s);print s[1::4]
 except:1

재귀 정규식을 조이십시오 – 우리는 파이썬 파서를 사용하고 있습니다! 예를 들어 *(**[])*중괄호 문자열인지 확인하기 위해 다음을 수행합니다.

  1. "*", (0,"*","*", [0,0] ,0) ,"*"4 와 같은 두 번째 문자는 중괄호 문자열의 문자이며 나머지 문자는 이것을 잠재적 인 파이썬 표현식으로 만들기 위해 입니다.

  2. eval 그것.

  3. 그래도 오류가 발생하지 않으면 s[1::4]괄호 문자열 문자를 인쇄 하십시오.

접착제 문자는 내가 만드는 문자열이 유효한 파이썬 표현되도록 선택됩니다 경우에만 사 개 수율 유효한 중괄호 문자열의 모든 두 번째 문자를 복용하는 경우.


2

PHP, 149 바이트

for(;$argv[1]--;$l=$c,$c=[])foreach($l?:['']as$s)for($n=5;$n--;)$c[]=$s.'*()[]'[$n];echo join(' ',preg_grep('/^((\*|\[(?1)]|\((?1)\))(?1)?|)$/',$l));

좋은 오래된 방법을 사용하여 가능한 모든 생성하고 필터 방법을 사용하십시오. 다음과 같이 사용하십시오.

php -r "for(;$argv[1]--;$l=$c,$c=[])foreach($l?:['']as$s)for($n=5;$n--;)$c[]=$s.'*()[]'[$n];echo join(' ',preg_grep('/^((\*|\[(?1)]|\((?1)\))(?1)?|)$/',$l));" 4

1

파이썬, 134 바이트

from itertools import*
lambda n:[x for x in map(''.join,product('*()[]',repeat=n))if''==eval("x"+".replace('%s','')"*3%('*',(),[])*n)]

반복

길이가 유효한 문자열 목록을 반환하는 이름이없는 함수입니다 n.
양식의 모든 길이 n문자의 튜플을 *()[]사용하여 문자열로 합류 map(''.join,...)은 "쌍"제거하여 브래킷을 균형있는 사람들을 위해 및 필터 "*", "()""[]"회전에 n(시간과 결과가 빈 문자열 인 것을 확인하는 n시간은 특히, 과잉이다 "*"하지만, 골퍼입니다).


1

레티 나 , 78 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

.+
$*
+%1`1
*$'¶$`($'¶$`)$'¶$`[$'¶$`]
%(`^
$';
)+`(\[]|\(\)|\*)(?=.*;)|^;

A`;

온라인으로 사용해보십시오!

설명

길이가 5 인 가능한 모든 문자열을 생성 한 다음 유효하지 않은 문자열을 필터링합니다.

.+
$*

1숫자로 사용하여 입력을 단항으로 변환합니다 .

+%1`1
*$'¶$`($'¶$`)$'¶$`[$'¶$`]

이것은 각 줄마다 +첫 번째 1줄 ( %)을 한 번 ( ) 대신 반복하여 ( ) 줄마다 한 줄씩 다섯 개의 사본을 만드는 방식으로 바꿉니다 . 이것은 접두사와 접미사 대체를 사용하여 수행됩니다 $`$'각 라인의 나머지를 구성 할 수 있습니다.

교체 할 1이 더 이상 없으면이 루프가 중지됩니다. 이 시점에서 우리는 가능한 모든 길이의 문자열 N을 각 줄에 하나씩 가지고 있습니다.

%(`^
$';
)+`(\[]|\(\)|\*)(?=.*;)|^;

이 두 단계는 각 라인마다 개별적으로 실행됩니다 ( %). 첫 번째 단계는 단순히 ;두 줄 을 분리 하기 위해 줄을 복제합니다 .

두 번째 단계는 또 다른 고리 (인 +반복 제거) [], ()또는 *문자열의 첫 번째 사본으로부터, 또는 (문자열이 완전히 사라진 후에 만 가능하다) 라인의 시작 부분에 세미콜론을 제거한다.

A`;

유효한 문자열은 더 이상 앞에 세미콜론이없는 문자열이므로 A세미콜론이 포함 된 모든 줄 ( )을 삭제합니다 .


입력 5로 onliny를 시도했습니다. 입력 6으로 오류 페이지가
표시됨

@ edc65 나에게 효과적이지만 물론이 접근법은 효율적이지 않으므로 몇 초가 걸립니다. 어떤 종류의 오류 페이지를 의미합니까?
Martin Ender

입력 5 : 3 초 안에 답변 입력 6 : 7 초 후 출력 상자 안에 프록시에서 오류 페이지의 html 소스를 얻습니다. 이 타임 아웃은 다음의 IT가 매우 짧은 시간 제한 만약 내가 내 대답은 6 이상 확인 입력 5까지,하지만 잘못된 보인다 ... 내가 입력 6 권리 테스트 케이스를 얻으려고 노력했다
edc65

@ edc65 확실히 7 초 이상 걸리고 TIO의 타임 아웃은 1 분입니다. 나는 당신이 묘사 한 오류를 본 적이 없으며 TIO 채팅 에서 이것을 가져올 가치가있을 수도 있습니다 (또는 gitter 또는 GitHub 를 선호하는 경우 ). 참조 출력에 관해서는 다음과 같이 입력 6을 얻습니다. pastebin.com/WmmPPmrc (입력 7은 1 분 이상 소요됨)
Martin Ender

1

파이썬 3.5, 146 바이트

import re;from itertools import*;lambda f:{i for i in map(''.join,permutations("[()]*"*f,f))if re.fullmatch("(\**\[\**\]\**|\**\(\**\)\**)*|\**",i)}

다른 답변에 비해 매우 길지만 현재 찾을 수있는 가장 짧은 답변입니다. 익명의 람다 함수 형식이므로 형식으로 호출해야합니다.

print(<Function Name>(<Integer>))

파이썬을 출력 입력 길이의 가능한 모든 괄호 문자열을 나타내는 정렬되지 않은 문자열 세트 를 .

예를 들어, 위 함수의 이름이이라고 가정하면 G호출 G(3)하면 다음과 같은 결과가 나타납니다.

{'[*]', '*()', '*[]', '(*)', '***', '[]*', '()*'}

온라인으로 사용해보십시오! (아이디어)


나처럼, 당신이 정말로 내장 기능을 사용하여 일을 단순화의 팬이 아니다, 그러나, 여기에 내 자신의 원래 대답은 하지 사용하여 모든 순열을 찾기 위해 외부 라이브러리를 현재 무려 서 288 237 바이트 :

import re;D=lambda f:f and"for %s in range(%d)"%(chr(64+f),5)+D(f-1)or'';lambda g:[i for i in eval('["".join(('+''.join('"[()]*"['+chr(o)+'],'for o in range(65,65+g))+'))'+D(g)+']')if re.fullmatch("(\**\[\**\]\**|\**\(\**\)\**)*|\**",i)]

다시 말하지만 경쟁 답변과 마찬가지로이 함수는 람다 함수의 형식이므로 형식으로도 호출해야합니다

print(<Function Name>(<Integer>))

그리고 분류되지 않은 파이썬 목록 을 출력합니다. 입력 길이의 모든 괄호 문자열을 나타내는 문자열 . 예를 들어 람다가로 호출되면 G(3)이번에는 출력이 다음과 같습니다.

['*()', '(*)', '*[]', '[*]', '()*', '[]*', '***']

또한,이 하나는 많은 길이의 모든 중괄호 - 문자열을 찾을 수있는, 더 빠른 내 다른 대답에 비해도 11약에 115초 , 길이들을 10약에 19초 , 길이들을 9약에 사초 , 길이들 8에 내 컴퓨터에서 약 0.73 초 동안 입력하는 데 경쟁 답변이 115 초보다 훨씬 오래 걸립니다 6.

온라인으로 사용해보십시오! (아이디어)


0

05AB1E, 23 바이트

…[(*.∞sãʒ'*м„()„[]‚õ:õQ

이러한 기능 중 일부는 질문이 게시 된 후에 구현되었을 수 있습니다. 어떤 제안이라도 환영합니다!

온라인으로 사용해보십시오!

어떻게?

…[(* - the string '[(*'
.∞ - intersected mirror, '[(*'=>'[(*)]'
s - swap the top two items, which moves the input to the top
ã - cartesian power
ʒ ...  - filter by this code:
  '*м      - remove all occurrences of '*'
  „()„[]‚  - the array ["()","[]"]
  õ        - the empty string ""
  :        - infinite replacement (this repeatedly removes "()", "[]", and "*" from the string
  õQ       - test equality with the empty string

05AB1E를 모르지만 *제거 배열에 있을 수도 없었 습니까? 그리고 õQ수표를 NOT과 같은 것으로 바꿀 수 있습니까?
Esolanging 과일

:하지 않습니다 어떤 바이트 저장 첫 번째 제안 '*м„()„[]‚õ:„()„[]‚'*«õ:3 개 값 AFAIK을 연결 할 명령이없는 (테스트하지) 때문이다. 두 번째 문자열은 AFAIK 문자열에서 작동하지 않을 것이기 때문에 작동하지 않습니다. (AFAIK가 "내가 아는 한"을 나타내는 곳)
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.