Das Problem
Ich habe einige reguläre Ausdrücke, die ich in einem Code verwenden muss, aber ich verwende eine Programmiersprache, die Regex nicht unterstützt! Zum Glück weiß ich, dass der Teststring eine maximale Länge hat und nur aus druckbarem ASCII besteht.
Die Herausforderung
Sie müssen einen regulären Ausdruck und eine Zahl eingeben und n
jede Zeichenfolge ausgeben, die aus druckbarem ASCII (einschließlich ASCII-Codes 32 bis 126, bis
~
, ohne Tabulatoren oder Zeilenumbrüche) besteht und deren Länge der des regulären Ausdrucks entspricht oder n
dieser entspricht. Sie dürfen in Ihrem Code überhaupt keine integrierten regulären Ausdrücke oder Regex-Abgleichsfunktionen verwenden. Reguläre Ausdrücke sind auf Folgendes beschränkt:
- Literalzeichen (und Escapes, die ein Zeichen zum Literal machen, also
\.
ein Literal.
,\n
ist ein Literaln
(entspricht nurn
) und\w
entsprichtw
. Escape-Sequenzen müssen nicht unterstützt werden.) .
- Platzhalter (beliebiges Zeichen)- Zeichenklassen
[abc]
bedeuten "a oder b oder c" und[d-f]
bedeuten alles von d bis f (so, d oder e oder f). Die einzigen Zeichen, die in einer Zeichenklasse eine besondere Bedeutung haben, sind[
und]
(die immer ausgeblendet werden, machen Sie sich also keine Sorgen)\
(natürlich das Escape-Zeichen)^
am Anfang der Zeichenklasse (was eine Negation ist) ), und-
(das ist ein Bereich). |
- der OP-Operator, Wechsel.foo|bar
bedeutet entwederfoo
oderbar
, und(ab|cd)e
entspricht entwederabe
odercde
.*
- den vorherigen Token null oder mehrmals abgleichen, gierig (es wird versucht, so oft wie möglich zu wiederholen)+
- ein oder mehrmals wiederholt, gierig?
- Null oder einmal- Gruppierung mit Klammern gruppieren Token für
|
,*
.+
, oder?
Der reguläre Ausdruck für die Eingabe ist immer gültig (dh Sie müssen keine Eingaben wie ?abc
oder (foo
oder ungültige Eingaben verarbeiten). Sie können die Zeichenfolgen in beliebiger Reihenfolge ausgeben, aber jede Zeichenfolge darf nur einmal vorkommen (keine Duplikate ausgeben).
Die Testfälle
Input: .*
, 1
Output: (leere Zeichenkette), ,
!
, "
, ..., }
,~
Input: w\w+
, 3
Output: ww
,www
Input: [abx-z][^ -}][\\]
, 3
Output: a~\
, b~\
, x~\
, y~\
,z~\
Input: ab*a|c[de]*
, 3
Output: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
Input: (foo)+(bar)?!?
, 6
Output: foo
, foo!
, foofoo
,foobar
Input: (a+|b*c)d
, 4
Output: ad
, cd
, aad
, bcd
, aaad
,bbcd
Input: p+cg
, 4
Output: pcg
,ppcg
Input: a{3}
, 4
Output:a{3}
Der Gewinner
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
|
macht sehr wenig Sinn. Es scheint verschachtelte Gruppen oder nicht zu behandeln a|b|c
. Was ist falsch an der Verwendung der Standarderklärungen in Bezug auf die Bindungsstärke von Verkettung und Abwechslung? (Und Sie haben keine Entschuldigung dafür, den Sandkasten nicht zu benutzen)