Olimpiadi Italiane di Informatica – 15-11-2018 – Numero 19
La grafica della tartaruga prevede che si possano impartire degli ordini di movimento a una tartaruga, che li eseguirà lasciando sul terreno una traccia dei suoi movimenti, come se avesse una penna attaccata sulla pancia.
Gli ordini possono essere impartiti tramite un semplice linguaggio, stando attenti che:
- le istruzioni destra e sinistra sono relative all’orientamento attuale della tartaruga, e il numero che segue è un angolo di rotazione (rispettivamente orario e antiorario) espresso in gradi;
- le istruzioni pennasu e pennagiu sollevano e abbassano rispettivamente la penna sotto la pancia della tartaruga: quando la penna è sollevata ovviamente non lascia tracce sul terreno;
- l’istruzione
ripeti
fa ripetere il blocco che segue, delimitato da parentesi graffe, per un numero di volte indicato a fianco dell’istruzione.
Inizialmente la tartaruga si trova nel vertice A, guarda in alto a destra ed è nella condizione pennagiu.
La misura dei lati è AB = a, BH = c, GH = b.
Il programmatore della tartaruga è stato però interrotto nel suo lavoro prima di poter scrivere le ultime due istruzioni ISTR18 e ISTR19 necessarie perché la tartaruga completi il disegno (il famoso grafo di Petersen).
Scrivere le due istruzioni mancanti.
pennagiu
ripeti 5 {
avanti a
destra 72
}
destra 54
avanti c
ripeti 4 {
sinistra 18
avanti b
sinistra 18
avanti c
pennasu
sinistra 180
avanti c
pennagiu
}
ISTR18
ISTR19
Seguendo il codice originale, senza le ultime due istruzioni, si ottiene la figura seguente
from turtle import *
a=150
b=180
c=33
setup(600, 600)
left(36)
pendown()
for i in range(5):
forward(a)
right(72)
right(54)
forward(c)
for i in range(4):
left(18)
forward(b)
left(18)
forward(c)
penup()
left(180)
forward(c)
pendown()
Osserva
- La prime 6 istruzioni sono necessarie
- I valori di a, b, c si ricavano a tentativi.
Per disegnare il tratto mancante sono necessarie le 2 istruzioni sinistra 18, avanti b
from turtle import *
a=150
b=180
c=33
setup(600, 600)
left(36)
pendown()
for i in range(5):
forward(a)
right(72)
right(54)
forward(c)
for i in range(4):
left(18)
forward(b)
left(18)
forward(c)
penup()
left(180)
forward(c)
pendown()
left(18)
forward(b)
La figura può essere più somigliante e l’algoritmo più semplice (?)
import turtle
WIDTH = 500
HEIGHT = 500
a=150
b=180
c=33
turtle.setup(WIDTH, HEIGHT)
turtle.title("OII 2018")
turtle.bgcolor('pink')
turtle.shape('turtle')
turtle.pencolor('red')
turtle.pensize(4)
for i in range(5):
turtle.forward(a)
turtle.left(72)
turtle.pensize(2)
turtle.left(54)
for i in range(5):
turtle.forward(c)
turtle.left(18)
turtle.forward(b)
turtle.left(18)
turtle.forward(c)
turtle.left(180)