Regex, Papier, Schere, Eidechse, Spock


81

Aufwärmen: Regex, Papier, Schere

Dies ist die Herausforderung, die ich ursprünglich veröffentlichen wollte, bevor mir klar wurde, dass es eine sehr kurze Lösung gibt. Dennoch kann es ein interessantes Problem sein, sich auf die unten stehende Herausforderung vorzubereiten.

Schreiben Sie drei reguläre Ausdrücke R , P und S so, dass sie zyklisch nach Art von Rock, Paper, Scissors zusammenpassen. Insbesondere stimmt R mit S überein , S stimmt mit P überein und P stimmt mit R überein , aber R stimmt nicht mit P überein , S stimmt nicht mit R überein und P stimmt nicht mit S überein . Hier ist ein praktischer Tisch:

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

Es spielt keine Rolle, was R , P und S an anderen Eingängen tun, auch nicht an sich.

Übereinstimmung bedeutet hier nur, dass ein (möglicherweise leerer) Teilstring der Eingabe übereinstimmt. Das Match muss nicht den gesamten Input abdecken.

Die Herausforderung: Regex, Papier, Schere, Eidechse, Spock

Für diese Herausforderung lösen Sie eine härtere Version des obigen Problems, die auf der RPS-Variante Rock, Paper, Scissors, Lizard, Spock (bekannt durch The Big Bang Theory ) basiert . In RPSLV gibt es fünf verschiedene Symbole, die sich in zwei Zyklen schlagen:

  • Rock → Schere → Eidechse → Papier → Spock → Rock
  • Rock → Eidechse → Spock → Schere → Papier → Rock

Sie sollten fünf reguläre Ausdrücke R , P , S , L und V schreiben , die diese Struktur imitieren, wenn sie einander als Eingabe gegeben werden. Hier ist die entsprechende Tabelle:

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

Nur klar zu sein, sollten Sie nicht mit der Zeichenfolge übereinstimmen R, Pusw., aber die anderen Regexes. Wenn zum Beispiel Ihre Regex R ist ^\w$, müssen P und V mit der Zeichenfolge übereinstimmen ^\w$, während S und L nicht übereinstimmen sollten.

Auch hier bedeutet Übereinstimmung nur, dass mindestens eine (möglicherweise leere) Teilzeichenfolge der Eingabe übereinstimmt. Das Match muss nicht den gesamten Input abdecken. Zum Beispiel \b(Wortgrenze) stimmt überein hello(am Anfang und am Ende), aber es stimmt nicht überein (^,^).

Sie können einen beliebigen Regex-Geschmack verwenden, geben Sie jedoch in Ihrer Antwort die Auswahl an und stellen Sie, wenn möglich, einen Link zu einem Online-Tester für den ausgewählten Geschmack bereit. Sie dürfen keine regulären Ausdrücke verwenden, mit denen Sie Code in der Hostsprache des Geschmacks aufrufen können (wie der eModifikator des Perl-Geschmacks ).

Trennzeichen (wie /regex/) sind nicht im regulären Ausdruck enthalten, wenn sie als Eingabe für einen anderen eingegeben werden, und Sie können keine Modifikatoren verwenden, die sich außerhalb des regulären Ausdrucks befinden. In einigen Varianten können Sie weiterhin Modifikatoren mit Inline-Syntax wie verwenden (?s).

Ihre Punktzahl ist die Summe der Längen der fünf regulären Ausdrücke in Bytes. Weniger ist besser.

Es stellt sich heraus, dass es viel einfacher ist, eine funktionierende Lösung für dieses Problem zu finden, als es zunächst scheinen mag, aber ich hoffe, dass es ziemlich schwierig ist, eine optimale Lösung zu finden.


Muss R beispielsweise mit dem gesamten regulären Ausdruck von S oder einem Teilstring von S übereinstimmen, vorausgesetzt, es stimmt nicht mit einem Teilstring von P oder V überein?
Okx

"@Okx" bedeutet nur, dass mindestens eine (möglicherweise leere) Teilzeichenfolge der Eingabe übereinstimmt. Die Übereinstimmung muss nicht die gesamte Eingabe abdecken. Zum Beispiel \b(Wortgrenze) entspricht hello(am Anfang und am Ende), aber es passt nicht zusammen (^,^). "
Martin Ender

1
Vermutlich spielt es keine Rolle, ob ein Regex mit sich selbst übereinstimmt?
Brilliand

@Brilliand Richtig.
Martin Ender

1
Tolles Puzzle. Ich habe hier eine interaktive Version erstellt, falls jemand interessiert ist: shark.fish/rock-paper-scissors
shark.dp

Antworten:


45

PCRE .NET, 35 32 Bytes

-3 Bytes dank Martin Ender

Fels, Felsen:

([*?]$)

Papier:

[)$]$+

Schere:

[+?]$.*

Eidechse:

[+$]$.?

Spock:

[*)]$

Die Idee dabei ist, Zeichen am Ende anderer regulärer Ausdrücke abzugleichen, bei denen es sich um reservierte reguläre Ausdrücke handelt, die jedoch innerhalb einer Zeichenklasse nicht mehr als solche behandelt werden.


1
Okay, du
gewinnst

3
Sneaky Verwendung von Put-Dingen nach dem EOL "$", die ignoriert werden, wenn sie aktiv verwendet werden und bei passiver Verwendung
übereinstimmen

44

PCRE, 15 bis 14 Bytes

Fels, Felsen:
B

Papier:
\b$

Schere:
b|B.

Eidechse:
\B.

Spock:
^\w


4
Sehr beeindruckend.
Eric Duminil

