terça-feira, 23 de novembro de 2010

Problema 5.15

As tartarugas são como pequenos robots, obedecendo a comandos. Neste problema os comandos são muito simples: ‘f’ para avançar em frente, ‘t’ para recuar, ‘e’ para virar à esquerda e ‘d’ para virar á direita. Queremos visualizar o que a tartaruga faz quando recebe uma dada sequência de comandos. Quando analisamos o problema fica claro que os dados de entrada são a tartaruga (afinal podemos querer enviar comandos diferentes a tartarugas diferentes...), e a sequência de comandos. A saída neste caso é o que observamos em termos de comportamento da tartatuga. Como representação dos dados vamos usar um objecto do tipo turtle e uma cadeia de caracteres para a sequência de comandos. Um olhar mais atento leva-nos a concluir que também falta definir a dimensão dos movimentos e o ângulo de viragem. Vamos admitir que esses elementos são constantes.

Como se trata de realizar repetidas vezes a obediência a um comando, que varia ao longo do tempo, o nosso programa vai ter como parte principal um ciclo. Como o número de vezes que executamos é fixo, uma vez conhecida a sequência de comandos, será usado um ciclo for. Vejamos então o código:

01.import turtle
02. 
03.def adn_tartaruga(tartaruga, adn):
04.   """ Simula o comportamento da tartaruga ditado pelo seu ADN."""
05.   tartaruga.down()
06.   for car in adn:
07.       if car == 'f':
08.           tartaruga.fd(50)
09.       elif car == 't':
10.           tartaruga.bk(50)
11.       elif car == 'd':
12.           tartaruga.rt(45)
13.       else:
14.           tartaruga.lt(45)

Este código tem alguns pressupostos: os comandos são letras minúsculas, não há enganos nas letras, as constantes definidas directamente nos argumentos. Alterar o programa para estarmos mais precavidos não é difícil:
01.import turtle
02. 
03.def adn_tartaruga(tartaruga, adn):
04.    """ Simula o comportamento da tartaruga ditado pelo seu ADN."""
05.    adn.lower()
06.    TAM = 60
07.    ANG = 45
08.    comandos = 'fted'
09.    tartaruga.down()
10.    for car in adn:
11.        if car not in comandos:
12.            print 'Comando desconhecido...bye'
13.            break
14.        elif car == 'f':
15.            tartaruga.fd(TAM)
16.        elif car == 't':
17.            tartaruga.bk(TAM)
18.        elif car == 'd':
19.            tartaruga.rt(ANG)
20.        else:
21.            tartaruga.lt(ANG) 


Agora é só experimentar.

1 comentário: