정규식 컴파일 (대체 별)


21

당신의 작업은 정규 표현식에서 각 문자의 대체를 지정하여 정규 표현식을 컴파일하는 것입니다.

정규식

정규 표현식은 다음을 지원합니다.

REGEX       = (LITERAL REGEX / GROUP REGEX / STAR REGEX / ALTERNATIVE)
LITERAL     = 1 / 0
GROUP       = '(' REGEX ')'
STAR        = (LITERAL / GROUP) '*'
ALTERNATIVE = '('REGEX ('|' REGEX)*')'

왜 1 또는 0입니까? 단순화를위한 것입니다. 따라서 정규식에는 다음 문자 만 있습니다.

*()|10

다음과 같이 해석됩니다.

  1. * Kleene star (왼쪽 그룹 또는 리터럴을 0 번 이상 반복)입니다.
  2. | 대체 (왼쪽 정규 표현식 또는 오른쪽 정규 표현식이 일치하는 경우 일치)입니다.
  3. () 그룹화입니다.
  4. 1 문자 1과 일치합니다.
  5. 0 문자 0과 일치합니다.

컴파일하는 방법?

6 개의 코드 스 니펫을 지정합니다 (각 정규식 문자를 대체하기 위해 하나씩). 예를 들어 대답이 다음과 같은 경우

*: FSAGFSDVADFS
|: GSDGSAG
(: GSDG
): GDSIH
1: RGIHAIGH
0:GIHEBN

그런 다음 각 정규식을 해당 코드 스 니펫으로 바꿉니다.

(0|11)*

로 바뀝니다 :

GSDGGIHEBNGSDGSAGRGIHAIGHRGIHAIGHGDSIHFSAGFSDVADFS

결과 프로그램은 무엇을해야합니까?

당신의 프로그램은 :

  1. 입력하십시오.
  2. 정규식이 전체 입력과 일치하면 정확한 값을 출력합니다.
  3. 그렇지 않으면 거짓 값이 출력됩니다.

외부 입력 01은 정의되지 않은 동작으로 간주됩니다. 입력이 비어있을 수 있습니다.

추가 규칙

  1. 주어진 정규 표현식 문자의 경우 결과 스 니펫은 항상 동일해야합니다.
  2. 나중에 추가 된 접두사 또는 접미사 문자가 없습니다.
  3. 정규식은 비어 있지 않은 것으로 보장됩니다.

채점

가장 작은 조합 스 니펫이 승자입니다. 따라서 사례의 점수는 다음과 같이 계산됩니다.

FSAGFSDVADFS+ GSDGSAG+ GSDG+ GDSIH+ RGIHAIGH+GIHEBN

12 + 7 + 4 + 5 + 8 + 6 = 42


각 스 니펫은 1 자 이상이어야합니까?
trichoplax

스 니펫은 길이가 0 일 수 있습니다. 편집은 OK입니다.
Akangka

이 과제에 정규식 언어가 유효합니까? : P
Loovjo

RegEx에 RegEx가 내장되어 있다고 생각합니다. 이 작업을 수행해야합니다. Mego에 따르면 Retina와 regex를 제외하고 싶지 않습니다. 그래도 나는 달팽이와 친구들에 대해 모른다.
Akangka

@ChristianIrwan 흥미롭게도, 이것이 여전히 Retina에서 해결할 수 있는지 확실하지 않으며 심지어 경쟁에서 멀어 질 것입니다.
Martin Ender

답변:


7

달팽이 , 48 바이트

