Cette exercice explore une nouvelle façon d'étendre le concept de la fourmi de Langton. Maintenant, le comportement de la fourmi ne dépend plus seulement de la couleur du sol, mais aussi de son état interne (représenté par une valeur entière). L'idée de changer la fourmi en un automate découle naturellement du concept de la machine de Turing. Ceci explique le nom de ces nouveaux animaux, qui est un mélange de Turing et de Termite (si vous ne savez pas ce qu'est une machine de Turing, vous devriez vous jeter sur Wikipedia parce qu'il est tout simplement impossible d'être un vrai informaticien sans le savoir).
Une fois encore, vous devez seulement écrire la méthode step()
,
qui s'occupe de faire faire un pas à la turmite. Une fois encore, vous devez
tout d'abord trouver le rang de la couleur actuelle du sol dans la liste des
couleurs. Mais cette fois, rule
dépend à la fois de la couleur
courante et de l'état courant. rule
contient en fait trois
informations dans chaque situation : la couleur à mettre, le mouvement à
effectuer, et la valeur du prochain état.
Par exemple, [!java|python]rule[1][0][/!][!scala]rule(1)(0)[/!] contient
l'information à utiliser quand state==1
et
color==0
. En d'autres mots, vous pouvez récupérer l'information
relative à votre situation actuelle en utilisant
[!java|python]rule[etatCourant][couleurActuelle][/!][!scala]rule(etatCourant)(couleurActuelle)[/!]
Chaque ensemble d'informations contient trois valeurs.
La première est le rang de la couleur à mettre sur le sol.
La deuxième est le mouvement à effectuer, avec la notation suivante :
0=stop, 1=pas de virage, 2=gauche, 4=demi-tour, 8=droite. Veuillez noter que
si l'instruction est stop, vous ne devez même pas avancer sur cette étape
(mais vous ne devez pas arrêter votre programme pour autant : les prochains
pas peuvent faire quelque chose d'autre). Finalement, le troisième entier
est la valeur du prochain state
à avoir après cette itération.
Puisque ces notations arbitraires sont parfois difficiles à se souvenir,
vous devriez définir un ensemble de constantes que vous pouvez utiliser à la
place des valeurs numériques. Leurs noms pourraient être GAUCHE, DROITE,
etc.
[!scala]Déclarez simplement ces valeurs avec le mot-clé val
au
lieu de var
. De toute façon, on devrait toujours utiliser
val
au lieu de var
quand on peut.[/!]
[!java]Les modificateurs final static
devant le nom du type est
la façon Java de marquer des constant en Java.
Vous devriez écrire par exemple static final int TOUTDROIT=1;
Désolé de la complexité de cette notation. [/!]
[!python]Par convention, de telles «variables constantes» sont écrites tout
en majuscule en Python.
Rien ne vous empêche d'un point de vue technique de les modifier, mais ca
serait une très mauvaise idée.[/!]
Vous devriez les écrire en dehors de toute méthode pour les rendre visible
de partout.
Utilisez de telles constantes aident beaucoup à rendre le code plus lisible. Comparez les deux morceaux de code suivant:
[!java]if (rule[etat][couleurActuelle][MVT_SUIVANT] == GAUCHE) {[/!][!python]if rule[etat][couleurActuelle][MVT_SUIVANT] == GAUCHE:[/!][!scala]if (rule(etat)(couleurActuelle)(MVT_SUIVANT) == GAUCHE) {[/!] gauche()[!java];[/!] [!java|scala]}[/!]
C'est un peu plus long, mais bien plus agréable à lire que ceci :
[!java]if (rule[i][j][1] == 2) {[/!][!python]if rule[i][j][1] == 2:[/!][!scala]if (rule(i)(j)(1) == 2) {[/!] gauche()[!java];[/!] [!java|scala]}[/!][!python]
Enfin, vous devriez également écrire une branche elif
pour la
condition STOP
. Avoir une branche else
qui affiche
un message d'erreur tel que "situation inattendue" est une bonne
pratique. Celà permet d'expliciter les présuposés du code, et assure un
message d'erreur plus explicite si ces suppositions s'avèrent erronées. Le
problème suivant est que nous n'avons rien à faire faire dans la branche du
cas STOP
, mais que python n'autorise pas de branche
else
vide. Il faut alors utiliser l'instruction
pass
là où il n'y a rien à faire. Cela indique à Python qu'il y
a bien une branche à cet emplacement, mais qu'elle ne fait rien.
Vous devriez probablement utiliser un [!java]switch[/!][!scala]filtrage[/!] pour que votre code reste lisible. Si vous avez oublié ce que c'est, retournez à cet exercice.
[/!]Vous devriez maintenant avoir assez d'informations pour réussir.
D'après Wikipedia, les turmites ont été inventés indépendamment à la fin des années 80. Il a été démontré que les turmites en général sont exactement équivalent en terme de puissance à des machines de Turing à une dimension avec un ruban infini, et peut donc simuler les autres. Cela signifie qu'absolument tous les programmes auxquels vous pouvez penser peuvent théoriquement être calculé sur cet outil.