Regex, Giấy, Kéo, Thằn lằn, Spock


81

Làm nóng: Regex, Giấy, Kéo

Đây là thử thách ban đầu tôi muốn đăng, trước khi nhận ra rằng một số giải pháp rất ngắn tồn tại. Tuy nhiên, nó có thể là một vấn đề thú vị để suy nghĩ về việc chuẩn bị cho thử thách thực tế dưới đây.

Viết ba biểu thức R , PS sao cho chúng khớp với nhau theo kiểu Rock, Paper, Kéo theo chu kỳ. Đặc biệt, R phù hợp S , S phù hợp với PP phù hợp với R , nhưng R không phù hợp với P , S không phù hợp với RP không phù hợp S . Đây là một bảng tiện dụng:

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

Không có vấn đề gì R , PS làm trên bất kỳ đầu vào nào khác, kể cả chính họ.

Ở đây, khớp chỉ có nghĩa là một số chuỗi con (có thể trống) của đầu vào được khớp. Trận đấu không cần phải bao gồm toàn bộ đầu vào.

Thử thách: Regex, Giấy, Kéo, Thằn lằn, Spock

Đối với thử thách này, bạn sẽ giải quyết một phiên bản khó hơn của vấn đề trên, dựa trên biến thể RPS Rock, Paper, Kéo, Lizard, Spock (được phổ biến bởi Lý thuyết Big Bang ). Trong RPSLV, có năm biểu tượng khác nhau, đánh bại nhau theo hai chu kỳ:

  • Đá → Kéo → Thằn lằn → Giấy → Spock → Đá
  • Đá → Thằn lằn → Spock → Kéo → Giấy → Đá

Bạn nên viết năm biểu thức R , P , S , LV bắt chước cấu trúc này khi được trao cho nhau làm đầu vào. Đây là bảng tương ứng:

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

Chỉ cần được rõ ràng, bạn nên không phù hợp với chuỗi R, P, vv, nhưng regexes khác. Ví dụ: nếu regex R của bạn là ^\w$ví dụ, thì PV phải khớp với chuỗi ^\w$, trong khi SL không nên.

Một lần nữa, khớp chỉ có nghĩa là ít nhất một chuỗi con (có thể trống) của đầu vào được khớp. Trận đấu không cần phải bao gồm toàn bộ đầu vào. Ví dụ \b(ranh giới từ) khớp hello(ở đầu và cuối), nhưng nó không khớp (^,^).

Bạn có thể sử dụng bất kỳ hương vị regex nào, nhưng vui lòng nêu sự lựa chọn trong câu trả lời của bạn và, nếu có thể, cung cấp một liên kết đến một người kiểm tra trực tuyến cho hương vị đã chọn. Bạn không được sử dụng bất kỳ tính năng regex nào cho phép bạn gọi mã bằng ngôn ngữ máy chủ của flavour (như công cụ esửa đổi của Perl flavour ).

Dấu phân cách (như /regex/) không được bao gồm trong regex khi được đưa vào làm đầu vào cho cái khác và bạn không thể sử dụng các công cụ sửa đổi nằm ngoài regex. Một số hương vị vẫn cho phép bạn sử dụng công cụ sửa đổi với cú pháp nội tuyến như thế nào (?s).

Điểm của bạn là tổng độ dài của năm biểu thức chính xác theo byte. Thấp hơn là tốt hơn.

Hóa ra là đơn giản hơn rất nhiều để tìm một giải pháp làm việc cho vấn đề này hơn nó có vẻ lúc đầu, nhưng tôi hy vọng rằng việc tìm kiếm một giải pháp tối ưu là khá phức tạp.


Liệu, giả sử, R phải khớp với toàn bộ biểu thức của S hoặc một chuỗi con của S, miễn là nó không khớp với bất kỳ chuỗi con nào của P hoặc V?
Okx

Khớp @Okx "chỉ có nghĩa là ít nhất một chuỗi con (có thể trống) của đầu vào được khớp. Trận đấu không cần phải bao gồm toàn bộ đầu vào. Ví dụ: \branh giới từ) khớp hello(ở đầu và cuối), nhưng nó không phù hợp (^,^). "
Martin Ender

1
Có lẽ nó không thành vấn đề nếu một regex phù hợp với chính nó?
Brilliand

@Brilliand Đúng.
Martin Ender

1
Câu đố tuyệt vời. Tôi đã tạo một phiên bản tương tác ở đây, nếu có ai quan tâm: Shark.fish/rock-apers-sc khoa
Shark.dp

Câu trả lời:


45

PCRE .NET, 35 32 byte

-3 byte nhờ Martin Ender

Đá, hon đa, phiên đa:

([*?]$)

Giấy:

[)$]$+

Cây kéo:

[+?]$.*

Con thằn lằn:

[+$]$.?

Spock:

[*)]$

Ý tưởng ở đây là khớp các ký tự ở cuối các biểu thức chính khác là các ký tự biểu thức chính, nhưng dừng lại được xử lý như vậy khi ở trong một lớp ký tự.


1
Được rồi, bạn thắng: P
Sản xuất ETH

3
Việc lén lút sử dụng để đặt mọi thứ sau EOL "$" bị bỏ qua khi được sử dụng tích cực và phù hợp khi được sử dụng thụ động
Stilez

44

PCRE, 15 14 byte

Đá, hon đa, phiên đa:
B

Giấy:
\b$

Cây kéo:
b|B.

Con thằn lằn:
\B.

Spock:
^\w


4
Rất ấn tượng.
Eric Duminil

