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 e
pengubah 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.
sumber
\b
(batas kata) cocok denganhello
(di awal dan di akhir), tetapi itu tidak cocok(^,^)
. "Jawaban:
PCRE.NET,3532 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.
sumber
PCRE,
1514 byteBatu:
B
Kertas:
\b$
Gunting:
b|B.
Kadal:
\B.
Spock:
^\w
sumber
Q
(satu solusi 14b ada dengan Lizard = `\ Q \`, maka sisanya mirip dengan Anda) tetapi sama sekali tidak berhasil.tidak ada fitur mewah,
3530 byte5 byte disimpan oleh ide Neil yang menggunakan
]
no\
.Ini berfungsi misalnya dengan
re
modul python .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.sumber
R='[LSR]]'
dll.This works with python's re
yah, Python mungkin harus menjadi tajuk laluPCRE,
2019Batu
Kertas
Gunting
Spock
Kadal
sumber
20 byte
sumber
JavaScript, 45 byte
Solusi sepele lainnya.
sumber
POSIX,
5045 byteBisa 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!
sumber
PCRE, 65 byte
Ini adalah solusi yang sangat sepele - dan tidak terlalu pintar sama sekali - tetapi saya akan mencoba untuk golf itu.
V:
L:
S:
P:
R:
Pada dasarnya, setiap regex memiliki 'pengidentifikasi', dalam bentuk komentar, yang memberi tahu regex lain apakah itu harus cocok atau tidak.
sumber
.NET, 50 byte
Agar mereka
R, P, S, L, V
.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.sumber
Vanilla RE, 40 karakter
Bukan solusi yang paling ringkas atau elegan tetapi memiliki struktur visual semantik semantik yang menyenangkan!
Ketukan batu Gunting atau Kadal
Kertas mengalahkan Vulcan atau
Gunting Batu ketukan Kadal atau Kertas
Kadal mengalahkan Kertas atau
Vulcan ketukan Batu atau Gunting
sumber
POSIX, 35 byte
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.
sumber