Unschlagbar! Ich habe mit Rock = Qherumgespielt (eine 14b-Lösung existiert mit Lizard = `\ Q \`, der Rest ist ähnlich wie bei Ihnen), aber ohne Erfolg.
Jaytea

40

Keine ausgefallenen Features, 35 bis 30 Bytes

5 Bytes gespart von Neils Idee, die dies ]nicht benötigt \.

Dies funktioniert zum Beispiel mit dem Python- reModul.

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

Es wird nach einem ]vorangestellten Buchstaben gesucht, der angibt, um welche Regel es sich handelt.

Vorgängerversion verwendet R='\[[RSL]'etc.

Ein früherer Versuch mit Punktzahl 40 war die Verwendung von R='[SL]x|Rx'usw.


1
Speichern Sie 5 Bytes, indem Sie alles umkehren: R='[LSR]]'usw.
Neil

@Neil Das ist eine tolle Verbesserung, danke!
Christian Sievers

This works with python's reNaja, Python sollte dann wohl der Header sein
Katze

1
@cat Ich habe auch "zum Beispiel" geschrieben, der ganze Satz soll nur etwas Konkretes sagen, das ich tatsächlich ausprobiert habe. Ich denke, ich könnte POSIX sagen, wie es einige andere taten, aber ich denke, mein Header ist ganz richtig.
Christian Sievers

26

PCRE, 20 19

Fels, Felsen

W

Papier

^\w

Schere

^\W

Spock

w?\x57$

Eidechse

[w]W?


8

JavaScript, 45 Bytes

Eine andere triviale Lösung.

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

Oh, ich habe gerade festgestellt, dass meine Antwort eine längere / ähnliche Version von Ihnen ist. Möchten Sie, dass ich sie lösche?
TheLethalCoder

4
@TheLethalCoder Alle Antworten sind derzeit nur längere / kürzere Versionen voneinander: p
dzaima

1
Ich nehme an, haha ​​...
TheLethalCoder

5

POSIX, 50 45 Bytes

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

Könnte kürzer gemacht werden, aber der Trick (Streichhölzer nach $ verstecken) wurde verwendet, also suche ich nach einem anderen Weg

Die ersten 5 Zeichen jeder Zeichenfolge werden beim Abgleichen ignoriert. Die effektive Zielzeichenfolge vereinfacht sich also auf nur X? Y ?. Keiner von ihnen hat irgendwelche Doppelbuchstaben, weil "?" ist ein gewöhnliches Zeichen, daher müssen die letzten 4 Zeichen, wenn sie als regulärer Ausdruck verwendet werden, übereinstimmen (Null-Zeichenfolge). Das Muster reduziert sich also auf "enthält 5 Zeichen, gefolgt vom Zielbuchstaben": Dies bedeutet, dass die Zeichen 6 bis 9 des Ziels den Zielbuchstaben enthalten müssen (das 5. Zeichen in jeder Zeichenfolge).

Update: 35-Byte-Version unten, jetzt!


Ich dachte immer, das V ist eigentlich nicht für V ulcan, sondern für die Form des vulkanischen Grußes (die Handbewegung, mit der Sie Spock darstellen, wenn Sie RPSLV persönlich spielen).
Martin Ender

Wie auch immer, willkommen bei PPCG! Schöne erste Antwort. Ich mag, dass Sie die Logik im Vergleich zu allen vorhandenen Antworten umgekehrt haben (nur einen Buchstaben finden und die Buchstaben, die den aktuellen Regex schlagen, in den Regex setzen).
Martin Ender

Verankert POSIX die Übereinstimmung automatisch am Anfang der Zeichenfolge? Könnten Sie diese Kommas sonst nicht fallen lassen?
Martin Ender

Ich denke, es ist POSIX. Könnte perc sein. Aber ja, schön gesehen! 5 Zeichen weniger!
Stilez

4
Es ist nicht nötig, mit Jelly zu konkurrieren. Wählen Sie einfach eine Sprache, die Sie mögen und amüsieren Sie sich. :)
Martin Ender

3

PCRE, 65 Bytes

Dies ist eine wirklich triviale Lösung - und überhaupt nicht sehr klug -, aber ich werde versuchen, Golf zu spielen.

V:

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

L:

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

S:

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

P:

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

R:

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

Im Wesentlichen hat jeder reguläre Ausdruck einen Bezeichner in Form eines Kommentars, der den anderen regulären Ausdrücken mitteilt, ob eine Übereinstimmung erzielt werden soll oder nicht.


3

.NET, 50 Bytes

In Ordnung sind sie R, P, S, L, V.

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

Sucht [^R]in jedem der anderen Ausdrücke nach der Bezeichnergruppe (z. B. ).

Das Ändern der Ausdrücke auf ^R|\^[SL]oder ähnlich scheint zu funktionieren, ist dann aber der Antwort von @ dzaima ein bisschen zu ähnlich, obwohl es auf 45 Byte kommen würde.


3

Vanilla RE, 40 Zeichen

Nicht die prägnanteste oder eleganteste Lösung, aber mit einer ansprechenden quasi-semantischen visuellen Struktur!

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

Rock schlägt Schere oder Lizard
Papier schlägt Vulcan oder Rock
Schere schlägt Lizard oder Papier
Eidechse schlägt Papier oder Vulcan
Vulcan schlägt Rock oder Schere


2

POSIX, 35 Bytes

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

Eine ganz andere Art, sich hinter einem Start- / Endesymbol zu "verstecken", damit ich mich damit einverstanden fühle :) Ich stimme zu, weil "?" würde immer zwischen Buchstabe und Ende / $ wechseln müssen, wenn es anders gemacht würde.

10 Bytes weniger als meine erste Lösung und konzeptionell einfach, was ein Bonus ist, den ich mag.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.