정규식, 종이, 가위, 도마뱀, Spock


81

예열 : 정규식, 용지, 가위

이것은 매우 짧은 해결책이 있다는 것을 깨닫기 전에 원래 게시하고 싶었던 과제입니다. 그럼에도 불구하고 아래의 실제 도전에 대비하여 생각하는 것은 흥미로운 문제가 될 수 있습니다.

주기적 록, 페이퍼, 가위 방식으로 서로 일치하도록 세 개의 정규 표현식 R , PS를 작성하십시오 . 특히, R은 일치 S를 , S는 일치 PP가 일치 R을 하지만, R은 하지 않습니다 일치 P를 , S는 하지 않습니다 일치 R을 하고 P는 일치하지 않는 S를 . 다음은 편리한 테이블입니다.

Regex   Matches   Doesn't match
R       S         P
P       R         S
S       P         R

R , PS 가 자신을 포함하여 다른 입력에서 수행하는 작업은 중요하지 않습니다 .

여기서 match 는 입력의 일부 (비어있는) 부분 문자열이 일치한다는 의미입니다. 경기는 전체 입력을 포함하지 않아도됩니다.

도전 과제 : Regex, Paper, Scissors, Lizard, Spock

이 문제를 해결하기 위해 RPS 변형 Rock, Paper, Scissors, Lizard, Spock ( The Big Bang Theory에 의해 대중화 됨)을 기반으로 위의 문제의 더 강력한 버전을 해결합니다 . RPSLV에는 두 가지 주기로 서로를이기는 다섯 가지 심볼이 있습니다.

  • 바위 → 가위 → 도마뱀 → 종이 → Spock → 바위
  • 바위 → 도마뱀 → Spock → 가위 → 종이 → 바위

입력으로 서로에게 주어질 때이 구조를 모방 한 5 개의 정규 표현식 R , P , S , LV 를 작성해야 합니다. 해당 테이블은 다음과 같습니다.

Regex   Matches   Doesn't match
R       L, S      V, P
L       V, P      S, R
V       S, R      P, L
S       P, L      R, V
P       R, V      L, S

그냥 명확하게하기 위해, 당신은해야 하지 문자열과 일치 R, P등, 그러나 다른 정규 표현식에. 예 를 들어 정규 표현식 R^\w$예이면 PV 는 문자열과 일치 해야 ^\w$하지만 SL 은 일치 하지 않아야합니다.

다시 말하지만, match 는 입력의 적어도 하나의 (비어있는) 부분 문자열이 일치한다는 것을 의미합니다. 경기는 전체 입력을 포함하지 않아도됩니다. 예를 들어 \b(단어 경계)는 hello(시작과 끝에) 일치하지만 일치하지 않습니다 (^,^).

정규식 풍미를 사용할 수 있지만 답에 선택 사항을 명시하고 가능한 경우 선택한 풍미에 대한 온라인 테스터 링크를 제공하십시오. 풍미의 호스트 언어로 코드를 호출 할 수있는 정규식 기능을 사용할 수 없습니다 (Perl 풍미의 e수정 자 등).

다른 구분자 (예 :)는 다른 문자에 /regex/입력 할 때 정규식에 포함되지 않으며 정규식 외부에있는 수정자를 사용할 수 없습니다. 일부 맛은 여전히 ​​같은 인라인 구문으로 수정자를 사용할 수 있습니다 (?s).

점수는 5 개 정규 표현식의 길이를 바이트 단위로 합한 것입니다. 낮을수록 좋습니다.

그것은 찾기 위해 많은 간단 것으로 판명 처음에 보이는 것보다이 문제에 대한 작업 솔루션을,하지만 난 최적의 솔루션을 찾는 것은 상당히 까다 롭습니다 바랍니다.


예를 들어, R이 P 또는 V의 하위 문자열과 일치하지 않는 경우 S의 전체 정규 표현식 또는 S의 하위 문자열과 일치해야합니까?
Okx

