Regex, Kertas, Gunting, Kadal, Spock

81

Pemanasan: Regex, Kertas, Gunting

Ini adalah tantangan yang awalnya ingin saya posting, sebelum menyadari bahwa ada solusi yang sangat singkat. Namun demikian, ini bisa menjadi masalah yang menarik untuk dipikirkan dalam persiapan untuk tantangan aktual di bawah ini.

Tulis tiga regex R , P dan S sedemikian rupa sehingga mereka cocok satu sama lain dalam Rock cyclic, Paper, Scissors. Secara khusus, R pertandingan S , S cocok P dan P pertandingan R , tapi R tidak cocok P , S tidak sesuai R dan P tidak cocok S . Ini tabel praktis:

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

Tidak masalah apa yang dilakukan R , P dan S pada input lain, termasuk diri mereka sendiri.

Di sini, kecocokan hanya berarti bahwa beberapa (mungkin kosong) dari input tersebut cocok. Pertandingan tidak perlu mencakup seluruh input.

Tantangannya: Regex, Kertas, Gunting, Kadal, Spock

Untuk tantangan ini, Anda akan menyelesaikan versi yang lebih sulit dari masalah di atas, berdasarkan varian RPS Rock, Paper, Scissors, Lizard, Spock (seperti yang dipopulerkan oleh The Big Bang Theory ). Dalam RPSLV, ada lima simbol yang berbeda, yang saling mengalahkan dalam dua siklus:

  • Rock → Gunting → Kadal → Kertas → Spock → Rock
  • Rock → Kadal → Spock → Gunting → Kertas → Rock

Anda harus menulis lima regex R , P , S , L dan V yang meniru struktur ini ketika diberikan satu sama lain sebagai input. Berikut adalah tabel terkait:

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

Hanya untuk menjadi jelas, Anda harus tidak cocok string R, P, dll, tetapi regexes lainnya. Misalnya jika regex Anda R adalah ^\w$misalnya, maka P dan V harus sesuai string ^\w$, sedangkan S dan L tidak seharusnya.

Sekali lagi, kecocokan hanya berarti bahwa setidaknya satu substring (mungkin kosong) dari input cocok. Pertandingan tidak perlu mencakup seluruh input. Misalnya \b(batas kata) cocok hello(di awal dan di akhir), tetapi tidak cocok (^,^).

Anda dapat menggunakan rasa regex, tetapi sebutkan pilihan dalam jawaban Anda dan, jika mungkin, berikan tautan ke penguji online untuk rasa yang dipilih. Anda tidak boleh menggunakan fitur regex apa pun yang memungkinkan Anda menjalankan kode dalam bahasa host flavour (seperti epengubah Perl flavour ).

Pembatas (seperti /regex/) tidak termasuk dalam regex ketika diberikan sebagai input ke yang lain, dan Anda tidak dapat menggunakan pengubah yang berada di luar regex. Beberapa rasa masih memungkinkan Anda menggunakan pengubah dengan sintaks sebaris seperti (?s).

Skor Anda adalah jumlah dari panjang lima regex dalam byte. Lebih rendah lebih baik.

Ternyata menjadi jauh lebih sederhana untuk menemukan sebuah solusi kerja untuk masalah ini daripada mungkin tampak pada awalnya, tapi saya berharap bahwa menemukan solusi optimal cukup rumit.

Martin Ender
sumber
Apakah, katakanlah, R harus cocok dengan seluruh regex S atau substring S, asalkan tidak cocok dengan substring P atau V?
Okx
@Okx "kecocokan hanya berarti bahwa setidaknya satu substring dari input mungkin cocok. Pertandingan tidak perlu mencakup seluruh input. Misalnya \b(batas kata) cocok dengan hello(di awal dan di akhir), tetapi itu tidak cocok (^,^). "
Martin Ender
1
Mungkin tidak masalah jika sebuah regex cocok dengan dirinya sendiri?
Brilliand
@Brilliand Benar.
Martin Ender
1
Teka-teki yang bagus. Saya telah membuat versi interaktif di sini, jika ada yang tertarik: shark.fish/rock-paper-scissors
shark.dp

Jawaban:

45

PCRE .NET, 35 32 byte

-3 byte terima kasih kepada Martin Ender

Batu:

([*?]$)

Kertas:

[)$]$+

Gunting:

[+?]$.*

Kadal:

[+$]$.?

Spock:

[*)]$

Idenya di sini adalah untuk mencocokkan karakter di akhir regex lain yang merupakan karakter regex yang dicadangkan, tetapi berhenti diperlakukan seperti itu ketika berada di dalam kelas karakter.

Kucing Bisnis
sumber
1
Oke, Anda menang: P
ETHproduk
3
Penggunaan licik dari meletakkan segala sesuatu setelah EOL "$" yang menjadi diabaikan ketika digunakan secara aktif dan cocok ketika digunakan secara pasif
Stilez
44

PCRE, 15 14 byte

Batu:
B

Kertas:
\b$

Gunting:
b|B.

Kadal:
\B.

Spock:
^\w

