Pasrse all once only
guest229-Jun-2007/16:06:12+2:00
Petit Résumé d'une discussion que j'ai lancée sur Altme.

Imaginons la série "BAC" , je veux pouvoir controller que chaque lettre "A" "B" "C" et utilisée une et une seule unique fois.

La façon classique de coder ça avec 'parse est la suivante:

parse "BAC" ["ABC" | "ACB" | "BAC" | "BCA" | "CAB" | "CBA"]

Voilà on constate que c'est assez fastidieux d'écrire une telle règle.

Au début, comme je ne pensais pas trouver une solution simple, j'ai proposé l'introduction d'un nouveau mot "all" dans le dialecte parse.

parse "BAC" [all ["a" | "b" | "c"]]

Qui fonctionnerait un peu comme les commandes 'some ou 'any

Puis, en discutant, plusieurs pistes ont été proposées pour simuler la commande 'all

J'ai proposé ceci - c'est pas parce que c'est la mienne mais je la trouve plus jolie que les autres

take: func [r] [
	n: 0 
	once/1: (length? r) + 1 / 3 
	once/2/2: r 
	replace/all r '.. '.   
]
.: [(n: n + 1)]
..: [(n: n + 1) end skip]
once: [
	0 	;modifié par la fonction take (permet d'executer le block suivant n fois)
	[
		(if n > 0 [poke once/2/2 n - 1 * 3 + 1  '..] n: 0) 
		[]	;modifié par take (contient la règle)
	]
]


>>rule: [. "a" | . "b" | . "c"]
>>parse "CBA" [ (take rule) once]
== true
>>parse  "BAC" [ (take rule) once]
== true
>>parse  "CAB" [ (take rule) once]
== true
>>parse  "BBC" [ (take rule) once]
== false
>>parse  "CA" [ (take rule) once]
== false
>>parse  "CABA"[ (take rule) once]
== false

; on peut tester plusieurs occurences de la même règle
>>rule2: [. "a" | . "a" | . "b" | . "c"]
>>parse "CABA"[ (take rule2) once]
== true


Voilà, bon jeu !
DocKimbel2-Jul-2007/0:26:18+2:00
Il y a plus simple :

>> rule: [(c: charset "ABC") 3 [copy v c (remove/part c v)]]

>> parse "ABC" rule
== true
>> parse "BAC" rule
== true
>> parse "CBA" rule
== true
>> parse "ABA" rule
== false
>> parse "ABCA" rule
== false


J'ai gagné quelquechose ?
--
DocKimbel
guest22-Jul-2007/4:41:58+2:00
oui Doc tu aurais pu, mais le truc c'est que les règles que j'emploie ne se limitent pas à tester des char! mais des bouts de phrases complètes.
De plus , tu n'autorise pas la répétition d'un même pattern.
Donc mon Algo est plus général.

Par contre je retiens l'astuce du remove sur un charset! j'aurais jamais pensé à tester un truc pareil.

Donc finalement, je te décerne le prix de l'astuce de malade du mois.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2