@Okx "match"는 입력의 적어도 하나의 (비어있을 수있는) 하위 문자열이 일치 함을 의미합니다. 일치는 전체 입력을 포함 할 필요는 없습니다. 예를 들어 \b(단어 경계) 일치는 hello(시작과 끝에서 ) 일치 하지만 일치하지 않습니다 (^,^). "
Martin Ender

1
아마도 정규 표현식이 일치하는지는 중요하지 않습니까?
Brilliand

@Brilliand 맞습니다.
Martin Ender

1
큰 퍼즐. 누군가 관심이 있다면 대화식 버전을 만들었습니다. shark.fish/rock-paper-scissors
shark.dp

답변:


45

PCRE .NET, 35 32 바이트

Martin Ender 덕분에 -3 바이트

록:

([*?]$)

종이:

[)$]$+

가위:

[+?]$.*

도마뱀:

[+$]$.?

스팍 :

[*)]$

여기서 아이디어는 정규식 문자가 예약되어 있지만 문자 클래스 내부에서 처리되지 않는 다른 정규식 끝의 문자를 일치시키는 것입니다.


1
좋아, 승리 : P
ETHproductions

3
EOL "$" 뒤에 물건을 넣는 것은 비열한 사용입니다. 수동적으로 사용하면 능동적으로 사용될 때 무시 될 수 있습니다
Stilez

44

PCRE, 15 14 바이트

록:
B

종이:
\b$

가위:
b|B.

도마뱀:
\B.

스팍 :
^\w


4
매우 인상적.
Eric Duminil

