Regex, Kağıt, Makas, Kertenkele, Spock


81

Isınma: Regex, Kağıt, Makas

Bu, çok kısa bir çözümün varolduğunu fark etmeden önce asılda göndermek istediğim zorluk. Bununla birlikte, aşağıdaki asıl sorun için hazırlık aşamasında düşünmek ilginç bir problem olabilir.

Üç regex R , P ve S yazıp birbirlerini döngüsel bir Rock, Paper, Scissors tarzında eşleştirecek şekilde yazın. Özellikle, R ' ile eşleşen S , S eşleşen P ve P ile eşleşen R , ancak R' değildir eşleşen P , S değildir eşleşen R ve p eşleşmeyen S . İşte kullanışlı bir masa:

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

R , P ve S'nin kendileri de dahil olmak üzere diğer girdilerde ne yaptığı önemli değildir .

Burada eşleşme , girişin bazı (muhtemelen boş) alt dizgilerinin eşleşmesi anlamına gelir. Eşleşmenin tüm girişi kapsaması gerekmez.

Zorluk: Regex, Kağıt, Makas, Kertenkele, Spock

Bu zorluk için, RPS varyantı Kaya, Kağıt, Makas, Kertenkele, Spock ( The Big Bang Theory tarafından popüler hale getirilen ) temeline dayanarak yukarıdaki sorunun daha sert bir versiyonunu çözeceksiniz . RPSLV'de, iki döngüde birbirini geçen beş farklı sembol vardır:

  • Kaya → Makas → Kertenkele → Kağıt → Spock → Kaya
  • Kaya → Kertenkele → Spock → Makas → Kağıt → Kaya

Birbirlerine girdi olarak verildiğinde bu yapıyı taklit eden beş R , P , S , L ve V regex yazmalısınız . İşte ilgili tablo:

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

Daha açıkçası, sen gerektiğini değil dizeyle eşleşen R, Pvb, ancak diğer regexes. Örneğin eğer regex'iniz R ise ^\w$, P ve V'nin dizeyle eşleşmesi gerekir ^\w$, oysa S ve L'nin yapmaması gerekir.

Yine, eşleşme , girişin en az bir (muhtemelen boş) alt dizesinin eşleştiği anlamına gelir. Eşleşmenin tüm girişi kapsaması gerekmez. Örneğin \b(kelime sınırı) hello(başlangıçta ve sonunda) eşleşir, ancak eşleşmez (^,^).

Herhangi bir regex aroması kullanabilirsiniz, ancak lütfen cevabınızdaki seçimi belirtin ve mümkünse, seçilen lezzet için çevrimiçi bir test cihazına bir bağlantı verin. Flavour'un ana dilinde (Perl flavour'un edeğiştiricisi gibi) kod çağırmanıza izin veren herhangi bir regex özelliği kullanamazsınız .

Sınırlayıcılar (gibi /regex/) diğerine girdi olarak verildiğinde regex'e dahil edilmez ve regex'in dışındaki değiştiricileri kullanamazsınız. Bazı tatlar hala satır içi sözdizimi benzeri değiştiricileri kullanmanızı sağlar (?s).

Puanınız beş regex'in bayt cinsinden uzunluğunun toplamıdır. Alçak daha iyi.

Bu soruna çalışan bir çözüm bulmak için ilk bakışta göründüğünden çok daha basit olduğu ortaya çıkıyor , ancak en uygun çözümü bulmanın oldukça zor olduğunu umuyorum.


Yani, R, P veya V'nin herhangi bir alt dizisiyle eşleşmemesi koşuluyla, S'nin tüm düzenine veya S'nin bir alt dizisine uymak zorunda mıdır?
Okx

@Okx "eşleşmesi, girişin en az bir (muhtemelen boş) alt dizesinin eşleştiği anlamına gelir. Eşleşmenin tüm girişi içermesi gerekmez. Örneğin \b(sözcük sınırı) eşleşmeler hello(başlangıçta ve sonunda), ancak eşleşmiyor (^,^). "
Martin Ender

1
Muhtemelen bir regex'in kendisiyle uyuşup uyuşmaması önemli değil mi?
Brilliand

@Brilliand Doğru.
Martin Ender

1
Harika bir bulmaca. Kimse ilgileniyorsa, burada etkileşimli bir sürüm oluşturdum: shark.fish/rock-paper-scissors
shark.dp

Yanıtlar:


45

PCRE .NET, 35 32 bayt

Martin Ender sayesinde -3 bayt

Kaya:

([*?]$)

Kağıt:

[)$]$+

Makas:

[+?]$.*

Kertenkele:

[+$]$.?

Spock:

[*)]$

Buradaki fikir, regex karakterleri ayrılmış diğer regex'lerin sonundaki karakterlerle eşleşmek, ancak bir karakter sınıfının içindeyken böyle davranılmasını durdurmaktır.


1
Tamam, sen kazandın: P
ETHproductions

3
EOL "$" dan sonra aktif olarak kullanıldığında ve pasif olarak kullanıldığında
uyuşmaz

44

PCRE, 15 14 bayt

Kaya:
B

Kağıt:
\b$

Makas:
b|B.

Kertenkele:
\B.

Spock:
^\w


4
Çok etkileyici.
Eric Duminil,

