lundi 11 juin 2007

JeanWalker 2.1

Ceci est la suite de JeanWalker, initialement publiée Sur-la-Toile, le 03-06-2007 à 19:53


C'est fou l'effet que ça peut faire deux Perrier, consommés dans l'ambiance amicale d'un pub, à la qualité de mon code. Certains prétendront que c'est les sourires des filles alentours qui m'améliorent et je n'essaierai pas de les contre-dire.

Voici donc JeanWalker 2.1

Le paysage peut être plus complexe et est facile à définir par une série de nombres indiquant chacun le maximum d'un domaine. Les domaines ayant tous une base égale à l'unité.

Ainsi, set landscape to {2, 1, 6, 2, 4, 7, 2, 3, 6} est un paysage correspondant à :

Le critère d'abandon de la boucle d'évolution de JeanWalker est le dépassement du dernier domaine, pas du maximum de y, mais du maximum de x.

Voici ce qu'un simple "run" donne :

On voit que JeanWalker passe les "vallées" bien à l'aise, il grimpe aux sommets et continue son errance de façon aléatoire. C'est bien plus satisfaisant qu'une seule petite vallée, n'est-ce pas ?

Le "chemin" parcouru, ains que le nombre d'étapes avant que JeanWalker tente de dépasser le dernier domaine est variable et imprévisible, bien entendu.

Le "code" largement amélioré est ci-dessous, commenté pour m'éviter un organigramme.

-- description du paysage
set landscape to {2, 1, 6, 2, 4, 7, 2, 3, 6}
--initialiser le presse-papier, où les résultats seront stockés
set the clipboard to ""
--placer JeanWalker aux starters
set x to 0
set y to 0
--tend détermine la longueur du "pas" vers le haut
set tend to 0.1
--boredom est la mesure de l'ennui de JeanWalker quand il n'arrive pas à progresser vers le haut
set boredom to 0
--pierre will be used to store the threshold of the last domain
set pierre to 0
-- evolving peut être utilisé pour accélérer la "marche en avant" de JeanWalker; j'ai ajouté ça pour ceux qui ont des machines lentes. A "1" la probabilité d'avancer ou reculer est égale. Si on diminue la valeur le recul est affecté "set x to x + ((thesign * boredom) * evolving)"

set evolving to 1
-- départ
repeat
set previous_y to y -- mémoire à case unique
try
set domain to item ((x + 1) div 1) of landscape
on error
-- arrivée
exit repeat
end try
if y + tend ? domain then
-- grimper si possible
set y to y + tend
else
-- sinon rester sur le "haut du pavé"
set y to domain
end if
if previous_y = y then -- si ça n'avance pas vers le haut
set boredom to boredom + 0.1 - tu t'ennuies
-- vers où aller ? avant ? arrière ? attendons un signe
if (random number {}) < 0.5 then -- aléatoire le signe !
set thesign to 1
set x to x + (thesign * boredom) -- en avant
else
set thesign to -1
set x to x + ((thesign * boredom) * evolving) - en arrière; éventuellement de façon modérée par "evolving"
end if
-- rester dans le paysage
if x ? 0 then set x to 0
if x > (count of landscape) then set x to count of landscape
else
set boredom to 0
end if
-- après un changement de x de façon aléatoire verifier que JeanWalker n'est pas suspendu à l'air, ce n'est pas encore JeanFlyer (prochain épisode)
try
set domain to item ((x + 1) div 1) of landscape
on error
set domain to last item of landscape
end try
if y > domain then set y to domain
-- noter les coordonnées de l'étape et recommencer tant que Jean Walker n'essaie pas de sortir du paysage par la droite.
set the clipboard to (the clipboard) & x & tab & y & return
end repeat
-- prévient qu'il est temps de regarder les résultats !
beep

Script pour les Mac User, n'allez pas me dire que c'est comparable avec les superordinateurs des fabricants d'avions parce que j'aurais tendance à y croire.

Aucun commentaire: