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
, P
usw., 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 e
Modifikator 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.
quelle
\b
(Wortgrenze) entsprichthello
(am Anfang und am Ende), aber es passt nicht zusammen(^,^)
. "Antworten:
PCRE.NET,3532 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.
quelle
PCRE,
15 bis14 BytesFels, Felsen:
B
Papier:
\b$
Schere:
b|B.
Eidechse:
\B.
Spock:
^\w
quelle
Q
herumgespielt (eine 14b-Lösung existiert mit Lizard = `\ Q \`, der Rest ist ähnlich wie bei Ihnen), aber ohne Erfolg.Keine ausgefallenen Features,
35 bis30 Bytes5 Bytes gespart von Neils Idee, die dies
]
nicht benötigt\
.Dies funktioniert zum Beispiel mit dem Python-
re
Modul.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.quelle
R='[LSR]]'
usw.This works with python's re
Naja, Python sollte dann wohl der Header seinPCRE,
2019Fels, Felsen
Papier
Schere
Spock
Eidechse
quelle
20 Bytes
quelle
JavaScript, 45 Bytes
Eine andere triviale Lösung.
quelle
POSIX,
5045 BytesKö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!
quelle
PCRE, 65 Bytes
Dies ist eine wirklich triviale Lösung - und überhaupt nicht sehr klug -, aber ich werde versuchen, Golf zu spielen.
V:
L:
S:
P:
R:
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.
quelle
.NET, 50 Bytes
In Ordnung sind sie
R, P, S, L, V
.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.quelle
Vanilla RE, 40 Zeichen
Nicht die prägnanteste oder eleganteste Lösung, aber mit einer ansprechenden quasi-semantischen visuellen Struktur!
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
quelle
POSIX, 35 Bytes
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.
quelle