Yenilmez! Rock = Q(14b bir çözüm Lizard = `\ Q \`, sonra sizinkiler ile benzer) var ama kesinlikle boşuna.
jaytea

40

Fantezi özellik yok, 35 30 bayt

Neil'in buna ]ihtiyacı olmayan düşüncesiyle kaydedilen 5 bayt \.

Bu, örneğin python remodülüyle çalışır.

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

]Öncesinde hangi kuralın olduğunu belirten bir harf arar .

Önceki sürüm kullanılmış R='\[[RSL]'vs.

Skor 40 ile daha erken bir girişim R='[SL]x|Rx'vb kullanıyordu .


1
Her şeyi tersine çevirerek 5 bayt kazanın: R='[LSR]]'vb.
Neil

@Neil Bu harika bir gelişme, teşekkürler!
Christian Sievers

This works with python's rePeki, Python muhtemelen o zaman başlık olmalı
kedi

1
@ Cat da "örneğin" yazdım, bütün cümle sadece gerçekten denediğim somut bir şeyi söylemek. Sanırım bazılarının yaptığı gibi POSIX’i söyleyebilirim ama başlığımın doğru olduğunu düşünüyorum.
Christian Sievers

26

PCRE, 20 19

Kaya

W

kâğıt

^\w

Makas

^\W

Spock

w?\x57$

Kertenkele

[w]W?


8

JavaScript, 45 bayt

Başka bir önemsiz çözüm.

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

Oh, cevabımın sizin daha uzun / benzer bir versiyonu olduğunu fark ettim, silmemi ister misiniz?
TheLethalCoder

4
@TheLethalCoder Şu anda tüm cevaplar birbirlerinin daha uzun / daha kısa versiyonları: p
dzaima

1
Sanırım haha ​​...
TheLethalCoder

5

POSIX, 50 45 bayt

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

Daha kısa yapılabilir ancak ($ ​​'dan sonra gelen karşılaşmaları gizle) numarası kullanıldı, bu yüzden başka bir yol arıyorum

Eşleştirilirken her dizenin ilk 5 karakteri göz ardı edilir. Böylece etkili hedef dizgisi sadece X? Y? 'Yı basitleştirir. Hiçbirinde çift harf yok çünkü "?" sıradan bir karakter olduğu için, regex olarak kullanıldığında son 4 karakterin eşleşmesi gerekir (null). Böylece, kalıplar "aşağıya doğru hedeflenen 5 karakterden sonra 5 karakter içerir" e düşer: yani hedefin 6-9 karakterleri hedef harfi içermelidir (her dizede 5. karakter)

Güncelleme: Şimdi 35 byte sürümü!


Her zaman V'nin gerçekte V ulcan için olmadığını ama Vulcan selamının şeklini temsil ettiğini düşündüm (bu, şahsen RPSLV oynatırken Spock'u temsil etmek için kullandığınız el hareketidir).
Martin Ender

Neyse, PPCG'ye hoş geldiniz! Güzel ilk cevap. Mevcut tüm cevaplara kıyasla mantığı tersine çevirmekten hoşlanıyorum (yalnızca bir harfle eşleşerek mevcut regex'i geçen harfleri regex'e koyma).
Martin Ender

POSIX eşleşmeyi dizenin başlangıcına otomatik olarak bağlar mı? Yoksa o virgülleri bırakamaz mısın?
Martin Ender

POSIX olduğunu düşünüyorum. Yüzde olabilir. Ama evet, güzel lekeli! 5 karakter daha az!
Stilez

4
Jelly ile rekabet etmeye gerek yok. İstediğiniz dili seçin ve eğlenin. :)
Martin Ender

3

PCRE, 65 bayt

Bu gerçekten önemsiz bir çözüm - ve hiç de zekice değil - ama ben golf oynamaya çalışacağım.

V:

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

L:

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

S:

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

P:

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

R:

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

Temel olarak, her bir regex'in yorum şeklinde, diğer regex'lere eşleşip eşleşmemesi gerektiğini söyleyen bir 'tanımlayıcısı' vardır.


3

.NET, 50 bayt

Sırayla onlar R, P, S, L, V.

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

[^R]Diğer ifadelerin her birinde tanımlayıcı grubu (örneğin ) arayarak çalışır .

İfadeleri ^R|\^[SL]ya da benzerlerini değiştirmek işe yarayacak gibi görünüyor ama sonra @ dzaima'nın cevabına biraz fazla benzese de 45 byte alabiliyor.


3

Vanilya RE, 40 karakter

En özlü ya da zarif çözüm değil, hoş bir yarı-anlamsal görsel yapıya sahip!

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

Kaya Makası yener veya Kertenkele
Kağıt yener Vulkan veya Taş
Makası
Kertenkele yener veya Kağıt Kertenkele yener Kağıt veya Vulkan
Vulcan Kaya veya Makas yener


2

POSIX, 35 bayt

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

Bir başlangıç ​​/ bitiş sembolünün arkasına "gizlenmenin" tamamen farklı bir yolu, bu yüzden kendimi iyi hissediyorum :) Başlamak için eşleştiriyorum çünkü "?" Aksi takdirde, her zaman harf ile bitiş / $ arasında gitmek zorunda kalacaktı.

1. çözümümden 10 bayt daha az ve kavramsal olarak basit, bu da sevdiğim bir bonus.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.