Anders Kaseorg
sumber
4
Sangat mengesankan.
Eric Duminil
Tak terkalahkan! Saya telah mengutak-atik Rock = Q(satu solusi 14b ada dengan Lizard = `\ Q \`, maka sisanya mirip dengan Anda) tetapi sama sekali tidak berhasil.
jaytea
40

tidak ada fitur mewah, 35 30 byte

5 byte disimpan oleh ide Neil yang menggunakan ]no \.

Ini berfungsi misalnya dengan remodul python .

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

Ini mencari ]diawali dengan surat yang menunjukkan aturan mana itu.

Versi sebelumnya digunakan R='\[[RSL]'dll.

Upaya sebelumnya dengan skor 40 menggunakan R='[SL]x|Rx'dll.

Sievers Kristen
sumber
1
Simpan 5 byte dengan membalikkan semuanya: R='[LSR]]'dll.
Neil
@Neil Itu peningkatan yang bagus, terima kasih!
Christian Sievers
This works with python's reyah, Python mungkin harus menjadi tajuk lalu
cat
1
@cat Saya juga menulis "misalnya", seluruh kalimat hanya untuk mengatakan sesuatu yang konkret yang saya benar-benar coba. Saya kira saya bisa mengatakan POSIX seperti yang dilakukan beberapa orang lain, tetapi saya pikir header saya cukup benar.
Christian Sievers
26

PCRE, 20 19

Batu

W

Kertas

^\w

Gunting

^\W

Spock

w?\x57$

Kadal

[w]W?
TwiNight
sumber
21

20 byte

R = 'R|VP'
L = 'L|RS'
V = 'V|LP'
S = 'S|RV'
P = 'P|LS'
emulbreh
sumber
Oh wow, ini bisa sangat mudah!
Christian Sievers
Itu indah.
Eric Duminil
8

JavaScript, 45 byte

Solusi sepele lainnya.

R:
^R|^.[SL]
P:
^P|^.[RV]
S:
^S|^.[PL]
L:
^L|^.[PV]
V:
^V|^.[SR]
dzaima
sumber
Oh baru sadar jawaban saya adalah versi Anda yang lebih panjang / serupa, ingin saya menghapusnya?
TheLethalCoder
4
@TheLethalCoder Semua jawaban saat ini hanya versi yang lebih panjang / lebih pendek dari satu sama lain: p
dzaima
1
Saya kira 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?

Bisa dilakukan lebih pendek tetapi trik (sembunyikan pertandingan setelah $) digunakan, jadi saya mencari cara lain

5 karakter pertama dari setiap string diabaikan saat cocok. Jadi string target yang efektif disederhanakan menjadi hanya X? Y ?. Tak satu pun dari mereka yang memiliki huruf ganda karena "?" adalah char biasa, jadi 4 karakter terakhir saat digunakan sebagai regex harus cocok (string nol). Jadi pola-pola tersebut runtuh ke "berisi 5 karakter diikuti oleh surat target": artinya karakter 6-9 dari target harus berisi huruf target (karakter ke-5 di setiap string)

Perbarui: versi 35 byte di bawah, sekarang!

Stilez
sumber
Saya selalu berpikir V sebenarnya bukan untuk V ulcan tetapi untuk mewakili bentuk salut Vulcan (yang merupakan isyarat tangan yang Anda gunakan untuk mewakili Spock saat memainkan RPSLV secara langsung).
Martin Ender
Bagaimanapun, selamat datang di PPCG! Jawaban pertama yang bagus. Saya suka bahwa Anda telah membalikkan logika dibandingkan dengan semua jawaban yang ada (hanya mencocokkan satu huruf dan meletakkan huruf-huruf yang mengalahkan regex saat ini ke dalam regex).
Martin Ender
Apakah POSIX secara otomatis mengaitkan kecocokan ke awal string? Jika tidak, tidak bisakah Anda menjatuhkan koma itu?
Martin Ender
Saya pikir itu POSIX. Bisa jadi perc. Tapi ya, terlihat jelas! 5 karakter lebih sedikit!
Stilez
4
Tidak perlu bersaing dengan Jelly. Pilih saja bahasa yang Anda sukai dan nikmati sendiri. :)
Martin Ender
3

PCRE, 65 byte

Ini adalah solusi yang sangat sepele - dan tidak terlalu pintar sama sekali - tetapi saya akan mencoba untuk golf itu.

V:

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

L:

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

S:

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

P:

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

R:

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

Pada dasarnya, setiap regex memiliki 'pengidentifikasi', dalam bentuk komentar, yang memberi tahu regex lain apakah itu harus cocok atau tidak.

Okx
sumber
3

.NET, 50 byte

Agar mereka R, P, S, L, V.

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

Bekerja dengan mencari grup pengidentifikasi (misalnya, [^R]) di masing-masing ekspresi lainnya.

Mengubah ekspresi ke ^R|\^[SL], atau serupa, tampaknya berhasil tetapi kemudian itu agak terlalu mirip dengan jawaban @ dzaima meskipun akan membuatnya menjadi 45 byte.

TheLethalCoder
sumber
3

Vanilla RE, 40 karakter

Bukan solusi yang paling ringkas atau elegan tetapi memiliki struktur visual semantik semantik yang menyenangkan!

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

Ketukan batu Gunting atau Kadal
Kertas mengalahkan Vulcan atau
Gunting Batu ketukan Kadal atau Kertas
Kadal mengalahkan Kertas atau
Vulcan ketukan Batu atau Gunting

Chris D'Amato
sumber
2

POSIX, 35 byte

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

Cara yang sama sekali berbeda untuk "bersembunyi" di balik simbol awal / akhir, jadi saya merasa oke tentang itu :) Saya cocok untuk memulai karena "?" harus selalu pergi antara huruf dan akhir / $ jika dilakukan dengan cara lain.

10 byte kurang dari solusi pertama saya, dan secara konsep sederhana yang merupakan bonus yang saya suka.

Stilez
sumber