Bất khả chiến bại! Tôi đã đấu tranh với Rock = Q(một giải pháp 14b tồn tại với Lizard = `\ Q \`, phần còn lại tương tự như của bạn) nhưng hoàn toàn không có kết quả.
jaytea

40

không có tính năng ưa thích, 35 30 byte

5 byte được lưu bởi ý tưởng của Neil sử dụng ]không cần \.

Điều này hoạt động ví dụ với remô-đun python .

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

Nó tìm kiếm ]trước một chữ cái cho biết đó là quy tắc nào.

Phiên bản trước được sử dụng, R='\[[RSL]'vv

Một nỗ lực trước đó với điểm 40 đã được sử dụng, R='[SL]x|Rx'v.v.


1
Lưu 5 byte bằng cách đảo ngược mọi thứ: R='[LSR]]'vv
Neil

@Neil Đó là một cải tiến tuyệt vời, cảm ơn!
Christian Sievers

This works with python's retốt, Python có lẽ nên là tiêu đề sau đó
con mèo

1
@cat Tôi cũng đã viết "ví dụ", toàn bộ câu chỉ là để nói một cái gì đó cụ thể mà tôi thực sự đã thử. Tôi đoán tôi có thể nói POSIX như một số người khác đã làm, nhưng tôi nghĩ tiêu đề của tôi hoàn toàn chính xác.
Christian Sievers

26

PCRE, 20 19

Đá, hon đa, phiên đa

W

Giấy

^\w

Cây kéo

^\W

Spock

w?\x57$

Con thằn lằn

[w]W?


8

JavaScript, 45 byte

Một giải pháp tầm thường khác.

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

Oh chỉ nhận ra câu trả lời của tôi là phiên bản dài hơn / tương tự của bạn, muốn tôi xóa nó không?
TheLethalCoder

4
@TheLethalCoder Tất cả các câu trả lời hiện tại chỉ là phiên bản dài hơn / ngắn hơn của nhau: p
dzaima

1
Tôi cho rằng haha ​​...
TheLethalCoder

5

POSIX, 50 45 byte

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

Có thể được thực hiện ngắn hơn nhưng thủ thuật (ẩn kết quả sau $) đã được sử dụng, vì vậy tôi đang tìm cách khác

5 ký tự đầu tiên của mỗi chuỗi được bỏ qua khi khớp. Vì vậy, chuỗi mục tiêu hiệu quả đơn giản hóa thành X? Y?. Không ai trong số họ có bất kỳ chữ cái kép nào vì "?" là một char thông thường, vì vậy 4 ký tự cuối cùng khi được sử dụng làm regex phải khớp (chuỗi null). Vì vậy, các mẫu được thu gọn thành "chứa 5 ký tự theo sau là chữ cái đích": có nghĩa là các ký tự 6-9 của mục tiêu phải chứa ký tự đích (ký tự thứ 5 trong mỗi chuỗi)

Cập nhật: phiên bản 35 byte bên dưới, ngay bây giờ!


Tôi luôn nghĩ rằng V không thực sự dành cho V ulcan mà là đại diện cho hình dạng của chào Vulcan (đó là cử chỉ tay bạn sử dụng để đại diện cho Spock khi chơi RPSLV trực tiếp).
Martin Ender

Dù sao, chào mừng bạn đến với PPCG! Câu trả lời đầu tiên tốt đẹp. Tôi thích rằng bạn đã đảo ngược logic so với tất cả các câu trả lời hiện có (chỉ khớp một chữ cái và đặt các chữ cái đánh bại regex hiện tại vào regex).
Martin Ender

POSIX có tự động neo khớp vào đầu chuỗi không? Nếu không, bạn không thể bỏ những dấu phẩy đó?
Martin Ender

Tôi nghĩ POSIX của nó. Có thể là perc. Nhưng vâng, độc đáo phát hiện! 5 chars ít!
Stilez

4
Không cần phải cạnh tranh với Jelly. Chỉ cần chọn một ngôn ngữ bạn thích và tận hưởng chính mình. :)
Martin Ender

3

PCRE, 65 byte

Đây là một giải pháp thực sự tầm thường - và không thông minh chút nào - nhưng tôi sẽ cố gắng đánh gôn nó.

V:

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

L:

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

S:

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

P:

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

R:

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

Về cơ bản, mỗi regex có một 'định danh', dưới dạng một nhận xét, cho biết các regex khác xem nó có nên được khớp hay không.


3

.NET, 50 byte

Theo thứ tự chúng là R, P, S, L, V.

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

Hoạt động bằng cách tìm nhóm định danh (ví dụ [^R]:) trong mỗi biểu thức khác.

Việc thay đổi các biểu thức thành ^R|\^[SL], hoặc tương tự, dường như hoạt động nhưng sau đó hơi giống với câu trả lời của @ dzaima mặc dù nó sẽ có được tới 45 byte.


3

Vanilla RE, 40 ký tự

Không phải là giải pháp ngắn gọn hay thanh lịch nhất nhưng có cấu trúc hình ảnh gần đúng ngữ nghĩa!

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

Nhịp đập Rock Kéo hoặc Thằn lằn
Giấy đập Vulcan hoặc Rock
Kéo đập Thằn lằn hoặc
Thằn lằn giấy Nhịp đập Giấy hoặc Vulcan
Vulcan đập Rock hoặc Kéo


2

POSIX, 35 byte

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

Một cách hoàn toàn khác để "ẩn" đằng sau biểu tượng bắt đầu / kết thúc, vì vậy tôi cảm thấy ổn về điều đó :) Tôi phù hợp để bắt đầu vì "?" sẽ luôn phải đi giữa chữ cái và end / $ nếu được thực hiện theo cách khác.

Ít hơn 10 byte so với giải pháp đầu tiên của tôi và đơn giản về mặt khái niệm là phần thưởng tôi thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.