正则表达式,纸张,剪刀,蜥蜴,Spock


81

热身:正则表达式,纸张,剪刀

这是我最初想要发布的挑战,然后才意识到存在一些非常简短的解决方案。尽管如此,思考以下实际挑战仍可能是一个有趣的问题。

编写三个正则表达式RPS,使它们以循环的Rock,Paper和Scissors方式彼此匹配。特别地,[R匹配小号小号匹配PP相匹配- [R ,但ř 匹配P小号 匹配- [RP不匹配小号。这是一个方便的桌子:

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

RPS对任何其他输入(包括它们自己)执行的操作无关紧要。

在这里,match只是意味着输入的某些(可能为空)子字符串已匹配。匹配不需要覆盖整个输入。

挑战:正则表达式,纸张,剪刀,蜥蜴,Spock

对于这个挑战,您将基于RPS变体Rock,Paper,剪刀,蜥蜴,Spock(由The Big Bang Theory推广)解决上述问题的更严格的版本。在RPSLV中,有五个不同的符号,它们在两个周期内相互跳动:

  • 岩石→剪刀→蜥蜴→纸→麻雀→岩石
  • 岩石→蜥蜴→麻雀→剪刀→纸→岩石

您应该编写五个正则表达式RPSLV,当它们彼此作为输入时,它们模仿该结构。这是对应的表:

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

只是要清楚,你应该匹配的字符串RP等等,但其他的正则表达式。例如,如果您的正则表达式R^\w$,则PV必须匹配字符串^\w$,而SL不应该匹配。

同样,match仅表示输入的至少一个(可能为空)子字符串被匹配。匹配不需要覆盖整个输入。例如,\b(单词边界)匹配hello(在开头和结尾),但是不匹配(^,^)

您可以使用任何正则表达式调味剂,但请在答案中说明选择的范围,并在可能的情况下提供指向所选调味剂的在线测试仪的链接。您可能无法使用任何正则表达式功能来让您以风味的宿主语言(例如Perl风味的e修饰符)调用代码。

/regex/当作为分隔符的输入时,分隔符(如)不包含在正则表达式中,并且您不能使用不在正则表达式之外的修饰符。有些口味仍然允许您使用带有内联语法的修饰符,例如(?s)

您的分数是五个正则表达式的长度总和(以字节为单位)。越低越好。

事实证明,找到一个可行的解决方案比起初看起来要容易得多,但我希望找到最佳解决方案非常棘手。


如果R不匹配P或V的任何子串,R是否必须匹配S的整个正则表达式或S的子串?
Okx

“ @Okx”匹配仅表示输入的至少一个(可能为空)子字符串已匹配。该匹配不需要覆盖整个输入。例如\b(单词边界)匹配hello(在开头和结尾),但是不匹配(^,^)。”
Martin Ender

1
大概正则表达式是否匹配并不重要?
Brilliand

@Brilliand正确。
Martin Ender'7

1
大难题。如果有人感兴趣,我在这里创建了一个交互式版本:shark.fish/rock-paper-scissors
shark.dp 17/07/30

Answers:


45

PCRE .NET,35 32字节

-3个字节感谢Martin Ender

岩石:

([*?]$)

纸:

[)$]$+

剪刀:

[+?]$.*

蜥蜴:

[+$]$.?

Spock:

[*)]$

这里的想法是在其他正则表达式的末尾匹配字符,这些正则表达式是保留的正则表达式字符,但是在字符类内部时不再这样处理。


1
好的,您赢了:P
ETHproductions'Jul

3
偷偷摸摸的使用把事情的经过了EOL“$”被动配合使用时积极使用和可匹配的是成为被忽略
Stilez


40

没有花哨的功能,35 30字节

Neil的想法使用]no 节省了5个字节\

例如,这适用于python re模块。

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

它搜索以]字母开头的字母,该字母表示该规则。

使用的先前版本R='\[[RSL]'

分数为40的较早尝试是使用R='[SL]x|Rx'etc。


1
通过反转所有内容来节省5个字节:R='[LSR]]'
尼尔(Neil)

@Neil,这是一个很大的进步,谢谢!
Christian Sievers

This works with python's re好吧,Python应该应该是标题了
cat

1
@cat我也写了“例如”,整句话只是说我实际尝试过的具体内容。我想我可以像其他人一样说POSIX,但是我认为我的标题是正确的。
Christian Sievers'7

26

PCRE,20 19

岩石

W

^\w

剪刀

^\W

斯波克

w?\x57$

蜥蜴

[w]W?


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个字符必须匹配(空字符串)。因此,模式会折叠为“包含5个字符,后跟目标字母”:这意味着目标的6-9个字符必须包含目标字母(每个字符串中的第5个字符)

更新:现在,下面的35字节版本!


我一直以为V实际上不是V ulcan但代表瓦肯举手礼的形状(这是您使用人打RPSLV时表示斯波克手势)。
Martin Ender

无论如何,欢迎来到PPCG!不错的第一答案。我喜欢与所有现有答案相比,您已经颠倒了逻辑(仅匹配一个字母,并且将击败当前正则表达式的字母放入正则表达式中)。
Martin Ender'7

POSIX是否自动将匹配项锚定到字符串的开头?否则,您不能删除这些逗号吗?
Martin Ender

我认为它的POSIX。可能是perc。但是是的,很好发现!少5个字符!
Stilez

4
无需与Jelly竞争。只需选择一种喜欢的语言并尽情享受即可。:)
Martin Ender

3

PCRE,65个字节

这是一个非常简单的解决方案-一点也不聪明-但我会尝试打高尔夫球。

V:

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

L:

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

S:

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

P:

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

R:

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

本质上,每个正则表达式都以注释的形式带有一个“标识符”,它告诉其他正则表达式是否应该匹配。


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个字节,并且在概念上很简单,这是我喜欢的奖励。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.