타의 추종을 불허! 나는 Rock =으로 고민하고있다 Q(도마뱀 =`\ Q \`로 하나의 14b 솔루션이 존재하고 나머지는 당신과 비슷하다).
jaytea

40

멋진 기능 없음, 35 30 바이트

Neil의 아이디어로 5 바이트를 절약 ]할 수 \있습니다.

이것은 예를 들어 파이썬 re모듈 에서 작동 합니다.

R='[SLR]]'
P='[RVP]]'
S='[PLS]]'
L='[PVL]]'
V='[SRV]]'

]어떤 규칙인지 나타내는 문자가 앞에 오는 것을 검색합니다 .

이전 버전 사용 R='\[[RSL]'

점수 40으로의 이전 시도는 R='[SL]x|Rx'등 을 사용했습니다 .


1
다음을 모두 역전시켜 5 바이트를 절약하십시오 R='[LSR]]'.
Neil

@ Neil 그것은 정말 개선되었습니다, 감사합니다!
Christian Sievers

This works with python's re글쎄요, 파이썬은 아마도 헤더 일 것입니다
cat

1
@cat 나는 또한 "예를 들어"라고 썼다. 전체 문장은 내가 실제로 시도한 구체적인 것을 말하는 것이다. 나는 다른 사람들처럼 POSIX를 말할 수 있다고 생각하지만 내 헤더는 꽤 정확하다고 생각합니다.
Christian Sievers

26

PCRE, 20 19

W

종이

^\w

가위

^\W

스팍

w?\x57$

도마뱀

[w]W?


8

자바 스크립트, 45 바이트

또 다른 사소한 해결책.

R:
^R|^.[SL]
P:
^P|^.[RV]
S:
^S|^.[PL]
L:
^L|^.[PV]
V:
^V|^.[SR]

오, 방금 내 대답이 더 길거나 비슷한 버전이라는 것을 깨달았습니다. 삭제하고 싶습니까?
TheLethalCoder

4
@TheLethalCoder 모든 답변은 현재 서로 더 길거나 짧은 버전입니다 : p
dzaima

1
하하라고 가정합니다.
TheLethalCoder

5

POSIX, 50 45 바이트

Rock
.{5}RP?V?
Paper
.{5}PS?L?
Scissors
.{5}SR?V?
Lizard
.{5}LR?S?
Vulcan (Spock)
.{5}VP?L?

더 짧게 할 수는 있지만 ($ 뒤에 일치 숨기기) 트릭이 사용되었으므로 다른 방법을 찾고 있습니다.

각 문자열의 처음 5자는 일치 할 때 무시됩니다. 따라서 효과적인 대상 문자열은 X? Y?로 단순화됩니다. "?"때문에 이중 문자가 없습니다. 는 일반 문자이므로 정규식으로 사용될 때 마지막 4 개의 문자 가 일치해야합니다 (널 문자열). 따라서 패턴은 "5 자 뒤에 대상 문자가 포함됨"으로 축소됩니다. 즉, 대상의 문자 6-9는 대상 문자 (각 문자열의 5 번째 문자)를 포함해야합니다.

업데이트 : 지금 35 바이트 버전!


난 항상 생각 V가 에 대한 사실 아니다 V (당신이 직접 RPSLV을 재생할 때 스팍을 표현하기 위해 사용하는 손 제스처입니다) 발칸 경례의 모양을 나타내는 것이 아니라 ulcan.
마틴 엔더

어쨌든 PPCG에 오신 것을 환영합니다! 좋은 첫 대답. 나는 당신이 기존의 모든 대답과 비교하여 논리를 뒤집어 놓은 것을 좋아합니다 (한 글자 만 일치하고 현재 정규 표현식을 치는 문자를 정규 표현식에 넣는 것).
마틴 엔더

POSIX가 문자열의 시작 부분에 일치 항목을 자동으로 고정합니까? 그렇지 않으면 해당 쉼표를 삭제할 수 없습니까?
마틴 엔더

POSIX라고 생각합니다. 퍼크 일 수 있습니다. 그러나 예, 멋지게 발견되었습니다! 5 자 이하!
Stilez

4
젤리와 경쟁 할 필요가 없습니다. 좋아하는 언어를 선택하고 즐기십시오. :)
Martin Ender

3

PCRE, 65 바이트

이것은 정말 사소한 해결책이며 전혀 영리하지는 않지만 골프를 치려고 노력할 것입니다.

V:

(?#V).+[SR]\)

엘:

(?#L).+[PV]\)

에스:

(?#S).+[PL]\)

피:

(?#P).+[RV]\)

아르 자형:

(?#R).+[SL]\)

기본적으로 각 정규식에는 주석 형식의 '식별자'가 있으며 다른 정규식과 일치하는지 여부를 알려줍니다.


3

.NET, 50 바이트

순서대로 R, P, S, L, V입니다.

[^R]\^[SL]
[^P]\^[RV]
[^S]\^[PL]
[^L]\^[PV]
[^V]\^[SR]

식별자 그룹을 찾아서 작동합니다 (예 : [^R]다른 각 표현식에서 합니다.

표현식을 ^R|\^[SL], 또는 이와 유사한 것으로 변경하면 작동하는 것처럼 보이지만 45 바이트로 가져 오지만 @ dzaima의 답변과 너무 비슷합니다.


3

바닐라 RE, 40 자

가장 간결하거나 우아한 솔루션은 아니지만 유쾌한 준 시맨틱 한 시각적 구조를 가지고 있습니다!

[^r][sl]
[^p][vr]
[^s][lp]
[^l][pv]
[^v][rs]

바위는 가위를 친다 또는 도마뱀
용지 발칸 박동이나 바위
가위는 도마뱀 박동이나 종이
도마뱀은 종이 친다 또는 발칸
발칸 락이나 가위 친다


2

POSIX, 35 바이트

Rock
R?^[LS]
Paper
P?^[RV]
Scissors
S?^[LP]
Lizard
L?^[PV]
Vulcan (Spock)
V?^[RS]

시작 / 종료 기호 뒤에 "숨기기"와는 완전히 다른 방식으로, 그것에 대해 괜찮습니다. ")"때문에 시작과 일치합니다. 다른 방법으로 수행하면 항상 문자와 끝 / $ 사이에 있어야합니다.

내 첫 번째 솔루션보다 10 바이트가 적고 개념적으로 간단하며 보너스입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.