## Turmites

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 à mémoriser, 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ésupposé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.

[/!] [!java|scala]

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.

## Notes bibliographiques

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.