Implémentez une fonction de modèle et de chaîne à mettre en correspondance, retournez true si le modèle correspond à la chaîne WHOLE, sinon false.
Notre syntaxe de modèle de glob est:
?
correspond à n'importe quel caractère+
correspond à un ou plusieurs caractères*
correspond à zéro ou plusieurs caractères\
s'échappe
Règles:
- Aucun eval, aucune conversion en expression régulière, aucun appel à une fonction glob système.
- Les E / S ne sont pas nécessaires: vous pouvez simplement écrire une fonction
- Victoires les plus courtes
Exemples:
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
Voici une astuce pour commencer: http://en.wikipedia.org/wiki/Backtracking
code-golf
interpreter
regular-expression
Ming-Tang
la source
la source
Réponses:
Golfscript - 82 caractères
Suppose qu'il n'y a pas de nouvelle ligne dans les chaînes. Renvoie un tableau vide pour faux et un tableau non vide pour vrai (conforme à la définition golfscript de vrai / faux).
Il s'agit d'une solution non récursive (à l'exception des
*
s consécutifs ), qui conserve une liste des positions dans la chaîne de modèlei
telles qu'ellespattern[0..i]
correspondentstring[0..cur]
.Cela a le potentiel de fonctionner très longtemps. Vous pouvez ajouter
.&
après:C%
pour éviter cela.la source
Haskell, 141 caractères
Fonctionne pour toutes les entrées, les modèles et les chaînes à comparer. Gère la barre oblique inverse de fin dans le modèle comme une correspondance littérale (le comportement n'était pas spécifié.)
Cela peut être exécuté avec le pilote de test suivant:
Mise à jour: J'ai écrit un blog sur cette réponse particulière, car je pense que cela montre bien comment Haskell code si facilement le problème.
d
etm
avec des opérateursr
en ligne dansc
+
cas%
, qui a été gérée par&
la source
PHP -
275243 caractèresNon golfé:
la source
Python trop verbeux (
384367 caractères)Ce n'est pas le plus court, mais c'est agréable et fonctionnel. La chose du dict d'expédition au milieu pourrait vraisemblablement être réécrite comme une disjonction sur
(h(p) == '?') and (? lambda body)
les choses de type. Définir que l'opérateur h me coûte quelques caractères sans aucun avantage, mais c'est bien d'avoir un mot-clé pour head.J'aimerais avoir une fissure au golf en l'écrivant plus tard si le temps le permet.
edit: suppression de la troisième branche inutile dans le cas '*' après avoir lu la réponse ruby de user300
la source
Shorter Snappier Python 2.6 (272 caractères)
golfé:
non golfé:
avec:
crédit à la réponse de user300 pour avoir illustré comment les choses sont simplifiées si vous pouvez obtenir une sorte de valeur de terminateur lorsque vous sautez la tête d'une chaîne vide.
je souhaite que le déballage tête / queue puisse être effectué en ligne lors de la déclaration des arguments de m. alors m pourrait être un lambda, tout comme ses amis n et glob. python2 ne peut pas le faire, et après un peu de lecture, il semble que python3 ne puisse pas non plus. malheur.
essai:
la source
Ruby -
199171Non golfé:
Tests:
Inspiré par la réponse des roobs
la source
lambda s : list(s)+[None]
??
sont des caractères littéraux,=>
des séparateurs clé / valeur dans Ruby Hashes, et->
démarre un lambda :-) ({ ?? => ->{...} }
est un hachage avec clé"?"
et un lambda comme valeur.) :-)Fonction C - 178 caractères nécessaires
Compilé avec GCC, cela ne produit aucun avertissement.
La première et la dernière ligne ne sont pas incluses dans le nombre de caractères. Ils sont fournis à titre indicatif uniquement.
Explosé:
la source
JavaScript - 259 caractères
Mon implémentation est très récursive, donc la pile débordera si un modèle extrêmement long est utilisé. Ignorant le signe plus (que j'aurais pu optimiser mais choisi de ne pas utiliser pour des raisons de simplicité), un niveau de récursivité est utilisé pour chaque jeton.
La fonction renvoie parfois un nombre au lieu d'un booléen. Si c'est un problème, vous pouvez l'utiliser comme
!!glob(pattern, str)
.Non golfé (non minimisé, plutôt) pour servir de ressource utile:
Notez que l'indexation en caractères d'une chaîne comme pour les éléments de tableau ne fait pas partie de la norme de langage plus ancienne (ECMAScript 3), donc elle peut ne pas fonctionner dans les navigateurs plus anciens.
la source
Python (454 caractères)
la source
D: 363 caractères
Plus lisiblement:
la source
golfscript
il est construit à partir de fonctions qui consomment deux arguments de la pile, s et p, et produisent une seule valeur de retour booléenne. il y a un peu de nettoyage pour le rendre compatible avec les opérateurs paresseux et et paresseux ou. je doute vraiment que cette approche soit presque optimale, voire dans la bonne direction.
il y a aussi quelques moments amusants et stupides, comme sauter un
'*'
modèle, consommer le'*'
dans une comparaison, seulement pour réaliser que la branche suivante ne correspond pas. afin de descendre l'autre branche, nous avons besoin du motif avec le'*'
devant, mais nous avons consommé ce motif original lorsque nous avons sauté le'*'
, et nous avons consommé le'*'
, donc pour obtenir à nouveau le motif, nous chargeons une nouvelle chaîne brillante constante'*'
, et ajoutez-la en place. cela devient encore plus laid parce que pour une raison quelconque, la correspondance des caractères doit être effectuée avec des valeurs ascii, mais le retour au début dans la chaîne nécessite des chaînes.golfscript moins golf
tests
la source
C # (251 caractères)
Un peu plus lisible:
† Je sais, je sais ... sauf pour les globes contenant la barre oblique inverse. Ce qui est vraiment regrettable. Cela aurait été vraiment intelligent autrement. :(
la source