### Exercice 1
# voir le fichier test_stm.py
### Exercice 2
# Il suffit de faire une règle de trois :
# 6,8 s * 1_000_000^2 / 16_000^2
# = 26 560 s
# = 7 h 23 min
### Exercice 3
# 1. Les deux fonctions sont correctes.
# 2. La première a une complexité quadratique (N + N-1 + ... + 2 + 1),
# la seconde une complexité linéaire.
# Si on double la taille du tableau, le temps de calcul de est_trie1
# est multiplié par 4, celui de est_trie2 par 2 seulement.
# La fonction est_trie2 est clairement préférable.
### Exercice 4
# voir le fichier machine_turing.py
### Exercice 5
# On utilise trois états C, P et A en plus de l'état final F.
# Dans l'état C (qui est l'état initial), la machine cherche une
# occurrence de 0. Dans les états P et A, la machine revient
# écrire son verdict. La machine passe dans l'état P (présent) dès
# qu'elle observe un symbole 0. Elle passe dans l'état A si elle
# atteint le blanc suivant l'entrée sans avoir rencontré de 0.
#
#
# état | lu | écrit | dépl. | suiv
# -----+-------+-------+-------+-------
# C | 0 | 0 | <- | P
# C | 1 | 1 | -> | C
# C | blanc | blanc | <- | A
# -----+-------+-------+-------+-------
# P | 1 | 1 | <- | P
# P | blanc | 1 | reste | F
# -----+-------+-------+-------+-------
# A | 1 | 1 | <- | A
# A | blanc | 0 | reste | F
# -----+-------+-------+-------+-------
#
# Notez que nous n'avons pas inclus de règles pour (P, 0) et
# (A, 0) car ces situations ne doivent jamais se produire : la
# machine faisant demi-tour au premier 0 rencontré elle ne trouvera
# jamais un 0 sur son chemin retour.
# La stratégie de cette machine peut faire penser au code de la
# fonction Python suivante.
def chercher_zero(entree)
for x in entree:
if x == 0:
return True
return False
### Exercice 6
# Il n'est pas envisageable de partir directement à gauche ou à droite
# jusqu'à rencontrer le 0, car on pourrait alors ne jamais s'arrêter
# si l'on choisissait la mauvaise direction. On peut à la place aller
# alternativement vers la gauche ou la droite, à chaque fois d'une
# case plus loin que la précédente, en laissant des marques * dans les
# cases déjà explorées. On utilise pour cela deux états D
# (exploration vers la droite) et G (exploration vers la gauche) en
# plus de l'état final F. On peut choisir l'état initial
# arbitrairement entre G et D.
#
# état | lu | écrit | dépl. | suiv
# -----+-------+-------+-------+-------
# D | 0 | 0 | reste | F
# D | * | * | -> | D
# D | blanc | * | <- | G
# -----+-------+-------+-------+-------
# G | 0 | 0 | reste | F
# G | * | * | <- | G
# G | blanc | * | -> | D
# -----+-------+-------+-------+-------
#
# Pour nettoyer les marques il faut en plus, une fois le 0 trouvé,
# repartir en sens arrière jusqu'à un blanc, puis revenir. Cela
# demande au total quatre états supplémentaires (aller et retour, avec
# le 0 trouvé à gauche ou à droite de la position de départ).