Regex, กระดาษ, กรรไกร, Lizard, Spock


81

อุ่นเครื่อง: Regex, กระดาษ, กรรไกร

นี่คือความท้าทายที่ฉันต้องการโพสต์ก่อนที่จะรู้ว่ามีคำตอบสั้น ๆ อย่างไรก็ตามอาจเป็นปัญหาที่น่าสนใจในการเตรียมความพร้อมสำหรับความท้าทายที่แท้จริงด้านล่าง

เขียนสาม regexes R , PและSเพื่อให้เข้าคู่กันในวงร็อค, กระดาษ, กรรไกรแฟชั่น โดยเฉพาะอย่างยิ่งRตรงกับS , SตรงกับPและPตรงกับRแต่R ไม่ตรงกับP , S ไม่ตรงกับRและPไม่ตรงกับS นี่คือตารางที่มีประโยชน์:

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

ไม่สำคัญว่าR , PและSจะทำอะไรกับอินพุตอื่นรวมถึงตัวมันเองด้วย

ที่นี่การแข่งขันก็หมายความว่าบางคน (อาจจะเป็นที่ว่างเปล่า) ย่อยของท่านจะถูกจับคู่ การแข่งขันไม่จำเป็นต้องครอบคลุมการป้อนข้อมูลทั้งหมด

ความท้าทาย: Regex, กระดาษ, กรรไกร, Lizard, Spock

สำหรับความท้าทายนี้คุณจะแก้ปัญหาข้างต้นที่ยากขึ้นโดยอ้างอิงจากตัวแปร RPS Rock, Paper, Scissors, Lizard, Spock (ตามทฤษฎีบิ๊กแบง ) ใน RPSLV มีห้าสัญลักษณ์ที่แตกต่างกันซึ่งเอาชนะกันและกันในสองรอบ:

  • ร็อค→กรรไกร→จิ้งจก→กระดาษ→สป็อค→ร็อค
  • Rock → Lizard → Spock →กรรไกร→กระดาษ→ Rock

คุณควรเขียนห้า regexes R , P , S , LและVซึ่งเลียนแบบโครงสร้างนี้เมื่อกำหนดให้กันเป็นอินพุต นี่คือตารางที่เกี่ยวข้อง:

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ฯลฯ แต่ regexes อื่น ๆ เช่นถ้า regex Rของคุณเป็น^\w$ตัวอย่างPและVต้องจับคู่สตริง^\w$ในขณะที่SและLไม่ควร

การจับคู่อีกครั้งหมายความว่ามีการจับคู่สตริงย่อย (อาจว่างเปล่า) อย่างน้อยหนึ่งรายการ การแข่งขันไม่จำเป็นต้องครอบคลุมการป้อนข้อมูลทั้งหมด ยกตัวอย่างเช่น\b(คำเขตแดน) ตรงhello(ที่จุดเริ่มต้นและในตอนท้าย) (^,^)แต่มันไม่ตรงกับ

คุณสามารถใช้รสชาติของ regex ใดก็ได้ แต่โปรดระบุตัวเลือกในคำตอบของคุณและถ้าเป็นไปได้ให้ลิงค์ไปยังผู้ทดสอบออนไลน์สำหรับรสชาติที่เลือก คุณไม่สามารถใช้คุณสมบัติ regex ใด ๆ ที่ช่วยให้คุณสามารถเรียกใช้รหัสในภาษาโฮสต์ของ flavour (เช่นeตัวดัดแปลงของ flavour Perl )

ตัวคั่น (เหมือน/regex/) จะไม่รวมอยู่ใน regex เมื่อกำหนดเป็นอินพุตให้กับอีกตัวหนึ่งและคุณไม่สามารถใช้ตัวดัดแปลงที่อยู่นอก regex รสชาติบางอย่างยังให้คุณใช้โมเดอเรเตอร์กับซินแท็กซ์แบบอินไลน์(?s)ได้

คะแนนของคุณคือผลรวมของความยาวของห้า regexes เป็นไบต์ ต่ำกว่าดีกว่า

มันจะเปิดออกจะง่ายมากที่จะหาวิธีการทำงานเพื่อแก้ไขปัญหานี้กว่ามันอาจจะดูเหมือนในตอนแรก แต่ผมหวังว่าการหาทางออกที่ดีที่สุดคือค่อนข้างยุ่งยาก


พูดว่า R ต้องจับคู่ regex ทั้งหมดของ S หรือซับสตริงของ S หรือไม่หากไม่ตรงกับสตริงย่อยของ P หรือ V
Okx

@Okx "การจับคู่หมายความว่ามีการจับคู่สตริงย่อย (อย่างน้อยว่าง) อย่างน้อยหนึ่งรายการการจับคู่ไม่จำเป็นต้องครอบคลุมอินพุตทั้งหมดตัวอย่างเช่น\b(ขอบเขตของคำ) จับคู่hello(ที่จุดเริ่มต้นและท้าย) แต่ มันไม่ตรงกัน(^,^)"
Martin Ender

1
สมมุติว่ามันไม่สำคัญว่า regex จะจับคู่ตัวมันเองหรือไม่?
Brilliand

