Implementieren Sie eine Funktion aus Muster und Zeichenfolge, die abgeglichen werden soll, und geben Sie true zurück, wenn das Muster mit der GANZEN Zeichenfolge übereinstimmt, andernfalls false.
Unsere Glob-Pattern-Syntax lautet:
?
Stimmt mit einem beliebigen Zeichen überein+
Stimmt mit einem oder mehreren Zeichen überein*
Stimmt mit keinem oder mehreren Zeichen überein\
entkommt
Regeln:
- Keine Auswertung, kein Konvertieren in regulären Ausdruck, kein Aufrufen einer System-Glob-Funktion.
- E / A sind nicht erforderlich: Sie können einfach eine Funktion schreiben
- Kürzeste Siege
Beispiele:
glob('abc', 'abc') => true
glob('abc', 'abcdef') => false IMPORTANT!
glob('a??', 'aww') => true
glob('a*b', 'ab') => true
glob('a*b', 'agwijgwbgioeb') => true
glob('a*?', 'a') => false
glob('?*', 'def') => true
glob('5+', '5ggggg') => true
glob('+', '') => false
glob('a\*b', 'a*b') => true
Hier ist ein Tipp für den Einstieg: http://en.wikipedia.org/wiki/Backtracking
code-golf
interpreter
regular-expression
Ming-Tang
quelle
quelle
Antworten:
Golfscript - 82 Zeichen
Angenommen, die Zeichenfolgen enthalten keine Zeilenumbrüche. Gibt ein leeres Array für false und ein nicht leeres Array für true zurück (in Übereinstimmung mit der Golfscript-Definition von true / false).
Dies ist eine nicht-rekursive Lösung (außer für aufeinanderfolgende
*
s), bei der eine Liste der Positionen in der Musterzeichenfolgei
so geführt wird, dass siepattern[0..i]
übereinstimmenstring[0..cur]
.Dies kann sehr lange dauern. Sie können hinzufügen ,
.&
nachdem:C%
dies zu verhindern.quelle
Haskell, 141 Zeichen
Funktioniert für alle Eingaben, sowohl für Muster als auch für Zeichenfolgen. Behandelt den nachgestellten Backslash im Muster als wörtliche Übereinstimmung (Verhalten wurde nicht angegeben.)
Dies kann mit dem folgenden Testtreiber ausgeführt werden:
Update: Ich habe einen Blog-Beitrag über diese spezielle Antwort geschrieben, da ich denke, dass dies gut zeigt, wie einfach Haskell das Problem codiert.
d
undm
mit Operatorenr
inc
+
Fall%
, die von behandelt wurde&
quelle
PHP -
275243 ZeichenUngolfed:
quelle
Übermäßig ausführliches Python (
384367 Zeichen)Es ist nicht die kürzeste, aber es ist schön und funktional. Das Dispatch-Dict-Ding in der Mitte könnte vermutlich als Disjunktion über Typendinge umgeschrieben werden
(h(p) == '?') and (? lambda body)
. Das Definieren dieses h-Operators kostet mich einige Zeichen, aber es ist schön, ein Schlüsselwort für head zu haben.Wenn es die Zeit erlaubt, würde ich es gerne später mal ausprobieren.
edit: unnötige dritte Verzweigung in '*' entfernt, nachdem die Ruby-Antwort von user300 gelesen wurde
quelle
Kürzere Snappier Python 2.6 (272 Zeichen)
Golf gespielt:
ungolfed:
mit:
Wir danken der Antwort von user300 für die Veranschaulichung der Vereinfachung, wenn Sie einen Abschlusswert erhalten, wenn Sie den Kopf aus einer leeren Zeichenfolge entfernen.
Ich wünschte, das Auspacken von Kopf und Schwanz könnte inline während der Erklärung der Argumente von m erfolgen. dann könnte m ein lambda sein, genau wie seine freunde n und glob. python2 kann das nicht, und nach einigem Lesen sieht es so aus, als könnte python3 das auch nicht. Weh.
testen:
quelle
Ruby -
199171Ungolfed:
Tests:
Inspiriert von der Antwort von Roobs
quelle
lambda s : list(s)+[None]
??
sind das wörtliche Zeichen,=>
sind Schlüssel / Wert-Trennzeichen in Ruby Hashes und->
starten ein Lambda :-) ({ ?? => ->{...} }
ist ein Hash mit Schlüssel"?"
und einem Lambda als Wert.) Aber ja, die Art und Weise, wie es zusammen verwendet wird, sieht aus wie Musterübereinstimmung bei einzelnen Zeichen :-)C-Funktion - 178 notwendige Zeichen
Mit GCC kompiliert, erzeugt dies keine Warnungen.
Die erste und letzte Zeile sind nicht in der Zeichenanzahl enthalten. Sie werden nur zur Vereinfachung bereitgestellt.
In die Luft gesprengt:
quelle
JavaScript - 259 Zeichen
Meine Implementierung ist sehr rekursiv, sodass der Stapel überläuft, wenn ein extrem langes Muster verwendet wird. Ohne das Pluszeichen (das ich hätte optimieren können, aber der Einfachheit halber nicht verwenden können), wird für jedes Token eine Rekursionsebene verwendet.
Die Funktion gibt manchmal eine Zahl anstelle eines Booleschen Werts zurück. Wenn das ein Problem ist, können Sie es als verwenden
!!glob(pattern, str)
.Ungolfed (eher unbegrenzt) als nützliche Ressource:
Beachten Sie, dass die Indizierung in Zeichen einer Zeichenfolge wie bei Array-Elementen nicht zum älteren Sprachstandard (ECMAScript 3) gehört und daher möglicherweise in älteren Browsern nicht funktioniert.
quelle
Python (454 Zeichen)
quelle
D: 363 Zeichen
Mehr leserlich:
quelle
golfscript
Es besteht aus Funktionen, die zwei Argumente aus dem Stapel s und p verwenden und einen einzigen booleschen Rückgabewert erzeugen. Es gibt ein bisschen Mist, um das mit den faulen und und faulen oder Operatoren kompatibel zu machen. Ich bezweifle wirklich, dass dieser Ansatz bei weitem nicht optimal oder sogar in die richtige Richtung ist.
Es gibt auch ein paar unterhaltsame, dumme Momente, z. B. das Auftauchen eines
'*'
Musters, das Aufnehmen des'*'
Vergleichs, um dann zu erkennen, dass der nachfolgende Zweig nicht passt. Um den anderen Zweig hinunterzugehen, benötigen wir das Muster mit dem'*'
auf der Vorderseite, aber wir haben dieses ursprüngliche Muster verbraucht, als wir das geöffnet haben'*'
, und wir haben das verbraucht.'*'
Um das Muster wieder zu erhalten, laden wir eine glänzende neue Zeichenfolge konstant'*'
und voranstellen. Es wird sogar noch hässlicher, weil aus irgendeinem Grund die Zeichenübereinstimmung mit ASCII-Werten erfolgen muss, aber das Zurückstellen auf die Zeichenfolge Zeichenfolgen erfordert.weniger golf golfscript
Tests
quelle
C # (251 Zeichen)
Etwas besser lesbar:
† Ich weiß, ich weiß ... mit Ausnahme von Globs, die den Backslash enthalten. Welches ist wirklich unglücklich. Sonst wäre es wirklich klug gewesen. :(
quelle