0 -> )0(\0!(l.)(~

1 -> )0(\1!(l.)(~

( -> )0({{(

) -> )0}}(~

| -> )0}|{(

* -> )0),(~

전체 입력 만 일치시키기보다는 부분 일치를 검색해야한다면 매우 쉽습니다. 0될 것입니다 \0, 1될 것입니다 \1, *될 것입니다 ,, 그리고 다른 사람은 자신에 매핑됩니다. 대신 시합 이외의 다른 곳에서 시작하거나 끝 이외의 곳에서 끝나는 것을 막기 위해 많은 세 나니가 있습니다. !(l.)일치의 시작이 입력의 시작이 아닌 경우 실패 할 어설 션입니다. ~입력 외부의 셀과 일치하므로 정규식 끝에 허용되는 모든 문자에 추가됩니다. 다음에 또 다른 정규 표현식 문자가 있으면 숫자 한정자에 의해 취소됩니다.0본질적으로 주석 처리하여 0 번 일치시켜야합니다. 허용하려면 *( ,), 언어의 브래킷 일치하는 규칙이 많이 사용되는 범위를 벗어날 길에있는 테스트 더미에도 불구하고 제대로 작동합니다. 설명서에서 :

일치하는 괄호 ()또는 중괄호 쌍은 {}예상대로 작동하지만 (정규식의 괄호처럼) 다음 규칙에 따라 쌍의 절반을 생략하고 유추 할 수도 있습니다. )또는 }같은 유형 ( (또는 {각각) 의 가장 가까운 닫히지 않은 그룹 열기 명령이있을 때까지 또는 왼쪽에있는 모든 것을 그룹화합니다 ( 없는 경우). 이 범위의 중간에 반대 유형의 닫히지 않은 열기 명령이 닫힙니다. 그렇지 않으면 패턴 끝에서 일치하지 (않거나 {닫힙니다.

진흙처럼 맑습니까?


한숨, 정규 표현식 외부에도 일치하는 언어가 있다는 것을 잊었습니다. 잘 했어, 미안,
공감 금지 (공감 금지

@ChristianIrwan이 사이트에는 실제로 2D 매칭 언어를 개발하는 데있어 모든 도전이 있습니다. 대부분 2D 일치 언어를 사용합니다. codegolf.stackexchange.com/questions/47311/...
Sparr

7

CJam, 151 바이트

{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM0sa`T
{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM1sa`T
M{{+:M];eas!}:T}|U):UM'[T
MN`T
U(:UM'JT
M\"S+ea`,m*\"T

행은 문자 01(|)*에 해당합니다 (순서대로). 온라인으로 사용해보십시오!

내장 정규 표현식이나 다른 유형의 패턴 일치를 사용하지 않습니다. 실제로 CJam에는 이러한 기능이 없습니다. 대신, 정규 표현식에서 시작하여 일치 할 수있는 모든 문자열을 빌드 하여 사용자 입력이 그 중 하나인지 확인합니다.

시운전

다음은 STDIN에서 정규 표현식을 읽고 각 문자를 적절한 스 니펫으로 바꾸고 생성 된 코드를 평가하여 명령 행 인수에 지정된 입력과 일치하는지 확인하는 프로그램을 사용합니다.

$ cat regex.cjam
l"01(|)*""

{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM0sa`T
{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM1sa`T
M{{+:M];eas!}:T}|U):UM'[T
MN`T
U(:UM'JT
M\"S+ea`,m*\"T

"N%ers~
$ cjam regex.cjam '' <<< '(|)'
1
$ cjam regex.cjam '0' <<< '(|)'
0
$ cjam regex.cjam '' <<< '0(|)'
0
$ cjam regex.cjam '0' <<< '0(|)'
1
$ cjam regex.cjam '' <<< '(0|11)*'
1
$ cjam regex.cjam '0' <<< '(0|11)*'
1
$ cjam regex.cjam '11' <<< '(0|11)*'
1
$ cjam regex.cjam '011011000' <<< '(0|11)*'
1
$ cjam regex.cjam '1010' <<< '(0|11)*'
0

불행히도 이것은 빠르지 않습니다. 입력에 9 자 이상이 있거나 정규 표현식에 하나 이상의 Kleene 별이 있으면 오히려 빨리 질식합니다.

5 바이트의 추가 비용 (총 156 바이트)으로 잠재적 인 입력과 일치하도록 짧은 문자열을 생성하여 중복 제거 할 수 있습니다. 코드 작동 방식은 변경되지 않습니다. 더 효율적입니다.

$ cat regex-fast.cjam 
l"01(|)*""

{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM0sa`T
{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM1sa`T
M{{+:M];eas!}:T}|U):UM'[T
MN`T
U(:UM'JT
M\"S+eas,)m*:sSf-L|\"T

"N%ers~
$ cjam regex-fast.cjam '0101001010' <<< '(01|10)*'
0
$ cjam regex-fast.cjam '011001101001' <<< '(01|10)*'
1
$ cjam regex-fast.cjam '0' <<< '(0*1)*'
0
$ time cjam regex-fast.cjam '101001' <<< '(0*1)*'
1

나는 이것을 더 짧고 빠르게 만들 수있는 방법을 여전히 알고 있습니다. 결과에 만족하면 설명을 추가하겠습니다.
Dennis

`-escaping of the 에 대한 패턴 에는 불필요한 "` 가있는 것 같습니다 *. 그럼에도 불구하고, 정규 표현식이 0( 온라인 인터프리터의 테스트 참조) 로 구성된 가장 간단한 경우에도이 프로그램이 입력을 받아 들일 수 없었습니다 . 내가 잘못하고 있니?
matz

1
@matz 내 코드는 해당 인터프리터에서 구현되지 않은 명령 줄 인수를 사용합니다. 대신 이것을 시도하십시오 .
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.