@ Brilliand ถูกต้อง
Martin Ender

1
ปริศนาที่ยอดเยี่ยม ฉันได้สร้างเวอร์ชันอินเทอร์แอกทีฟที่นี่ถ้าใครสนใจ: shark.fish/rock-paper-scissors
shark.dp

คำตอบ:


45

PCRE .NET, 35 32 ไบต์

-3 ไบต์ขอบคุณ Martin Ender

ร็อค:

([*?]$)

กระดาษ:

[)$]$+

กรรไกร:

[+?]$.*

จิ้งจก:

[+$]$.?

สป็อค:

[*)]$

แนวคิดที่นี่คือการจับคู่อักขระที่ส่วนท้ายของ regexes อื่น ๆ ซึ่งเป็นอักขระ regex ที่สงวนไว้ แต่หยุดได้รับการปฏิบัติเช่นนี้เมื่ออยู่ภายในคลาสอักขระ


1
โอเคคุณชนะ: P
ETHproductions

3
การใช้งานอย่างไม่ระมัดระวังในการวางสิ่งของหลังจาก EOL "$" ที่ไม่ได้รับความสนใจเมื่อใช้อย่างแข็งขันและสามารถจับคู่ได้เมื่อใช้แบบพาสซีฟ
Stilez

44

PCRE, 15 14 ไบต์

ร็อค:
B

กระดาษ:
\b$

กรรไกร:
b|B.

จิ้งจก:
\B.

สป็อค:
^\w


4
ที่น่าประทับใจมาก.
Eric Duminil

เอาชนะ! ฉันเล่นซอกับ Rock = Q(มี 14b โซลูชันหนึ่งเดียวกับ Lizard = `\ Q \ 'ดังนั้นที่เหลือจะคล้ายกับของคุณ) แต่ไม่มีประโยชน์แน่นอน
jaytea

40

ไม่มีฟีเจอร์แฟนซี35 30 ไบต์

5 ไบต์บันทึกไว้โดยความคิดของนีลซึ่งใช้ที่ไม่จำเป็นต้อง]\

สิ่งนี้ใช้ได้กับreโมดูลpython

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



8

JavaScript ขนาด 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 ตัวสุดท้ายเมื่อใช้เป็นregexต้องจับคู่ (สตริงว่าง) ดังนั้นรูปแบบจะยุบลงไปที่ "มี 5 ตัวอักษรตามด้วยตัวอักษรเป้าหมาย": ความหมายตัวอักษร 6-9 ของเป้าหมายจะต้องมีตัวอักษรเป้าหมาย (ตัวอักษรตัวที่ 5 ในสตริงแต่ละตัว)

อัปเดต: รุ่น 35 ไบต์ด้านล่างทันที!


ฉันคิดเสมอว่าVไม่ใช่จริงสำหรับV ulcan แต่เพื่อแสดงถึงรูปร่างของ Vulcan salute (ซึ่งเป็นท่าทางมือที่คุณใช้แสดง Spock เมื่อเล่น RPSLV ด้วยตนเอง)
Martin Ender

อย่างไรก็ตามยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี ฉันชอบที่คุณได้กลับหัวตรรกะเมื่อเทียบกับคำตอบที่มีอยู่ทั้งหมด (จับคู่เพียงตัวเดียวและใส่ตัวอักษรที่ตี regex ปัจจุบันลงใน regex)
Martin Ender

POSIX ยึดการจับคู่กับจุดเริ่มต้นของสตริงโดยอัตโนมัติหรือไม่ มิฉะนั้นคุณจะไม่ลบเครื่องหมายจุลภาคเหล่านั้นหรือ
Martin Ender

ฉันคิดว่า POSIX อาจจะเป็นเพอร์ แต่ใช่ด่างอย่าง! น้อยกว่า 5 ตัวอักษร!
Stilez

4
ไม่จำเป็นต้องแข่งขันกับเยลลี่ เพียงเลือกภาษาที่คุณชอบและสนุกกับตัวเอง :)
Martin Ender

3

PCRE ขนาด 65 ไบต์

นี่เป็นวิธีแก้ปัญหาเล็ก ๆ น้อย ๆ - และไม่ฉลาดเลย - แต่ฉันจะพยายามตีกอล์ฟ

V:

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

L:

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

S:

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

P:

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

R:

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

โดยพื้นฐานแล้วแต่ละ regex มี 'ตัวระบุ' ในรูปแบบของความคิดเห็นซึ่งบอก regexes อื่น ๆ ว่าควรจะจับคู่หรือไม่


3

.NET, 50 ไบต์

R, P, S, L, Vเพื่อที่พวกเขาจะ

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

ทำงานโดยค้นหากลุ่มตัวระบุ (ตัวอย่างเช่น[^R]) ในแต่ละนิพจน์อื่น

การเปลี่ยนนิพจน์เป็น^R|\^[SL]หรือคล้าย ๆ กันนั้นดูเหมือนว่าจะได้ผล แต่มันก็ค่อนข้างคล้ายกับคำตอบของ @ dzaima ถึงแม้ว่ามันจะไปถึง 45 ไบต์


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.