Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
OPS 2024
0. INTRODUZIONE pag. 2
1. ALCUNE REGOLE DI SCRITTURA pag. 3
2. LA COMPILAZIONE DELLE RISPOSTE pag. 8
3. PROBLEMI RICORRENTI pag. 9
a) FATTI E CONCLUSIONI
b) GRAFI
c) KNAPSACK
d) PIANIFICAZIONE
e) CRITTOGRAFIA
f) ROBOT E AUTOMI
g) FLUSSI IN UNA RETE DI CANALI
h) GESTIONE DI UNA CODA
i) GESTIONE DI UNA PILA
1
0. INTRODUZIONE
Il programma OPS per il 2023-2024 si rivolge, come di consueto, a tre livelli di partecipazione:
− scuola primaria,
− scuola secondaria di primo grado,
− scuola secondaria di secondo grado (primo biennio).
Sono previste gare a squadre per tutti i livelli e gare individuali per gli ultimi due livelli.
Ogni gara a squadre consisterà di norma in 13 problemi; l’articolazione dei problemi sarà, usualmente, la
seguente:
1. sei problemi formulati in italiano e scelti, di volta in volta, tra l’insieme dei “Problemi ricorrenti” (si
veda il successivo elenco);
2. sei problemi formulati in italiano e relativi a uno pseudo-linguaggio di programmazione;
3. un problema formulato in inglese, di argomento ogni volta diverso (almeno in linea di principio).
Ogni gara individuale consisterà di 8 problemi; suddivisi come segue:
1. quattro problemi formulati in italiano e scelti, di volta in volta, tra l’insieme dei “Problemi ricorrenti”
(si veda il successivo elenco);
2. tre problemi formulati in italiano e relativi a uno pseudo-linguaggio di programmazione;
3. un problema formulato in inglese, di argomento ogni volta diverso (almeno in linea di principio).
La difficoltà e la complessità dei problemi saranno commisurate al livello cui tali problemi saranno proposti.
I Problemi ricorrenti nelle gare OPS 2023 - 24 sono tratti del seguente insieme:
a) Fatti e conclusioni.
b) Grafi.
c) Knapsack.
d) Pianificazione.
e) Crittografia.
f) Movimenti di un robot.
g) Flussi in una rete di canali
h) Gestione di una coda
i) Gestione di una pila
2
1. ALCUNE REGOLE DI SCRITTURA
Nei testi dei problemi possono comparire: numeri, termini e liste; le seguenti osservazioni sono utili per
comprenderne il significato e l’uso corretto.
1.1 NUMERI
I numeri naturali maggiori di nove sono scritti utilizzando le dieci cifre indo-arabe 0,1,2,3,4,5,6,7,8,9
e sono letti da sinistra verso destra.
Unica eccezione alla regola è che un naturale non può iniziare con lo “0”.
Talvolta per facilitare la lettura di numeri molto lunghi (con più di 5 cifre), si scrivono utilizzando un
separatore periodico ogni tre cifre a partire da destra.
Nella lingua italiana si utilizza come separatore il punto nella parte inferiore della riga:
12.345
1.234.556.789
In lingua inglese il separatore è la virgola:
12,345
1,234,556,789
N.B. Nella compilazione delle risposte i numeri interi sono sempre scritti senza separatore periodico
e senza zeri a sinistra.
Esempio. In un certo esercizio la casella di risposta permette di scrivere numeri naturali fino a cinque
cifre, mentre la risposta al quesito è 123.
Risposta corretta se si scrive 123 (lasciando vuoti i due spazi a destra del 3)
Risposta sbagliata se si scrive 0123 oppure 00123 (volendo completare i cinque spazi a
disposizione)
I NUMERI RAZIONALI nella forma decimale sono sequenze di cifre separate da un simbolo detto marcatore.
La parte a sinistra del marcatore è detta parte intera, mentre quella a destra è detta parte decimale.
Nella lingua italiana il marcatore è la virgola nella parte bassa del rigo:
0,23 parte intera 0; parte decimale 23
2,343 parte intera 2; parte decimale 343
45,0 parte intera 45; parte decimale 0
Nella lingua inglese il marcatore è il punto nella parte bassa del rigo:
0.23
2.343
45.0
N.B. Nella compilazione delle risposte il numero intero 45 è “diverso” dal numero decimale 45,0 (o 45.0 se
l’ambito è in lingua inglese): il testo del problema specificherà sempre la natura della risposta richiesta.
I numeri razionali sono rappresentabili anche in forma di frazione (due numeri interi separati
dal simbolo di frazione /. Il numero a sinistra è detto numeratore e quello a destra denominatore)
Esempio. 5/6 è una frazione con numeratore 5 e denominatore 6
21/5 è una frazione con numeratore 21 e denominatore 5
Il passaggio dalla forma frazionaria alla forma decimale avviene effettuando una divisione dove il dividendo
è il numeratore e il divisore è il denominatore.
Esempio.
21/5 corrisponde al decimale 4,2 (21:5 = 4,2)
2/3 corrisponde al decimale 0,666666……. (2:3=0,666666…. divisione che non si arresta)
3/15625 corrisponde al decimale 0,000192 (3:15625=0,000192)
3
In genere un numero razionale viene approssimato scrivendo le sue prime cifre decimali. I metodi utilizzati
sono due: troncamento e arrotondamento
Per troncamento di un numero razionale ad una certa cifra decimale si intende il numero scritto nella forma
decimale fino a quella cifra.
Esempio. Scrivere i seguenti numeri razionali troncati alla seconda cifra decimale
Numero razionale Numero troncato alla seconda cifra decimale
9,3435 9,34
9,3402 9,34
8,9951 8,99
0,898 0,89
0,9 0,90
Per arrotondamento di un numero razionale ad una certa cifra decimale si intende il numero scritto nella
forma decimale utilizzando la seguente regola:
se la cifra successiva (a destra della cifra decimale stabilita) è 0,1,2,3,4 allora si scrive il numero
troncato
se la cifra successiva è 5,6,7,8,9 allora si aggiunge 1 (alla cifra decimale stabilita) e si scrive il nuovo
numero.
Esempio1. Scrivere il numero decimale 9,3435 arrotondato alla seconda cifra decimale
R. 9,34 (perché la terza cifra decimale è 3 e quindi si tronca semplicemente)
Esempio2. Scrivere il numero decimale 9,3435 arrotondato alla terza cifra decimale
R. 9,344 (perché la quarta cifra è 5 per cui la terza cifra 3 viene aumentata di 1)
Esempio3. Scrivere il numero decimale 7,9953 arrotondato alla seconda cifra decimale
R. 8,00 (perché la terza cifra è 5 e aumentando di 1 la seconda cifra si hanno dei riporti)
Nelle ultime edizioni OPS, in problemi coinvolgenti soluzioni con numeri decimali, c’è la tendenza a chiedere
come risposta un numero intero.
Precisamente si chiede di “arrotondare il numero razionale all’intero più vicino”
In questo caso si esegue la regola dell’arrotondamento vista sopra, assumendo come cifra successiva la prima
cifra decimale.
Alcuni esempi
1) Arrotondare all’intero più vicino il numero 67,26
R. 67 (perché la prima cifra decimale è 2)
Per completezza ricordiamo che le stesse regole si applicano anche ai numeri negativi
-67,2 viene arrotondato all’intero -67 (perché la cifra decimale è 2)
-54,9 viene arrotondato all’intero -55 (perché la cifra decimale è 9)
4
N.B.1 La risposta su una percentuale (%) viene sempre data come arrotondamento all’intero più vicino
Esempio. Esprimere in % la frazione 23/79
R. 29% (23:79 = 0,291; 0,291*100 =29,1 e si arrotonda all’intero più vicino 29)
N.B.2 La regola dell’arrotondamento all’intero più vicino si applica anche ai problemi in lingua
inglese dove la frase
Write your answer as an integer number (eventually rounded up to the nearest whole
integer)
viene interpretata come “scrivere in risposta l’intero più vicino al numero decimale trovato”
1.3 I TERMINI
Un termine è una scrittura del tipo:
minerale(m1,90,300)
attività(alfa,4,6)
cioè un nome seguito da uno o più argomenti racchiusi tra parentesi tonde e separati da virgole (se sono più
di uno).
Il nome inizia sempre con una lettera; gli argomenti sono parole, sigle o numeri interi
N.B. Nella scrittura di un termine non intervengono spazi tra nome e parentesi, tra argomento e virgola, tra
argomento e parentesi. Dunque, le seguenti scritture sono sbagliate
minerale (m1,90,300) c’è spazio tra nome e parentesi
minerale(m1, 90,300) c’è spazio tra la prima virgola e il secondo argomento
minerale(m1,90,300 ) c’è spazio tra il terzo argomento e l’ultima parentesi tonda
Prima dell’uso, ogni termine è definito. La definizione indica il nome del termine, gli argomenti e il loro
significato.
La tabella seguente che si riferisce ad un magazzino di minerali: riporta la sigla, il peso in kg e il valore in
euro di ogni esemplare presente nel magazzino.
minerale
sigla valore in euro peso in kg
m1 213 30
m2 200 35
m3 230 38
Il nome del termine è il nome della tabella, il numero degli argomenti è il numero delle colonne e il significato
di ogni termine è l’intestazione della colonna.
5
che mostra il nome del termine, il numero degli argomenti e il loro significato. Di conseguenza il contenuto
della tabella viene così descritto:
minerale(m1,213,30)
minerale(m2,200,35)
minerale(m3,230,38)
Come ulteriore esempio si consideri la seguente figura che rappresenta un grafo; questo è composto da
nodi, distinti da una sigla e da archi che congiungono i nodi.
Un grafo si può pensare come la rappresentazione schematica di città congiunte da strade.
Un grafo può essere descritto con dei termini; ogni termine è associato a un arco ed è così definito:
arco(<nodo1>,<nodo2>,<lunghezza>)
La definizione mostra il nome del termine e il numero degli argomenti (tre): i primi due si riferiscono ai nodi
posti agli estremi dell’arco, il terzo descrive la lunghezza dell’arco.
n5
3
5
9
n4 9
n1
4
n2
11 2
1
n3
1.4 LE LISTE
Una lista è una scrittura del tipo:
[alfa,beta,gamma]
[a1,2,56,b2,3,67]
cioè una coppia di parentesi quadre che racchiudono un certo numero di elementi separati da virgole (se
sono più di uno). Una lista può non contenere elementi: in tal caso si dice lista vuota [].
Si consideri la seguente figura che rappresenta una scacchiera 8x8. Facendo riferimento allo spigolo in basso
a sinistra, ogni casella può essere individuata da una coppia di coordinate, scritte come una lista, il cui primo
elemento è la “X”, cioè lo spostamento orizzontale e il secondo elemento è la “Y”, cioè lo spostamento
verticale.
Per esempio, il numero 5 è nella casella [3,2]; il robot è nella casella [8,1] e la casetta è nella casella [1,8].
6
⌂ ▀
▀ ▀ 11
▀
12
5 ▀ 13
▀
Per indicare la posizione sulla scacchiera dei quadrati neri si può usare una lista i cui elementi sono le
coordinate delle caselle che li contengono; si ottiene, quindi, una lista di liste:
[[2,5],[3,1],[3,5],[4,8],[5,2],[7,4]]
Volendo indicare la posizione sulla scacchiera e il valore dei quattro numeri si può usare una lista di quattro
elementi che, a loro volta, sono liste; ciascuna lista “interna” è formata dalle coordinate della casella che
contiene il numero seguite dal valore:
[[3,2,5],[6,3,12],[6,5,11],[7,2,13]]
1. In ciascun campo disponibile per la risposta è possibile, di norma, digitare, allineato a sinistra, un solo
elemento: parola, numero, lista o termine; le parole devono essere scritte senza accenti; per i numeri
si veda il paragrafo precedente.
2. Talvolta il testo del problema può specificare che la risposta è una frase: in tal caso occorre scriverla
con un solo spazio tra due parole consecutive.
3. Gli elementi che compongono una lista vanno riportati fra parentesi quadre separati da virgole senza
spazi: per esempio la lista delle prime tre lettere (minuscole) dell’alfabeto va scritta nel modo
seguente: [a,b,c] e non [a, b, c]; i campi, per le risposte che richiedono liste, riportano già le parentesi
quadre “esterne”; se gli elementi delle lista sono, a loro volta, liste occorre scrivere le opportune
parentesi che li racchiudono.
4. L’elevazione a potenza è indicata da x^n; per esempio: x2 deve essere scritto x^2.
5. Una frazione deve essere scritta su una linea; per esempio: 2/3.
6. Se nel testo del problema è indicata una particolare modalità di risposta, per esempio:
7
digitare V per vero o F per falso
7. è necessario attenersi strettamente alle istruzioni: in caso contrario il sistema registrerà una risposta
errata.
8. Gli allenamenti disponibili sul sito consentono di familiarizzarsi con le regole di compilazione delle
risposte.
8
3. PROBLEMI RICORRENTI
a) FATTI E CONCLUSIONI
PREMESSA
Questi problemi trattano di entità correlate da fatti; ciascuna entità ha valori discreti. Consideriamo, per
esempio, le entità “nome”, “cognome”, “età”; se si parla di tre persone, allora il nome può avere i valori:
Aldo, Giacomo, Giovanni; il cognome può avere i valori Storti, Poretti, Baglio e l’età i valori: 58, 59, 60. Nei
problemi vengono enunciati dei fatti e da questi occorre ragionare e trarre conclusioni per associare
opportunamente i valori di nome, cognome ed età.
Per risolvere questi problemi è utile tracciare una tabella.
La tabella si completa esaminando ognuno dei fatti e traendone le conseguenze utilizzando essenzialmente
il principio del sillogismo ternario: se x ∈ A∩B e x ∈ B∩C allora x ∈A∩C.
PROBLEMA 1
Anna, Bruna e Clotilde sono tre sorelle amanti della geometria. Le loro figure geometriche preferite sono tre
poligoni regolari: il triangolo, il quadrato e il pentagono. Ognuna ha disegnate la figura preferita sulla prima
pagina del proprio diario, con lati di lunghezza 2, 3 e 4 cm. I nomi delle figure geometriche e le lunghezze
dei lati sono elencati in ordine casuale (e quindi non si corrispondono ordinatamente). Dai fatti elencati di
seguito, determinare quale sia la figura geometrica preferita da ciascuna sorella e quale sia la dimensione
del lato della figura.
1. La figura preferita di Anna ha due lati in più rispetto a quella preferita da Clotilde.
2. Il triangolo ha perimetro 9 cm.
3. La figura con lato 2 cm ha perimetro 10 cm.
SOLUZIONE
Anna Pentagono 2
Bruna Quadrato 4
Clotilde Triangolo 3
Nell’enunciato del problema compaiono tre entità: nomi, figure, lunghezze lati; si può assumere che la
coppia principale sia nomi e figure.
9
Fatto2. Il triangolo equilatero ha lato 3 cm.
Per il fatto1 segue: Clotilde --- triangolo --- con lato di lunghezza 3 cm
Fatto3. L’unica figura che può avere perimetro 10 cm avendo lato 2 cm è il pentagono.
Per il fatto1 segue: Anna --- pentagono --- con lato di lunghezza 2 cm
Bruna --- quadrato --- con lato di 4 cm.
La tabella è ora completa.
PROBLEMA 2
Alice, Bastiano e Carla sono pronti per i Grandi Giochi Estivi. Vivono in tre grandi città: Roma, Napoli e Milano;
si sono allenati duramente: chi per 3 mesi, chi per 5 mesi chi, addirittura per 7 mesi; praticano il golf, il
canottaggio e il ciclismo.
Dai fatti elencati di seguito, determinare dove vive ogni atleta, per quanto tempo si è allenato e che sport
pratica, riempiendo la successiva tabella.
1. Chi pratica golf si è allenato per tre mesi.
2. Bastiano, pratica il ciclismo e non è quello che si è allenato per cinque mesi.
3. Alice si è allenata per due mesi più dell’atleta che sta a Roma.
4. Chi pratica canottaggio non sta a Milano.
SOLUZIONE
10
Di conseguenza Carla si è allenata per 3 mesi e dal fatto1 pratica golf e abita a Roma.
Fatto 4. Sport: canottaggio ------> Città : Napoli. Sono fatti che riguardano Alice.
Pertanto, Bastiano abita a Milano.
Questo completa la tabella.
b) GRAFI
Un grafo si può pensare come l’astrazione di una carta geografica: per esempio il grafo rappresentato nella
figura seguente, descrive i collegamenti esistenti fra alcune (5) città: queste sono rappresentate da nodi di
nome n1, n2, …, n5 e i collegamenti sono rappresentati da segmenti tra i nodi, detti archi.
n3
5 4
3 6
n1 n5 n4
2
6
n2 3
A seconda del problema, gli archi possono essere percorsi in entrambe le direzioni (e in questo caso si parla
di archi non-diretti) oppure solo in una (archi diretti). Gli archi diretti si rappresentano mediante una freccia,
che va dal nodo di partenza a quello di destinazione.
In alcuni problemi, a ogni arco è associata una lunghezza, ovvero un numero, detta anche peso dell’arco.
Quando gli archi di un grafo hanno un peso, si dice che sono pesati e i pesi degli archi vengono rappresentati
come numeri scritti vicino alle frecce.
Il grafo rappresentato in figura ha archi non-diretti e pesati.
Come abbiamo visto nel paragrafo 1.3, un grafo può essere descritto mediante un elenco di termini, ciascuno
dei quali definisce un arco tra due nodi del grafo. Nel caso di grafi con archi non pesati, si usano termini con
due argomenti. I due argomenti sono i nomi dei nodi connessi dall’arco. Spesso (ma non in tutti i problemi!)
si userà il termine “arco” per archi non diretti e “freccia” per archi diretti. Quindi un arco non diretto e non
pesato, che connette i nodi x ed y, sarà descritto dal termine arco(x,y), mentre un arco diretto e non pesato,
che connette i nodi Bologna e Roma sarà descritto dal termine freccia(Bologna,Roma).
Nel caso di grafi con archi pesati, è necessario descrivere il peso, oltre che i due nodi collegati. Per questo
motivo si useranno termini con tre argomenti: i primi due sono i nomi dei nodi collegati e il terzo è un numero
che rappresenta il valore del peso.
11
Il grafo rappresentato dalla precedente figura, che ha archi non diretti e pesati, viene quindi descritto dal
seguente insieme di termini:
N.B. Dato un grafo, come quello della precedente figura, è facile scrivere l’insieme di termini che lo descrivono;
viceversa, disegnare il grafo a partire dall’elenco dei termini è meno ovvio (si vedano i problemi seguenti).
ESEMPIO 1
È dato un grafo con archi non diretti e pesati, descritto dal seguente elenco di termini:
arco(n1,n2,2) arco(n2,n3,2) arco(n3,n1,5)
arco(n4,n1,1) arco(n4,n2,4) arco(n4,n5,3)
Disegnare il grafo e trovare:
1. la lista L1 del percorso semplice più breve tra n5 e n3 e calcolarne la lunghezza K1;
2. la lista L2 del percorso semplice più lungo tra n5 e n3 e calcolarne la lunghezza K2.
L1
K1
L2
K2
SOLUZIONE
L1 [n5,n4,n1,n2,n3]
K1 8
L2 [n5,n4,n2,n1,n3]
K2 14
12
n1
1
3
5 n4 n5
2
n3 4
2 n2
Si noti che le lunghezze degli archi che compaiono nei termini (che rappresentano delle strade) non sono
(necessariamente) proporzionali a quelle degli archi del grafo (che sono, segmenti di retta).
Per rispondere alle due domande occorre elencare sistematicamente tutti i percorsi, che non passino più
volte per uno stesso punto, tra n5 e n3:
PERCORSO da n5 a n3 LUNGHEZZA
[n5,n4,n1,n2,n3] 3+1+2+2=8
[n5,n4,n1,n3] 3+1+5=9
[n5,n4,n2,n3] 3+4+2=9
[n5,n4,n2,n1,n3] 3+4+2+5=14
ESEMPIO 2
L’ufficio tecnico di un piccolo comune deve scegliere dove piazzare dei nuovi lampioni.
Il paese di cui si parla può essere pensato come un insieme di piazzette collegate da strade, ovvero come un
grafo con archi non diretti e non pesati, dove i nodi sono le piazze e gli archi sono le strade. Il grafo è descritto
dal seguente elenco di termini:
arco(n1,n2) arco(n2,n3) arco(n3,n1)
arco(n4,n1) arco(n4,n2) arco(n4,n5)
Ogni lampione illumina:
la piazza in cui è collocato,
le strade da essa uscenti
le piazze direttamente collegate alla piazza in cui si trova il lampione.
(es. un lampione in n1 illumina la piazza n1, le strade n1-n2,n1-n3,n1-n4 e le piazze n2,n3,n4)
Trovare:
− il numero minimo di lampioni che consente di illuminare tutte le piazze del paese;
− la lista delle piazze (cioè, dei nodi del grafo) su cui collocare tali lampioni, in modo che nessuna piazza
sia illuminata da due lampioni.
N.B.
la lista deve avere gli elementi in ordine crescente (n1<n2< …<n5).
SOLUZIONE
numero minimo di lampioni 2
lista delle piazze [n3,n5]
13
COMMENTI ALLA SOLUZIONE
Il grafo è il seguente.
n1
n4 n5
n3
n2
Un metodo risolutivo generale è: generare tutti i sottoinsiemi di vertici, e per ciascuno verificare se permette
di “illuminare” tutto il grafo; tra tutti quelli che soddisfano tale requisito, prendere quello/quelli con minor
numero di elementi.
Questo metodo può rapidamente diventare impraticabile: bastano già 5 nodi a renderlo difficoltoso.
Tuttavia, poiché occorre individuare un sottoinsieme con minor numero di elementi che soddisfa il requisito,
è ovvio che conviene generare ed esaminare i sottoinsiemi per cardinalità crescente. Il metodo quindi
diventa:
1. verificare se esiste un vertice che da solo “illumina” tutto il grafo;
2. generare tutte le coppie e verificare se ne esiste una che “illumina” il grafo;
3. generare tutte le triple e verificare se ne esiste una che “illumina” il grafo;
etc
Inoltre, in molti casi, semplici osservazioni sulla topologia del grafo possono portare immediatamente alla
soluzione. Nel caso in esame, è chiaro che per coprire n5, la soluzione deve contenere o n4 oppure n5.
Se si pone un lampione in n4, tutte le piazze risultano illuminate tranne n3. Quindi con un lampione in n3 ed
uno in n4 si illumina tutto il paese. Ciò consente di rispondere al primo quesito: il numero minimo di lampioni
per illuminare il paese è 2.
Si osservi, tuttavia che ponendo i due lampioni in n3 ed n4, le piazze n1 ed n2 sono illuminate da due diversi
lampioni. Esiste un’altra coppia di piazze in cui posizionare i lampioni in modo da illuminare tutte le piazze
ed evitare che una piazza sia illuminata da due lampioni? Proviamo a posizionare un lampione in n5 invece
che in n4. Tale lampione illumina n4 ed n5. Per illuminare le restanti 3 piazze, si può posizionare un secondo
lampione in n3: esso illumina n1, n2 ed n3, ma non n4 ed n5. Quindi la soluzione al secondo quesito è la lista
[n3,n5]
ESEMPIO 3
Paolo studia nella Repubblica di Indastria, una piccola nazione poco conosciuta ma molto moderna. Le
principali città di Indastria sono collegate tra loro da voli in elicottero. Paolo abita nella città di Sapienza
(dove ha sede l’università!) ma nel tempo libero vorrebbe visitare anche altre città, cercando di spendere il
meno possibile.
Per descrivere i voli tra le città di Indastria, si usano dei termini così definiti:
volo(<partenza>,<destinazione>,<costo>)
Nel mese corrente, i voli disponibili sono i seguenti:
volo(Laborilla,Romantika,199) volo(Sapienza,Musa,250)
volo(Musa,Sapienza,300) volo(Musa,Romantika,280)
volo(Laborilla,Vecchioborgo,420) volo(Burovilla,Vecchioborgo,300)
volo(Romantika,Vecchioborgo,210) volo(Burovilla,Musa,310)
14
volo(Musa,Laborilla,450) volo(Sapienza,Laborilla,300)
volo(Musa,Burovilla,220)
Un viaggio tra due città può essere descritto da una lista che contiene, in ordine, le città attraversate dal
viaggio, compresa quella di partenza e quella di arrivo. Ad esempio un viaggio da Musa a Romantika che
attraversa Sapienza e Laborilla è descritto dalla lista [Musa,Sapienza,Laborilla,Romantika].
Paolo approfitta delle attese tra un volo e il successivo per visitare la città in cui fa scalo, ma non vuole visitare
più di una volta una stessa città. Aiuta Paolo a pianificare i suoi viaggi, trovando:
1. Il nome C della città che ha il maggior numero di collegamenti, in arrivo o in partenza
2. La lista L1 del viaggio per andare da Burovilla a Romantika facendo un viaggio che attraversa
almeno altre due città (diverse da Burovilla a Romantika), ma non Sapienza
3. La lista L2 del viaggio per andare da Sapienza a Vecchioborgo spendendo il meno possibile
SOLUZIONE
C Musa
L1 [Burovilla,Musa,Laborilla,Romantika]
L2 [Sapienza,Laborilla,Romantika,Vecchioborgo]
S 300
300 250
L 199 R 280 M
Usando l’interpretazione mediante grafo, il primo quesito consiste nell’individuare il nodo per il quale la
somma tra il grado di entrata e il grado di uscita ha valore massimo. Ispezionando la figura si vede facilmente
che tale nodo è Musa che ha 2 archi entranti e 4 uscenti.
Il secondo e il terzo quesito ci chiedono individuare un viaggio, che non deve passare due volte nella stessa
città. Ciascun viaggio, quindi, corrisponde ad un cammino semplice sul grafo.
Per risolvere il secondo quesito, si devono esaminare i cammini semplici da Burovilla a Romantika. Da
Burovilla partono due voli, per Vecchioborgo e per Musa. Poiché Vecchioborgo non ha archi uscenti, il
cammino che cerchiamo deve proseguire per forza in Musa. Da Musa si può andare direttamente a
Romantika, ma tale viaggio non può essere quello chiesto, perché non attraversa almeno due città diverse
da quella di partenza e quella di arrivo. In alternativa, da Musa si può andare a Romantika attraversando
Laborilla oppure attraversando prima Sapienza e poi Laborilla.
Poiché ci viene richiesto di individuare un viaggio che non attraversa Sapienza, si ha
L1=[Burovilla,Musa,Laborilla,Romantika].
Per risolvere il terzo quesito, si devono esaminare tutti i cammini semplici da Sapienza a Vecchioborgo e
scegliere quello per il quale la somma dei pesi degli archi è minore.
15
Si parte da Sapienza e si elencano tutte le possibili prime destinazioni (cammini di lunghezza 1):
• [Sapienza,Laborilla]
• [Sapienza,Musa]
Si allungano i cammini considerando tutti gli archi che escono dai nodi terminali di ciascuno dei cammini:
• Da Laborilla escono archi verso Vecchioborgo e Romantika.
• Da Musa escono archi verso Laborilla, Romantika e Burovilla.
Per cui si generano i seguenti cammini di lunghezza 2:
• [Sapienza,Laborilla,Vecchioborgo]
• [Sapienza,Laborilla,Romantika]
• [Sapienza,Musa,Laborilla]
• [Sapienza,Musa,Romantika]
• [Sapienza,Musa,Burovilla]
È stato trovato un primo cammino che raggiunge la destinazione, evidenziato in grassetto.
Per tutti gli altri cammini, si ripete il processo di allungamento.
• Da Romantika esce un arco verso Vecchioborgo.
• Da Laborilla, escono archi verso Vecchioborgo e Romantika.
• Da Burovilla esce un arco verso Vecchioborgo.
Per cui si generano i seguenti cammini di lunghezza 3:
• [Sapienza,Laborilla,Romantika,Vecchioborgo]
• [Sapienza,Musa,Laborilla,Vecchioborgo]
• [Sapienza,Musa,Laborilla,,Romantika]
• [Sapienza,Musa,Romantika,Vecchioborgo]
• [Sapienza,Musa,Burovilla,Vecchioborgo]
Il processo di allungamento questa volta ha individuato ben 4 cammini di lunghezza 3 che raggiungono la
destinazione. Resta un solo cammino candidato, che continuiamo ad allungare.
Da Romantika esce un arco verso Vecchioborgo. Quindi individuiamo un solo altro cammino di lunghezza 4
che giunge a destinazione:
• [Sapienza,Musa,Laborilla,Romantika,Vecchioborgo]
Non vi sono più cammini candidati, quindi il procedimento termina. A questo punto non ci resta che
esaminare i cammini evidenziati in grassetto, e per ciascuno di essi calcolare il costo.
Riportiamo cammini e costi nella seguente tabella.
16
c) KNAPSACK
Illustriamo questa tipologia di problemi attraverso due esempi.
ESEMPIO 1
In un deposito di minerali esistono esemplari di vario peso e valore individuati da sigle di riconoscimento.
Ciascun minerale è descritto mediante il seguente termine di nome tab avente tre argomenti:
Disponendo di un piccolo motocarro con portata massima di 59 kg trovare la lista L delle sigle di due minerali
diversi che siano trasportabili contemporaneamente con questo mezzo e che abbiano il massimo valore
complessivo; calcolare inoltre questo valore V.
N.B. Le combinazioni corrispondono ai sottoinsiemi: cioè sono indipendenti dall’ordine; per esempio la combinazione
“m1,m4” è uguale alla combinazione “m4,m1”. Quindi per elencarle tutte (una sola volta) conviene costruirle sotto
forma di liste i cui elementi sono ordinati, come richiesto dal problema.
Costruite le combinazioni occorre individuare quelle trasportabili (cioè con peso complessivo minore o
eguale a 59) e tra queste scegliere quella di maggior valore.
N.B. Conviene elencare (costruire) prima tutte le combinazioni che iniziano col “primo” minerale, poi tutte quelle che
iniziano col “secondo” minerale, e così via, in modo da essere sicuri di averle considerate tutte.
ESEMPIO 2
In un deposito di minerali esistono esemplari di vario peso e valore individuati da sigle di riconoscimento.
Ciascun minerale è descritto mediante il seguente termine di nome tab avente tre argomenti:
I minerali possono essere spostati con carrelli di diversa portata su cui si possono mettere tre esemplari
(diversi).
− Disponendo di un carrello con portata massima di 180 kg, trovare la lista L1 delle sigle di tre minerali
diversi che siano trasportabili contemporaneamente e che abbiano il massimo valore complessivo.
− Disponendo di un carrello con portata massima di 185 kg, trovare la lista L2 delle sigle di tre minerali
diversi che siano trasportabili contemporaneamente e che abbiano il massimo valore complessivo.
− Disponendo di un carrello con portata massima di 200 kg, trovare la lista L1 delle sigle di tre minerali
diversi che siano trasportabili contemporaneamente e che abbiano il massimo valore complessivo.
N.B. Nella lista, elencare le sigle in ordine (lessicale) crescente; per le sigle usate si ha il seguente ordine:
m1<m2<m3< …
L1
L2
L3
SOLUZIONE
L1 [m1,m4,m6]
L2 [m1,m2,m6]
L3 [m2,m3,m6]
N.B. Le combinazioni corrispondono ai sottoinsiemi: cioè sono indipendenti dall’ordine; per esempio la combinazione
“m1, m2, m3” è uguale alla combinazione “m3, m2, m1”. Quindi per elencarle tutte (una sola volta) conviene costruirle
sotto forma di liste i cui elementi sono ordinati come richiesto dal problema.
Costruite le combinazioni, occorre individuare, per ogni carrello, quella di maggior valore.
d) PIANIFICAZIONE
In generale si parla di un progetto che per essere realizzato è suddiviso in varie attività A1, A2 ecc.
Per ogni attività, si conosce in quanti giorni viene svolta e quante sono le persone coinvolte.
Le attività devono succedersi opportunamente nel tempo perché, per esempio, una attività utilizza il prodotto
di altre: quindi le priorità sono descritte con coppie di sigle. Ad esempio, la priorità [A1,A2] indica che l’attività
A2 potrà essere iniziata solo dopo il completamento dell’attività A1.
Due sono le tecniche da usare: il diagramma di Pert e il diagramma di Gantt.
Illustriamo questa tipologia di problemi attraverso tre esempi.
ESEMPIO 1
La tabella che segue descrive le attività di un progetto (indicate rispettivamente con le sigle A1, A2, ...),
riportando per ciascuna di esse il numero di giorni necessari per completarla.
Attività Giorni
A1 2
A2 3
A3 4
A4 1
Le priorità tra le attività del progetto sono: [A1,A2], [A1,A3], [A2,A4], [A3,A4]
la prima attività è la A1 (non è mai presente in seconda posizione) e l’ultima attività è la A4 (non è mai
presente in prima posizione). Per ogni altra attività si individuano le precedenze:
A1 non ha precedenze
[A1,A2] indica che A2 deve essere eseguita appena terminata A1
[A1,A3] indica che A3 deve essere eseguita appena terminata A1;
A3 inizia nello stesse giorno in cui inizia A2.
[A2,A4], [A3,A4] indicano che A4 inizierà appena terminata la più lunga (in giorni) tra le attività
A2 e A3.
A4 è l’attività che completa il progetto.
la priorità viene rappresentata da una freccia che parte dall’attività iniziale e arriva all’attività finale
A5 8 A7 2
A2 3
A1 2 A4 1
A3 4
Per trovare il numero minimo N di giorni necessari per completare il progetto rispettando le priorità, servirà
calcolare la somma dei giorni necessari scegliendo l’attività più lunga, quando si valutando quelle che
possono essere svolte in contemporanea. Nel nostro caso, il numero minimo di giorni necessari per
completare il progetto sarà: 2 (giorni per completare A1) + 4 (giorni per completare la più lunga attività fra
A2 e A3) + 1 (giorni per completare A4) = 7.
Tutto questo si rappresenta aggiungendo sotto il diagramma di Pert la sequenza
numero giorni attività A1 ………. numero giorni attività più lunga ……. numero giorni attività A4
A2 3
A1 2 A4 1
A3 4
2 ……………………………. 4 …………………………….……1
ESEMPIO 2
Alcuni ragazzi decidono di costruire un ipertesto multimediale sugli avvenimenti significativi della loro
regione per la prossima stagione turistica. Per organizzare il progetto, dividono il lavoro in singole attività e,
per ciascuna di queste stabiliscono quanti di loro devono partecipare e stimano il tempo per portarla a
conclusione. La tabella che segue descrive le attività (indicate rispettivamente con le sigle A1, A2, A3, …),
riportando per ciascuna di esse il numero di ragazzi assegnato e il numero di giorni necessari per completarla.
20
ATTIVITÀ RAGAZZI GIORNI
A1 6 2
A2 4 2
A3 3 3
A4 6 2
A5 4 2
A6 5 1
N.B. Ai fini del problema non è importante conoscere la descrizione delle singole attività.
Le attività devono succedersi opportunamente nel tempo perché, per esempio, una attività utilizza il
prodotto di altre: quindi esistono delle priorità descritte con coppie di sigle; ogni coppia esprime il fatto che
l’attività associata alla sigla di destra (detta successiva) può iniziare solo quando l’attività associata alla sigla
di sinistra (detta precedente) è terminata. Ovviamente se una attività ha più precedenti, può iniziare solo
quando tutte le precedenti sono terminate.
In questo caso le priorità sono:
Trovare il numero N di giorni necessari per completare il progetto, tenuto presente che alcune attività
possono essere svolte in parallelo e che ogni attività deve iniziare prima possibile (nel rispetto delle priorità).
Inoltre, trovare il numero massimo RM di ragazzi che lavora contemporaneamente al progetto.
SOLUZIONE
N 10
RM 7
A2 2
A1 2 A4 2 A5 2 A6 1
A3 3
Il progetto si svolge 10 giorni: 2 (giorni per completare A1) + 3 (giorni per completare la più lunga attività fra
A2 e A3) + 2 (giorni per completare A4) + 2 (giorni per completare A5) + 1 (giorno per completare A6) .
Per rispondere alla seconda domanda si realizza un secondo diagramma detto diagramma di Gantt.
Questo riporta sull’asse verticale le attività (dall’alto verso il basso), sugli assi orizzontali il tempo, in questo
caso misurato in giorni. Su ogni asse orizzontale (parallelo a quello dei tempi e in corrispondenza a una
21
attività) è sistemato un segmento che indica l’inizio e la durata della corrispondente attività (e il numero di
ragazzi che devono svolgerla).
Così, per esempio, l’attività A1 inizia il giorno 1 e dura due giorni; quando è terminata, il giorno 3 possono
iniziare le attività A2 e A3 (che quindi si svolgono parzialmente in parallelo). L’attività A4 può iniziare
solamente quando è terminata sia A3 sia A2.
ATTIVITA'
A1 6 ragazzi
A2 4 ragazzi
A3 3 ragazzi
A4 6 ragazzi
A5 4 ragazzi
A6 5 ragazzi
1 2 3 4 5 6 7 8 9 10 GIORNI
Il Gantt conferma che il progetto dura 10 giorni e mostra che il numero massimo di ragazzi al lavoro
contemporaneamente è 7 (nei giorni 3 e 4).
ESEMPIO 3
La tabella che segue descrive le attività di un progetto (indicate rispettivamente con le sigle A1, A2, …),
riportando per ciascuna di esse il numero di persone assegnato e il numero di giorni necessari per
completarla.
ATTIVITÀ PERSONE GIORNI
A1 6 2
A2 3 3
A3 2 4
A4 6 1
A5 2 3
A6 2 4
A7 3 2
A8 2 4
A9 5 1
Trovare il numero N di giorni necessari per completare il progetto, tenuto presente che alcune attività
possono essere svolte in parallelo e che ogni attività deve iniziare prima possibile (nel rispetto delle priorità).
Inoltre, determinare PM: il numero massimo di persone che lavorano contemporaneamente al progetto.
(N.B. PM è anche il numero minimo di persone contemporaneamente disponibili necessarie per
attuare il progetto così pianificato).
SOLUZIONE
N 11
PM 11
22
COMMENTI ALLA SOLUZIONE
Per prima cosa, dai dati sulle priorità occorre disegnare il diagramma di Pert, cioè il grafo che ha come nodi
le attività e come frecce le precedenze.
A2 3 A5 3 A7 2
A1 2 A4 1 A6 4 A9 1
A3 4 A8 4
2………………………………………… 8 ……………………………………………………………….. 1
Il progetto si svolge in11 giorni: 2 (giorni per completare A1) + 8 (giorni per completare le attività A2,A5,A7
e A3,A8) + 1 (giorno per completare A9) .
Per la seconda risposta compiliamo il diagramma di Gantt tenendo conto che l’attività A1 inizia il giorno 1 e
dura due giorni; quando è terminata, il giorno 3 possono iniziare le attività A2, A3 e A4 (che quindi si svolgono
parzialmente in parallelo); inoltre l’attività A7, come altro esempio, può iniziare solamente quando è
terminata la A5.
ATTIVITA'
A1 6 persone
A2 3 persone
A3 2 persone
A4 6 persone
A5 2persone
A6 2 persone
A7 3 persone
A8 2 persone
A9 5 persone
1 2 3 4 5 6 7 8 9 10 11 GIORNI
Il Gantt conferma che il progetto dura 11 giorni e mostra che il numero massimo di persone al lavoro
contemporaneamente è 11 (il terzo giorno): quindi per realizzare il progetto occorre almeno la disponibilità
contemporanea di 11 persone.
23
e) CRITTOGRAFIA
In generale crittare (o criptare) un messaggio significa trasformarlo in una serie di simboli di difficile (se non
impossibile) comprensione utilizzando certe regole. Solo chi le conosce è in grado di ricostruire il messaggio
originale.
L’insieme delle regole utilizzate prende il nome di algoritmo di crittazione.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
W X Y U V N K L M O P Q R S T Z D E F A B C G H I J
SOLUZIONE
1 SWFT
2 PALIO DI SIENA
3 CIBP
2)Sempre utilizzando la tabella leggiamo la lettera nella seconda riga (verso il basso); il messaggio
in chiaro sarà formato dalle corrispondenti lettere nella prima riga.
P A L I O D I S I E N A
Z W Q M T U M F M V S W
1 2 3 4
M R E V C
E V C Y I
L Q D U B
A W G K P
24
IL CIFRARIO DI CESARE
È ancora un cifrario a sostituzione monoalfabetica in cui ogni lettera del testo in chiaro è sostituita nel testo
cifrato dalla lettera che si trova un certo numero di posizioni dopo nell'alfabeto. Questi tipi di cifrari sono
detti anche cifrari a sostituzione o cifrari a scorrimento a causa del loro modo di operare: la sostituzione
avviene lettera per lettera, scorrendo il testo dall'inizio. Il numero di posti di scorrimento è detto chiave. Ad
esempio, per la chiave 5 (la a “scorre” in avanti di 5 posti e diventa f) abbiamo
a b c d e f g h i j k l m n o p q r s t u v w x y z
5 f g h i j k l m n o p q r s t u v w x y z a b c d e
Il testo «olimpiadi di problem solving» viene cifrato come «tqnrunfin in uwtgqjr xtqansl»
In modo analogo il testo cifrato con tale chiave «knsj xjyynrfsf» viene decrittato come «fine settimana»
Al variare della chiave una stessa parola viene crittata in modo diverso.
Ad esempio, “roma” è “tqoc” in chiave 2 e “ligu” in chiave 20.
Esempio.
Usando un cifrario di Giulio Cesare:
1. crittare il messaggio “STAZIONE DI MILANO” con chiave 3;
2. decrittare la parola “GTQTLSF “sapendo che è stata utilizzata la chiave 5;
3. trovare la chiave con la quale “MELA” è stata crittata in “UMTI“
SOLUZIONE
1 VWDCLRQH GL PLODQR
2 BOLOGNA
3 8
1)Costruita la chiave 3
a b c d e f g h i j k l m n o p q r s t u v w x y z
3 d e f g h i j k l m n o p q r s t u v w x y z a b c
segue
S T A Z I O N E D I M I L A N O
V W D C L R Q H G L P L O D Q R
2) Utilizziamo la chiave 5
a b c d e f g h i j k l m n o p q r s t u v w x y z
5 f g h i j k l m n o p q r s t u v w x y z a b c d e
25
cercando ogni lettera nella seconda riga e scrivendo la corrispondente nella prima riga
G T Q T L S F
B O L O G N A
A I
B C D E F G H
1 2 3 4 5 6 7 8
La risposta è chiave 8.
a b c d e f g h i j k l m n o p q r s t u v w x y z
8 i j k l m n o p q r s t u v w x y z a b c d e f g h
N.B. Per individuare la chiave si può partire da una qualsiasi lettera e contare di quanti
posti scorre per giungere alla sua corrispondente.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A a b c d e f g h i j k l m n o p q r s t u v w x y z
B b c d e f g h i j k l m n o p q r s t u v w x y z a
C c d e f g h i j k l m n o p q r s t u v w x y z a b
D d e f g h i j k l m n o p q r s t u v w x y z a b c
E e f g h i j k l m n o p q r s t u v w x y z a b c d
F f g h i j k l m n o p q r s t u v w x y z a b c d e
G g h i j k l m n o p q r s t u v w x y z a b c d e f
H h i j k l m n o p q r s t u v w x y z a b c d e f g
I i j k l m n o p q r s t u v w x y z a b c d e f g h
J j k l m n o p q r s t u v w x y z a b c d e f g h i
K k l m n o p q r s t u v w x y z a b c d e f g h i j
L l m n o p q r s t u v w x y z a b c d e f g h i j k
M m n o p q r s t u v w x y z a b c d e f g h i j k l
N n o p q r s t u v w x y z a b c d e f g h i j k l m
O o p q r s t u v w x y z a b c d e f g h i j k l m n
P p q r s t u v w x y z a b c d e f g h i j k l m n o
Q q r s t u v w x y z a b c d e f g h i j k l m n o p
R r s t u v w x y z a b c d e f g h i j k l m n o p q
S s t u v w x y z a b c d e f g h i j k l m n o p q r
T t u v w x y z a b c d e f g h i j k l m n o p q r s
U u v w x y z a b c d e f g h i j k l m n o p q r s t
V v w x y z a b c d e f g h i j k l m n o p q r s t u
W w x y z a b c d e f g h i j k l m n o p q r s t u v
X x y z a b c d e f g h i j k l m n o p q r s t u v w
Y y z a b c d e f g h i j k l m n o p q r s t u v w x
Z z a b c d e f g h i j k l m n o p q r s t u v w x y
26
Per le altre lettere del messaggio si procede allo stesso modo ma utilizzando le successive lettere della
chiave; siccome in generale la chiave è più corta del messaggio, la stessa chiave verrà usata ripetutamente
fino a completare la crittazione del messaggio.
Con questo metodo lettere uguali possono avere cifrature differenti
1) STELLA
Scrivere le risposte ricordando che nel caso di più parole, ogni parola deve distanziarsi dall’altra di un SOLO
spazio.
SOLUZIONE
1 LKIECE
2 ER WHCMMLHBEI WVM GLQXIM IIMFZ
S T E L L A
T L R K E I T E R C E E
Dunque;
testo in chiaro S T E L L A
chiave T R E T R E
testo crittato L K I E C E
2. In questo caso per crittare dobbiamo prima eliminare gli spazi tra le parole trasformando
la frase nella lista
LASOLITUDINEDEINUMERIPRIMI
L A S O L I T U D I N E D E I N U M E R I P R I M I
T R E T R E T R E T R E T R E T R E T R E T R E T R
Per decrittare un messaggio, si considera la prima lettera del messaggio crittato e la prima lettera della
chiave; la lettera della chiave si usa per individuare la riga nella tavola di Vigenère. Individuata la riga si cerca
27
in essa l'elemento corrispondente alla lettera del messaggio crittato. Individuata la colonna, si considera la
lettera corrispondente sarà la prima lettera del messaggio decrittato. Si procede in modo analogo per il resto
delle lettere.
1) IIMFZ
Scrivere le risposte rispettivamente nella prima e seconda riga della tabella sottostante.
Nel caso di più parole, ogni parola deve distanziarsi dall’altra di un SOLO spazio.
SOLUZIONE
1 PRIMI
2 ORE DIECI IN PIAZZA
P R I M I
T I R I E M T F R Z
2. Si inizia costruendo la lista HIIWZIVZMGGHTQD ottenuta eliminando gli spazi tra le parole.
Successivamente per mezzo della tabella di Vigenère si decritta ottenendo il messaggio in chiaro
separando le parole.
testo crittato H I I WZ I V Z MG G MT Q D T
chiave T R E T R E T R E T R E T R E T
messaggio in chiaro O R E D I E C I I N P I A Z Z A
28
f) ROBOT E AUTOMI
ROBOT CLASSICO
In un foglio a quadretti è disegnato un “campo di gara”, con 14 quadretti in orizzontale e 5 in verticale
(vedi figura).
5
4 S
3 P
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Ogni casella è individuata da due numeri (interi); per esempio la casella contenente P è individuata da
essere nella quinta colonna (da sinistra) e nella terza riga (dal basso): brevemente si dice che ha coordinate
[5,3]; la prima coordinata (in questo caso 5) si dice ascissa e la seconda (in questo caso 3) si dice ordinata.
Le coordinate della casella contenente S sono [10,4] e di quella contenente la freccia sono [1,1].
La freccia può essere pensata come un robot, in questo caso rivolto verso destra; lo stato del robot può
quindi essere individuato da tre “valori”: due per le coordinate della casella che occupa e uno per indicare
il suo orientamento. Per quest’ultimo si possono usare i simboli della rosa dei venti: E, S, W, N: per indicare
che il robot è rivolto, rispettivamente, a destra, in basso, a sinistra, in alto (con riferimento a chi guarda il
foglio); lo stato del robot, rappresentato dalla freccia nella figura è [1,1,E].
Il robot può eseguire tre tipi di comandi:
– ruotare di 90 gradi in senso orario: comando o;
– ruotare di 90 gradi in senso antiorario: comando a;
– avanzare di una casella (nel senso della freccia, mantenendo l’orientamento): comando f.
Per indicare una rotazione di 180° useremo SEMPRE il doppio comando a,a.
Questi comandi possono essere concatenati in sequenze in modo da permettere al robot di compiere vari
percorsi.
La sequenza di comandi descritta dalla lista [f,f,f,f,a,f,f] fa spostare il robot dalla posizione e orientamento
iniziali mostrati in figura fino alla casella P; le caselle via via occupate (quella di partenza e quella di arrivo
comprese) sono quelle della lista:
[[1,1],[2,1],[3,1],[4,1],[5,1],[5,2],[5,3]].
Stessa casella di arrivo si raggiunge con la lista di comandi [a,f,f,o,f,f,f,f], ma il percorso è diverso ed è
descritto dalla lista
[[1,1],[1,2],[1,3],[2,3],[3,3],[4,3],[5,3]].
Inoltre, nel primo caso lo stato l’orientamento finale del robot è verso l’alto (stato [5,3,N]), mentre nel
secondo caso l’orientamento finale è verso destra (stato [5,3,E]).
ESEMPIO 1
In un campo di gara il robot si trova nella casella [2,8]) con direzione West e deve eseguire la seguente lista
di comandi [o,f,f,o,f,f,o,f,f].
Determinare:
1. lo stato S1 in cui si trova il robot prima di aver eseguito tutti i comandi
2. lo stato S2 in cui si trova il robot dopo aver eseguito tutti i comandi
SOLUZIONE
S1 [2,8,W]
S2 [4,8,S]
29
COMMENTI ALLA SOLUZIONE
La direzione è indicata con le iniziali delle parole Nord (alto), Sud (basso), Est (destra) e West (sinistra).
La lista di comandi è [o,f,f,o,f,f,o,f,f]. La posizione iniziale è (2,8) e la direzione iniziale del robot è West.
Quindi S1 è la lista [2,8,W].
Per determinare S2, è conveniente visualizzare il percorso, come nella figura che segue (che mostra solo
parzialmente il campo di gara, con il valore delle coordinate).
11
10
9
1 2 3 4 5 6 7 8
Osservando la figura è semplice determinare la sequenza di comandi che fa compiere tale percorso. Si deve
prestare attenzione all’orientamento del robot. Inizialmente il robot si trova in [2,8] con direzione West,
ovvero ha stato [2,8,W]. Il primo comando modifica la direzione, portandola a Nord, ovvero trasforma lo
stato in [2,8,N]. Il secondo comando fa percorrere un passo lungo la direzione del robot, e quindi lo stato
diviene [2,9,N].
Ragionando in modo analogo, si ricostruiscono tutti i movimenti, riassunti nella seguente tabella che mostra,
per ogni comando, l’evoluzione dello stato del robot.
Un nuovo modello di robot, oltre a eseguire movimenti tramite i comandi o, a ed f, che ben conosciamo, ha
una nuova caratteristica: la capacità di ripetere un determinato numero di volte delle sotto-liste di comandi.
In dettaglio il robot, oltre ai comandi o, a ed f, possiede il nuovo comando r.
Questo comando è seguito dal numero di ripetizioni, poi da una sequenza di comandi chiamata corpo
racchiusi entro i simboli < >
Esempio2. Al robot viene data la lista di comandi [f,r3<f,f,a>,a,f] e fatto partire dallo stato [3,3,N];
si sposta come segue:
1. esegue f da [3,3,N] a [3,4,N]
2. esegue tre volte r, ovvero
esegue f da [3,4,N] a [3,5,N]
esegue f da [3,5,N] a [3,6,N]
esegue a da [3,6,N] a [3,6,W]
esegue f da [3,6,W] a [2,6,W]
esegue f da [2,6,W] a [1,6,W]
esegue a da [1,6,W] a [1,6,S]
esegue f da [1,6,S] a [1,5,S]
esegue f da [1,5,S] a [1,4,S]
esegue a da [1,4,S] a [1,4,E]
3. esegue a da [1,4,E] a [1,4,N]
4. esegue f da [1,4,N] a [1,5,N]
Esempio3.
Flavia posiziona il suo nuovo robot nella casella [8,13] di un campo, con direzione E. Attiva il robot con la
seguente lista di comandi L=[a,r2<a,f,f>,f,r4<f,o,f,a>,f].
Quali saranno la posizione P1 e la direzione D1 dopo aver eseguito il primo dei due comandi r? Scrivi P1 sotto
forma di lista di coordinate e D1 come singola lettera nella tabella sottostante.
Quali saranno la posizione P2 e la direzione D2 dopo aver eseguito l'intera lista di comandi? Scrivi P2 sotto
forma di lista di coordinate e D2 come singola lettera nella tabella sottostante.
SOLUZIONE
P1 [6,11]
D1 S
P2 [2,5]
D2 S
inizio [ 8 , 13 , E ]
a [ 8 , 13 , N ]
1 a [ 8 , 13 , W ]
1 f [ 7 , 13 , W ]
1 f [ 6 , 13 , W ]
2 a [ 6 , 13 , S ]
2 f [ 6 , 12 , S ]
2 f [ 6 , 11 , S ] P1=[6,11] D1= S
f [ 6 , 10 , S ]
1 f [ 6 , 9 , S ]
1 o [ 6 , 9 , W ]
1 f [ 5 , 9 , W ]
1 a [ 5 , 9 , S ]
2 f [ 5 , 8 , S ]
2 o [ 5 , 8 , W ]
2 f [ 4 , 8 , W ]
2 a [ 4 , 8 , S ]
3 f [ 4 , 7 , S ]
3 o [ 4 , 7 , W ]
3 f [ 3 , 7 , W ]
3 a [ 3 , 7 , S ]
4 f [ 3 , 6 , S ]
4 o [ 3 , 6 , W ]
4 f [ 2 , 6 , W ]
4 a [ 2 , 6 , S ]
f [ 2 , 5 , S ] P2=[2,5] D2= S
Per trovarle più velocemente, è utile osservare che il primo comando r, ad ogni ripetizione sposta in avanti
il robot di due posizioni e gira verso sinistra, mentre il secondo comando r esegue ad ogni ripetizione un
movimento che complessivamente equivale a spostare il robot “in diagonale”, ovvero lo sposta di una
posizione lungo l'asse delle X e di una lungo l'asse delle Y.
L’ ultimo modello di robot, oltre a eseguire movimenti tramite i comandi o, a ed f, ha una nuova
caratteristica: la capacità di memorizzare e richiamare sotto-liste di comandi.
Una sotto-lista è una sequenza di comandi a cui viene attribuito un numero identificativo, e che può essere
inserita all'interno di un'altra sequenza di comandi proprio utilizzando il numero identificativo. In dettaglio il
robot oltre a o, a ed f, esegue due nuovi comandi:
• comando s: questo comando è seguito dal numero identificativo, poi da una sequenza di comandi
chiamata corpo e infine dal simbolo | che indica la fine del corpo
o un esempio è s3a,f,o,f,f|in cui 3 è il numero identificativo e a,f,o,f,f è il corpo
o l'esecuzione di s non provoca alcuno spostamento del robot; accade invece che il robot
memorizza al suo interno il corpo del comando, come sotto-lista di comandi che viene
identificata dal numero identificativo
32
o attenzione: quando il robot esegue il comando s, non esegue i comandi che formano il corpo
del comando
• comando c: questo comando è seguito da un numero identificativo
o un esempio è c3 in cui 3 è numero identificativo
o quando il robot esegue un comando c, se ha eseguito in precedenza un comando s che
aveva lo stesso numero identificativo del comando c, allora il robot esegue tutti i comandi
del corpo di tale comando s; altrimenti il robot non fa nulla e passa ad eseguire il prossimo
comando della lista
Ad esempio, se al robot viene data la lista di comandi [f,s1f,f,a|,f,a,c2,f,c1,f], il robot si comporta come
segue:
1. esegue f
2. esegue s seguito da 1, ovvero memorizza al suo interno il corpo f,f,a associato al numero
identificativo 1
3. esegue f e poi a (sono i comandi che vengono subito dopo il simbolo |
4. esegue il comando c seguito da 2: poiché non è stato eseguito in precedenza un comando s con
numero identificativo pari a 2, il robot non fa nulla
5. esegue f (è il comando che segue c2)
6. esegue il comando c seguito da 1: poiché è stato eseguito in precedenza il comando s con numero
identificativo pari a 1, il robot esegue i comandi del corpo di tale comando s, ovvero f,f,a
7. esegue f (è il comando che segue c1)
Pertanto la lista degli effettivi spostamenti di questo robot è [f,f,a,f,f,f,a,f]
ESEMPIO 3
Gianluca posiziona il suo robot con memoria sul campo di gara. Lo stato del robot è [11,6,N]. Gianluca attiva
il robot con la seguente lista di comandi:
L1 =[s2f,f,o,f|,a,c2,f]
Quale sarà lo stato finale S1 del robot, dopo aver eseguito tutti i comandi di L1?
Sposta poi il robot, portandolo nello stato [18,18,E], e lo attiva con la seguente lista di comandi:
L2 =[f,s5f,o,f,a|,f,c4,c5,a,c5,f]
Quale sarà lo stato finale S2 del robot, dopo aver eseguito tutti i comandi di L2?
Infine lo sposta nello stato [15,32,S] , e lo attiva con la seguente lista di comandi:
L3 =[s1a,a,f,f|,o,c1,a,c1]
Quale sarà lo stato finale S3 del robot, dopo aver eseguito tutti i comandi di L3?
SOLUZIONE
S1 [9,8,N]
S2 [22,19,N]
S3 [17,30,S]
33
Inizio [ 11 , 6 , N ]
a [ 11 , 6 , W ]
f [ 10 , 6 , W ]
f [ 9 , 6 , W ]
o [ 9 , 6 , N ]
f [ 9 , 7 , N ]
f [ 9 , 8 , N ] S1
La lista di comandi L2 inizia spostando il robot in avanti. Poi memorizza la sotto-lista [f,o,f,a] con numero
identificativo 5, e non sposta il robot. Dopo la definizione, c'è un comando che sposta il robot in avanti.
Successivamente c'è il comando c con numero identificativo 4: poiché in precedenza non è stato
memorizzato s 4, il robot non si sposta. Successivamente il robot esegue il comando
c5 (la sotto-lista [f,o,f,a]). Il comando successivo a, ruota il robot in senso antiorario. Poi c'è di nuovo il
comando c5, e quindi il robot esegue per la seconda volta la sotto-lista [f,o,f,a]. Infine, l'ultimo comando
sposta in avanti il robot. Quindi la lista L2 è equivalente alla seguente lista di un robot classico
[f,f,f,o,f,a,a,f,o,f,a,f]. Eseguendo tali comandi si trova la risposta al quesito.
Inizio [ 18 , 18 , E ]
f [ 19 , 18 , E ]
f [ 20 , 18 , E ]
f [ 21 , 18 , E ]
o [ 21 , 18 , S ]
f [ 21 , 17 , S ]
a [ 21 , 17 , E ]
a [ 21 , 17 , N ]
f [ 21 , 18 , N ]
o [ 21 , 18 , E ]
f [ 22 , 18 , E ]
a [ 22 , 18 , N ]
f [ 22 , 19 , N ] S2
La lista di comandi L3 inizia con la memorizzazione della sotto-lista [a,a,f,f] con numero identificativo 1. Poi
c'è un comando che ruota il robot in senso orario. Successivamente il robot esegue il comando c1 (esecuzione
della sotto-lista [a,a,f,f]). Il comando successivo è a, che ruota il robot in senso antiorario. Infine, c'è
nuovamente il comando c1 (esecuzione per la seconda volta della sotto-lista [a,a,f,f]).
Quindi la lista L3 è equivalente alla seguente lista di un robot classico [o,a,a,f,f,a,a,a,f,f]. Eseguendo tali
comandi si trova la risposta al quesito.
34
Inizio [ 15 , 32 , S ]
o [ 15 , 32 , W ]
a [ 15 , 32 , S ]
a [ 15 , 32 , E ]
f [ 16 , 32 , E ]
f [ 17 , 32 , E ]
a [ 17 , 32 , N ]
a [ 17 , 32 , W ]
a [ 17 , 32 , S ]
f [ 17 , 31 , S ]
f [ 17 , 30 , S ] S3
Il robot è costituito da un braccio meccanico che si muove secondo un sistema di riferimento che invece di
utilizzare coordinate cartesiane come [X,Y,D] per determinare la propria posizione e verso, utilizza distanze,
rappresentate dagli angoli, rispetto ai punti cardinali Nord, Est, Sud e Ovest. Un sistema di riferimento del
genere viene chiamato polare, anziché cartesiano.
I comandi per il braccio meccanico sono formati da
- un simbolo iniziale che può essere + o –: se il simbolo iniziale è + allora il braccio si muoverà verso
destra (senso orario), se invece è – verso sinistra (senso antiorario)
- un numero che rappresenta la distanza che deve percorrere il braccio in gradi; questo numero può
essere 0° se il robot rimane fermo, 30°, 60°, 90°, 120°, 150°, 180°, 210°, 240°, 270° 300°,330°,360°
(per visualizzare meglio lo spostamento, si può far riferimento alla figura in basso dove viene
indicato che una fetta del cerchio corrisponde a 30°, quindi due fette saranno 60°, tre 90° ecc.)
Lo stato del braccio meccanico è rappresentato dalla coppia [C,G]:
- C: rappresenta il punto cardinale alla destra del braccio e può essere N(Nord), S(Sud), E(Est),
W(Ovest)
- G: rappresenta la distanza dal punto cardinale C in gradi e può assumere i valori 0° se il braccio si
trova girato verso uno dei punti cardinali, 30°, 60°, 90°, 120°, 150°, 180°, 210°,
240°,270°,300°,330°,360°
Per capire meglio il funzionamento del braccio meccanico lo si può immaginare al centro di un cerchio del
tipo:
Supponiamo, per esempio, che inizialmente il braccio si trovi nello stato [E,30°], quindi girato verso il punto
P1 indicato in figura, e che esegua i comandi L1 = [+120°,-30°,+180°]:
− Il primo comando +120° fa ruotare in senso orario il braccio che ora si trova nello stato [S,0°] (punto
P2 in figura)
35
− Il secondo comando -30° fa ruotare in senso antiorario il braccio che ora si trova nello stato [S,30°]
(punto P3 in figura)
− Il terzo comando +180° fa ruotare in senso orario il braccio che ora si trova nello stato [N,30°]
(punto P4 in figura)
Esempio. Un robot braccio meccanico è posizionato nello stato [E,30°] ed esegue la lista
di comandi L1 = [+90°,-30°,+180°,-330°,+60]
SOLUZIONE
Il braccio meccanico parte dallo stato [E,30°] (P1) ed esegue la lista di comandi
1. comando +90°: dallo stato [E,30°] passa allo stato [S,30°] (P2)
2. comando -30°: dallo stato [S,30°] passa allo stato [S,60°] (P3)
36
3. comando +180°: dallo stato [S,60°] passa allo stato [N,60°] (P4)
4. comando -330°: dallo stato [N,60°] passa allo stato [N,30°] (P5)
5. comando +60°: dallo stato [N,30°] passa allo stato [E,60°] (P6)
37
Dunque, S1=[[S,30°],[S,60°],[N,60°],[N,30°],[E,60°]]
Sul fianco di una montagna esistono numerose sorgenti. L’acqua di una sorgente, che si suppone fluire in
modo continuo e costante, può scorrere a valle attraverso uno o più canali. Può avvenire che uno o più canali
convergano in un punto in cui esiste un’altra sorgente; in tal caso, la loro acqua si aggiunge a quella fornita
dalla sorgente raggiunta. Questa situazione è descrivibile con un reticolo di nodi (le sorgenti) collegati da
archi (i canali). Nel seguito per "litri erogati” si intenderà “litri di acqua erogati al minuto)
Di sorgenti ne esistono di due tipi:
• semplice descritta dalla tabella:
Da questa sorgente escono uno o più canali, dai quali uscirà la stessa quantità d’acqua
Esempio. La sorgente s(a,12) ha tre canali in uscita. Allora in ogni canale scorreranno 4 litri
d’acqua (4 l x 3 uscite =12 l totale)
Questa sorgente ha sempre due sole uscite; la valvola permette di diversificare le quantità
d’acqua uscenti dal canale destro rispetto a quello di sinistra
38
Esempi
r(a,b) descrive un canale che collega la sorgente a con la b e nel percorso non ha perdite
r(b,f,2) descrive un canale che collega le sorgenti b,f e nel percorso perde 2 litri
r(c,f,0.4) descrive un canale che collega le sorgenti c,f e nel percorso perde 0.4 litri
N.B. Nel caso di perdite “decimali” non utilizzeremo la virgola ma il punto come separatore.
Quando l’acqua di un canale raggiunge una sorgente essa si distribuisce equamente nei canali
che partono da questa.
Esempio 1.
Dai canali a monte di una sorgente, che eroga 7 litri di acqua al minuto, giungono 8 litri.
A valle della sorgente partono tre canali. In ognuno di essi scorreranno (8+7)/3 = 5 litri al minuto.
Esempio 2
Dai canali a monte di una sorgente con valvola, che eroga 7 litri di acqua al minuto, giungono 8 litri.
Dalla sorgente escono 5 litri nel canale destro e 2 litri in quello sinistro.
Allora:
gli 8 litri a monte si ripartiscono equamente nei due canali
nel canale di destra scorreranno 9 litri (5 litri della sorgente + 4 litri dai canali a monte)
nel canale di sinistra scorreranno 6 litri (2 litri della sorgente + 4 litri dai canali a monte)
Nel seguito alcuni esempi di esercizi che verranno proposti nelle gare.
ESERCIZIO 1
Un reticolo di canali è descritto dalle seguenti due tabelle:
s(a,6), s(b,5), s(c,1), s(d,4), s(e,3), s(f,2)
r(a,c), r(a,d), r(b,d), r(c,e),r(d,e), r(d,f)
Disegnare il reticolo, evitando incroci, e determinare la quantità di acqua che esce dai nodi c, e, f.
SOLUZIONE
c 4
e 13
f 8
39
ESERCIZIO 2
Un reticolo di canali è descritto dalle seguenti due tabelle:
sv(a,6,2), s(b,2), s(c,3), sv(d,8,6), s(e,5), s(f,2)
r(a,b), r(a,c,0.5), r(d,c,1), r(d,e), r(b,f,1), r(c,f,0.8), r(e,f,0.3)
determinare la quantità di acqua che esce dal nodo-sorgente f.
SOLUZIONE
f 22.4
40
av(6,2) dv(8,6)
4 2-0.5 2-1
6
b(2) c(3)
6-1
5.5-0.8 e(5)
f(2) 11-0.3
22.4
Il canale di sinistra della sorgente av non ha perdite, per cui a b giungono 4 litri;
il canale di destra della sorgente av ha 0.5 litri di perdite, per cui a c giungono 1.5 litri (2–0.5);
da b ad f c’è 1 litro di perdita, per cui ad f giungono 5 litri (4+2-1);
da dv a c c’è 1 litro di perdita, per cui in c giunge 1 litro (2-1);
da dv a e non ci sono perdite, per cui in e giungono 6 litri;
in f arrivano:
5 litri da b
4.7 litri da c (1.5+1+3-0.8)
10.7 litri da e (6+5-0.3)
-----------------------------------------
totale 20.4 litri
Dal canale di f escono dunque 22.4 litri (20.4+2).
Osservazione. Con i dati del problema è possibile tracciare un secondo reticolo perfettamente valido
in cui le sorgenti a e d sono scambiate.
dv(8,6) av(6,2)
c(3) b(2)
e(5)
f(2)
Naturalmente i flussi nei vari canali variano. In questo caso come per magia (la verifica viene lasciata al
lettore) la portata finale dal canale f è ancora 22.4 litri.
In generale i due reticoli danno flussi finali differenti. Pertanto, tra i dati del problema
è necessario assegnare anche il grafo del reticolo per rendere univoca la risposta.
ESERCIZIO 3
Una rete di canali è descritta dalle due tabelle:
s(a,6), sv(b,7,2), sv(c,10,3), s(d,4), s(e,5);
41
r(a,c,0.4), r(b,c,1),r(b,e), r(c,d), r(c,e,0.5);
Se la rete è la seguente:
a(6) bv(7,2)
cv(10,3)
d(4) e(5)
SOLUZIONE
nodo finale con maggior portata in uscita d
portata in uscita (verso valle) di tale nodo 15.3
a(6) bv(7,2)
6-0.4 5-1
cv(10,3)
3 + 4.8 - 0.5
7 + 4.8
d(4) e(5)
15.8 14.3
ESEMPIO2. Coda di persone davanti ad una sola cassa di un autogrill per acquisti
Struttura di servizio: unica cassa dell’autogrill
Utente: persona che desidera acquistare caffè, bibite, panini ecc.
Unità di tempo: tempo medio per fare una ordinazione e pagare
ESERCIZIO 1A. Alla stazione di lavaggio ci sono in coda cinque auto A, B, C, D, E in attesa di lavaggio
secondo ordine alfabetico. Se l’unità di tempo (di lavaggio) per quella stazione è di 20 minuti e sapendo
l’auto A inizia alle ore 9:00:
1) a quale ora inizierà il lavaggio dell’auto C?
2) quando terminerà il lavaggio delle cinque auto?
SOLUZIONE
Basta costruire la seguente tabella gestione lavaggi
43
Inizio lavaggio Fine lavaggio auto
9:00 9:20 A
9:20 9:40 B
9:40 10:00 C
10:00 10:20 D
10:20 10:40 E
ESERCIZIO 1B. Alla stazione di lavaggio sono arrivate cinque auto A, B, C, D, E nel seguente ordine
Sapendo che la stazione apre alle ore 9:00, non c’è nessuna auto nel lavaggio e l’unità di tempo (di
lavaggio) è di 20 minuti, si chiede:
SOLUZIONE
Tenendo conto del tempo di arrivo abbiamo la seguente tabella
Per rispondere alle altre domande dobbiamo costruire la tabella gestione lavaggi
44
da cui risulta:
l’auto A termina il lavaggio alle 9:25
la penultima auto inizia il lavaggio alle ore 10:05
le cinque auto sono tutte lavate per le ore 10:45
ESEMPIO 2A
Premessa.
In un ufficio postale c’è un solo sportello attivo. Le persone che si recano in quell’ufficio fanno solo una
delle seguenti due azioni:
• pagamento di una bolletta (B)
• spedizione di un pacco (P)
Per questo, ad ogni persona che arriva viene assegnato un codice alfanumerico che contiene la lettera
relativa all’azione da compiere (B oppure P) seguita dall’ora di entrata. Ad esempio:
B8:15 indica che la persona è entrata alle 8:15 per pagare una bolletta
P9:40 indica che la persona è entrata alle 9:40 per spedire un pacco
Inoltre:
• a parità di arrivo viene data precedenza alla persona che deve pagare una bolletta;
• per il pagamento di una bolletta si ritiene di completare l’azione in 1 unità di tempo mentre per la
consegna di un pacco si ritiene di completare l’azione in 2 unità di tempo
PROBLEMA
La tabella sottostante riporta i codici e i nomi delle persone che si sono recate questa mattina all’ufficio
postale di Porto Coretti, ed è stata compilata tenendo conto dell’ordine di arrivo:
Sapendo che lo sportello apre alle ore 8:15 e l’unità di tempo è di cinque minuti si chiede:
SOLUZIONE
Iniziamo con il costruire la tabella gestione B/P tenendo conto delle regole di priorità
nome persona gestione tempo impiegato
Maurizio B 8:15 – 8:20
Michele P 8:20 – 8:30
Annalisa B 9:30 – 9:35
45
Mario P 10:01 – 10:11
Martina P 10:15 – 10:25
ESEMPIO 2B
Premessa.
In un ufficio postale c’è un solo sportello attivo. Le persone che si recano in quell’ufficio fanno solo una
delle seguenti due azioni:
• pagamento di una bolletta (B)
• spedizione di un pacco (P)
Per questo, ad ogni persona che arriva viene assegnato un codice alfanumerico che contiene la lettera
relativa all’azione da compiere (B oppure P) seguita dall’ora di entrata. Ad esempio:
B-1-8:20 indica che la persona è entrata alle 8:20 per pagare una bolletta
B-2-8:25 indica che la persona è entrata alle 8:25 per pagare due bollette
P-1-9:30 indica che la persona è entrata alle 9:30 per spedire un pacco
P-5-9:30 indica che la persona è entrata alle 9:30 per spedire cinque pacchi
Inoltre:
• a parità di arrivo viene data precedenza alla persona che deve pagare le bollette;
• per il pagamento di una bolletta si ritiene di completare l’azione in 1 unità di tempo mentre per la
consegna di un pacco si ritiene di completare l’azione in 2 unità di tempo
PROBLEMA
La tabella sottostante riporta i codici e i nomi delle persone che si sono recate questa mattina all’ufficio
postale di Porto Coretti, ed è stata compilata tenendo conto dell’ordine di arrivo:
Sapendo che lo sportello apre alle ore 8:15 e l’unità di tempo è di cinque minuti si chiede:
SOLUZIONE
Iniziamo con il costruire la gestione B/P tenendo conto delle regole di priorità
46
Cesare B 8:15 – 8:25
Michela P 8:25 – 8:35
Anna B 9:30 – 9:50
Piero P 10:01 – 10:21
Martina P 10:21 – 11:11
1) L = [Cesare,Michela,Anna,Piero,Martina]
2) Piero termina la consegna dei pacchi alle ore 10:21
3) La coda si esaurisce alle ore 11:11
Una PILA (o stack) è una sequenza di elementi in cui è possibile aggiungere o togliere elementi soltanto ad
un estremo (la testa della sequenza). Una pila è un caso speciale di sequenza in cui l’ultimo elemento è
anche il primo ad essere rimosso e non è possibile accedere ad alcun elemento che non sia quello in testa.
Tale meccanismo è detto LIFO, dall’ inglese “Last In First Out”, ovvero l ‘ultimo entrato è il primo ad uscire.
Esempi di PILA:
• un tubetto di pastiglie ha un meccanismo di accesso LIFO, l’ultima inserita è la prima ad uscire;
• una pila di piatti;
• una pila di giornali.
In una PILA ci sono due operazioni fondamentali: quella di inserimento di un elemento in cima alla pila
(push) e quella di estrazione dell’elemento presente in cima alla pila (pop).
La figura illustra il caricamento (push) di una PILA con gli elementi 2,3,4,5,6
e la successiva estrazione (pop) degli elementi 6, 5, 4, 3, 2
47
ESEMPIO1.
Un bibliotecario sa che il giorno 4 gennaio 2024 quattro persone Lucia, Marta, Alberto e Susanna
verranno a ritirare dei libri.
Precisamente:
Lucia verrà alle ore 9:15 a ritirare i libri A, B, F
Marta verrà alle ore 9:30 a ritirare i libri C, D
Alberto verrà alle ore 10:00 a ritirare il libro R
Susanna verrà alle ore 11:00 a ritirare i libri X, Y, Z.
I libri dovranno essere consegnati dal bibliotecario alle persone, nell’ordine indicato.
Come deve organizzare il bibliotecario la “pila di libri” per poterli consegnare velocemente?
Scrivere la lista L di caricamento (push) nella cella sottostante.
SOLUZIONE
I libri devono essere caricati (push) in ordine inverso al loro ritiro (libri per Susanna, libro per Alberto ecc.)
ESEMPIO2
Un fuochista sta preparando uno spettacolo pirotecnico per la propria città. L’obiettivo del fuochista è
quello di inserire i colori nell’ordine giusto all’interno della scatola pirotecnica, che poi verrà accesa
durante l’esecuzione dello spettacolo in modo da ottenere la sequenza cromatica desiderata.
colore <11,blu>
colore <12,giallo>
colore <14,magenta>
48
colore <16,rosso>
colore <15,verde>
Il cliente ha richiesto che la sequenza cromatica che deve essere vista in cielo sia:
Si chiede di scrivere la lista di caricamento della scatola pirotecnica con i codici colori:
SOLUZIONE
L [14,12,15,11,16]
Essendo la politica della pila, una politica LIFO, l’effetto che si ottiene è quello di invertire i dati rispetto
all’ordine di ingresso; quindi, la lista di caricamento (push) dei dati sarà
14 12 15 11 16
magenta giallo verde blu rosso
16 11 15 12 14
rosso blu verde giallo magenta
4. ELEMENTI DI PSEUDOLINGUAGGIO
4.0 CHE COSA SAPPIAMO .....
Ormai da diversi anni esistono congegni elettronici chiamati computer che sono in grado di
aiutare gli esseri umani a risolvere problemi.
Uno o più esseri umani :
pensano ad un problema
lo descrivono in un testo, utilizzando una lingua parlata (linguaggio naturale) e inserendo magari delle
formule.
Per trasferire il problema al computer “traducono il testo” in una procedura utilizzando termini e
simboli dello pseudolinguaggio.
Questa procedura sarà poi inserita in un computer utilizzando un “linguaggio di programmazione”
o qualche “applicativo”.
Finalmente il computer , eseguendo tale procedura ,fornirà possibili risposte al problema.
ESEMPIO
Scrittura problema in linguaggio naturale
Problema
Il lato di un quadrato misura 6 m. Calcolare il perimetro P e l’area A di tale quadrato.
Dato del problema : lato del quadrato L = 6 m
49
Formule risolventi : perimetro quadrato P = L*4
area quadrato A = L*L
a)LE VARIABILI
Iniziamo con una metafora.In una cassettiera ci sono dei cassetti individuati dalle lettere A, B, C, D, E, F. In
ciascun cassetto ci può essere un solo foglio su cui è scritto un numero intero. La scrittura
C = A+B;
significa: “sommare i numeri scritti sui fogli dei cassetti A e B, scrivere il risultato su un nuovo foglio e inserire
questo foglio nel cassetto C, dopo aver eliminato il foglio (eventualmente) presente in C”. Se all’inizio nei fogli
di A e B sono scritti rispettivamente i numeri 12 e 7, a operazione eseguita in C si trova un foglio su cui è
scritto 19.
Così, la scrittura:
D = C+A-B;
significa:
sommare i numeri scritti sui fogli dei cassetti C e A,
sottrarre alla somma il numero scritto sul foglio del cassetto B,
scrivere il risultato su un nuovo foglio e inserire questo foglio nel cassetto D dopo aver eliminato il foglio
(eventualmente) presente in D”.
In questo caso se all’inizio nei fogli di A,B e C sono scritti rispettivamente i numeri 12,7 e 10, a operazione
eseguita in D si trova un foglio su cui è scritto 15 (12+10-7).
50
N.B. Per brevità diciamo “il numero contenuto in C” invece di “il numero scritto sul foglio contenuto in C”.
Invece di parlare di cassetti e di numeri scritti su fogli, si può ricorrere a una descrizione, più astratta.
Le lettere maiuscole A, B, C, … sono chiamate “variabili” (invece di cassetti) e i numeri sui fogli sono detti
“valori” di quelle variabili.
METAFORA ASTRAZIONE
cassetto A variabile A
foglio in A contenuto della variabile A
numero scritto sul foglio valore della variabile A
In una procedura le variabili utilizzate vengono dichiarate all’inizio e si specifica quali sono
i valori che possono accettare (per ora solo numeri interi).
Ad esempio se A, B, C sono tre variabili, in pseudolinguaggio si scrive :
variables A, B, C integer;
N.B. Si usa spesso dire che l’istruzione read assegna i valori in input, mentre
l’istruzione write mostra i valori in output.
La prima riga indica che inizia la procedura a cui è stato dato un NOME (QUADRATO)
procedure QUADRATO;
Nella terza riga si assegna alla variabile L un valore numerico (misura del lato)
read L;
N.B. Ogni riga della procedura si dice statement (o istruzione) e termina sempre con “;”.
procedura Lettura
51
procedure CALCOLI; la procedura ha nome CALCOLI
variables A,B,C,D integer; ci sono quattro variabili A,B,C,D di tipo numerico intero
read A,B,C; alle variabili A,B,C sono assegnati valori numerici
D = A+B; in D si “scrive” (memorizza) la somma di A e B
A = D+C; in A si memorizza la somma di D e C
B = A*B; in B si memorizza il prodotto tra A e B
write A, B, D; si stampano i valori attuali di A,B,D
endprocedure; la procedura è terminata
Simulare l’esecuzione di una procedura significa creare una tabella in cui vengono dati valori numerici
a certe variabili (istruzione read) e si svolgono tutte le successive azioni fino al write compreso.
A B C D
read A, B, C 5 8 3
D= A + B 5 8 3 13
A= D + C 16 8 3 13
B= A * B 16 128 3 13
write A,B,D 16 128 13
N.B. In questa procedura le variabili A e B hanno alla fine valori diversi da quelli iniziali. Ricordando la
metafora delle variabili, è successo che in questi cassetti sono stati tolti i fogli iniziali e introdotti altri fogli
con scritti numeri derivati da calcoli successivi.
procedure PROVA1;
variables A, B, C, D integer;
read A, B;
C = A + B;
D =A * B;
A =C+B;
B = (A+B) *(A- B);
write C, D, A, B;
endprocedure;
I valori in input sono: 4 per A, 2 per B; determinare i valori di output di A, B, C, D e scriverli nella seguente
tabella.
52
A
B
C
D
SOLUZIONE
A 8
B 60
C 6
D 8
A B C D
read A,B 4 2
C=A+B 4 2 4+2=6
D=A*B 4 2 6 4*2=8
A=C+B 6+2=8 2 6 8
B=(A+B)*(A-B) (8+2)*(8-2)=60
write A,B,C,D 8 60 6 8
Notare che i valori di certe variabili cambiano più volte: per esempio le variabili A e B acquisiscono un primo
valore in input e successivamente cambiano valore con le ultime due operazioni.
procedure PROVA2;
variables A, B, C, D integer;
D =0;
read A, B, C;
D = A + B + C + X;
write D;
endprocedure;
Trovare, tra le variabili dichiarate nella procedura, il nome da sostituire a X per ottenere in output 21 per D
se i valori in input sono 2 per A, 5 per B e 7 per C.
SOLUZIONE
nome della variabile da sostituire a X C
Una altra maniera di procedere alla soluzione è di esaminare tutti i possibili casi: poiché sono dichiarate
quattro variabili: A, B, C, D, allora si possono esaminare i risultati delle quattro possibili sostituzioni:
l’espressione A + B + C + A vale 2 + 5 + 7 + 2 = 16
l’espressione A + B + C + B vale 2 + 5 + 7 + 5 = 19
l’espressione A + B + C + C vale 2 + 5 + 7 + 7 = 21
l’espressione A + B + C + D vale 2 + 5 + 7 + 0 = 14
La soluzione segue immediatamente.
Ricordiamo che i simboli “<” e “>” significano rispettivamente minore di e maggiore di.
Allora leggiamo l’affermazione (predicato) 2 < 3 come “il numero 2 è minore del numero 3”
e diciamo che il predicato è vero
Mentre il predicato 5 > 7 afferma che “5 è maggiore di 7” ed è falso.
In una procedura spesso si pone una “alternativa” decisa dal valore di un predicato: se il predicato è vero si
fanno alcune cose, se è falso se ne fanno altre.
In pseudolinguaggio la situazione in esame viene così descritta:
variables A, B, M integer;
…
if A < B
then M = A;
else M = B;
endif;
write M;
…
54
Naturalmente al posto di “A > B” si possono usare altri predicati:
“A = B” A uguale a B
“A < B” A minore di B
“A <= B” A minore o uguale a B
“A >= B” A maggiore o uguale a B
Quando manca il ramo “else” (cioè quando occorre fare alcune cose se il predicato è vero, ma non si deve
fare nulla se è falso), si parla di alternativa semplice:
variables A, B, M integer;
…
M = B;
if A > B then M = A; endif;
write M;
…
Esempio 1
Istruzioni Calcolo A B M
read A, B 5 3
M=B M=3 5 3 3
if A > B then M = A 5 > 3 è vero then M = 5 5 3 5
Esempio 2
Istruzioni Calcolo A B M
read A, B 7 9
M=B M=9 7 9 9
if A > B then M = A 7 > 9 è falso M = A non viene eseguita 7 9 9
La presenza di parentesi graffe che racchiudono una sequenza di istruzioni sta ad indicare che tutte le
istruzioni specificate all’interno delle parentesi devono essere eseguite in sequenza. Se in una procedura
compaiono le parentesi graffe all’interno di una alternativa semplice, allora tutta la sequenza di istruzioni
specificate all’interno dovranno essere eseguite sulla base del verificarsi della condizione espressa
nell’alternativa.
variables A, B, C integer;
read A, B;
if B > A then {
C = B;
B = A;
A = C;
} ; endif;
write A,B;
endprocedure;
Caso 2
v/f A B C
read A, B 6 4
if B > A f 6 4
C= B non eseguita 6 4
B= A non eseguita 6 4
A= C non eseguita 6 4
write A,B 6 4
procedura lettura
procedure BETA; il nome della procedura è BETA
variables A, B, C, D, F integer; le variabili sono A,B,C,D,F possono contenere solo numeri interi
read A, B, C; alle variabili A,B,C vengono assegnati numeri interi
D = 0; nella variabile D viene memorizzato il numero 0
if C > A then F = A + B; se C > A è vero esegui then F = A + B
else F = B + C; se C > A è falso esegui else F = B + C
endif; termina il primo if
if C > F then F = C; se C > F è vero esegui then F = C
else D = C; se C > F è falso esegui else D = C
endif; termina il secondo if
write D, F; stampa i valori di D , F
endprocedure; termine della procedura
I valori in input sono: 125 per A, 125 per B e 113 per C; determinare i valori di output.
SOLUZIONE
D 113
F 238
56
v/f A B C D F
read A,B,C 125 125 113
D=0 125 125 113 0
C>A f 125 125 113 0 125+113=238
C>F f 125 125 113 113 238
write D,F 113 238
4.3 LA RIPETIZIONE.
a) Il ciclo “for”
In molti problemi, la soluzione si ottiene ripetendo le medesime operazioni un certo numero di volte. Un
esempio preso dalla geometria è il seguente:
read L;
P = L * 4;
A= L * L;
write P,A;
57
N.B. Con step 1 si intende “ad ogni ciclo aumenta di uno il valore di K”
Quindi se K = 1 si ha successivamente K =1+1=2,3,4
procedure QUATTRO-QUADRATI
variables L, P, A, K integer;
for K from 1 to 4 step1 do;
read L;
P = L * 4;
A= L * L;
write P,A;
end for;
endprocedure;
K L P A
1
read L 3
P = L*4 3 12
A = L*L 3 12 9
write P,A 12 9
2
read L 4
P = L*4 4 16
A = L*L 4 16 16
write P,A 16 16
3
read L 6
P = L*4 6 24
A = L*L 6 24 36
write P,A 24 36
4
read L 10
P = L*4 10 40
A = L*L 10 40 100
write P,A 40 100
procedure ESEMPIO1;
variables A, B, K integer;
A=0;
B=0;
for K from 1 to 4 step 1 do;
A = A + 1;
B = B + K;
endfor;
write A, B;
endprocedure;
58
tabella di esecuzione
K A B
A=0 0
B=0 0 0
1
A=A+1 1 1
B=B+K 1 1 1
1+1=2
A=A+1 2 1+1=2 1
B=B+K 2 2 1+2=3
2+1=3
A=A+1 3 3 3
B=B+K 3 3 3+3=6
3+1=4
A=A+1 4 3+1=4 6
B=B+K 4 4 6+4=10
write A, B 4 10
procedure ESEMPIO2;
variables A, B, K integer;
A = 0;
B =0;
for K from 1 to 10 step 1 do;
A = A+K;
B = B+K*K;
endfor;
write A, B;
endprocedure;
tabella di esecuzione
K A B
A=0 0
B=0 0 0
1
A=A+K 1 0+1=1
B=B+K*K 1 1 0+1*1=1
1+1=2
A=A+K 2 1+2=3 1
B=B+K*K 2 3 1+2*2=5
2+1=3
A=A+K 3 3+3=6 5
B=B+K*K 3 6 5+3*3=14
3+1=4
A=A+K 4 6+4=10 14
B=B+K*K 4 10 14+4*4=30
59
write A, B 10 30
procedure ESEMPIO 3;
variables A, B, M, N, K integer;
read A;
M =0;
N =0;
for K from 1 to 10 step 1 do;
read B;
if A > B then M = M + A; endif;
if A < B then N = N + A; endif;
endfor;
write M, N;
endprocedure;
v/f K A B M N
read A 5
M=0 5 0
N=0 5 0 0
1 0 0
read B 1 5 9 0 0
if A > B f 1 5 9 0 0
if A < B v 1 5 9 0 0+5=5
2
read B 2 5 3 0 5
if A > B v 2 5 3 0+5=5 5
if A < B f 2 5 3 5 5
3
read B 3 5 7 5 5
if A > B f 3 5 7 5 5
if A < B v 3 5 7 5 5+5=10
4
read B 4 5 2
if A > B v 4 5 2 5+5=10 10
if A < B f 4 5 2 10 10
60
5
read B 5 5 8 10 10
if A > B F 5 5 8 10 10
if A < B v 5 5 8 10 10+5=15
6
read B 6 5 5 10 15
if A > B f 6 5 5 10 15
if A < B f 6 5 5 10 15
7
read B 7 5 1 10 15
if A > B v 7 5 1 10+5=15 15
if A < B f 7 5 1 15 15
8
read B 8 5 4 15 15
if A > B v 8 5 4 15+5=20 15
if A < B f 8 5 4 20 10+5=15
9
read B 9 5 4 15 15
if A > B v 9 5 4 20+5=25 15
if A < B f 9 5 4 25 15
10
read B 10 5 5 25 15
if A > B f 10 5 5 25 15
if A < B f 10 5 5 25 15
write M,N 25 15
b) Il ciclo “while”
Quando il numero di ripetizioni di un gruppo di azioni non può essere precisato ma dipende dal verificarsi
di un certo predicato utilizziamo la struttura “while” in alternativa al for.
Essa ripete certe azioni “mentre è vera una certa condizione”.
procedure ESEMPIO1;
variables A, B, K integer;
A= 0;
B=10;
K=0;
while A<B do;
K = K+1;
A = K*K+A;
endwhile;
write A;
endprocedure;
61
N.B. il ciclo while viene eseguito mentre è vero il predicato A < B. All’interno del ciclo A aumenta il suo valore mentre
B rimane fisso. Quando avremo A < B falso si passerà direttamente all’istruzione successiva a “endwhile” che nel nostro
caso è write A.
tabella di esecuzione
v/f K A B
A=0 0
B=10 0 10
K =0 0 0 10
A<B v
K=K+1 1 0 10
A=K*K+A 1 1*1+0=1 10
A<B v
K=K+1 1+1=2 1 10
A=K*K+A 2 2*2+1=5 10
A<B v
K=K+1 2+1=3 5 10
A=K*K+A 3 3*3+5=14 10
A<B f
write A 14
Dopo la terza iterazione il valore di A non è più minore di quello di B e il ciclo si arresta; A quindi vale 14.
Si ricorda che le normali operazioni aritmetiche sono indicate con +, −, *, /. Spesso è usato anche
l’elevamento a potenza, col simbolo ^. Per esempio, 2^3 = 8; A^B: se A ha valore 2 e B ha valore 3, il risultato
dell’espressione è 8; se A ha valore 2.0 e B ha valore 3, il risultato dell’espressione è 8.0.
62
4.5 UTILIZZO DELLE VARIABILI STRING
Con il termine stringa si intende una generica sequenza di caratteri sia alfabetici che numerici o altro. Sono
esempi di stringhe le seguenti sequenze:
012
3A5B
Alberto@
In una procedura ci possono essere variabili che contengono stringhe, e per questo si dicono di tipo “string”.
Una costante string viene scritta racchiusa tra apici:
‘alpha’
‘Giuseppe’
‘1200’
‘’
‘’
N.B. La (costante) stringa ‘1200’ non è il numero intero 1200: in particolare non si può sommare o sottrarre; la costante
‘’ è la stringa vuota; la costante ‘ ’ è la stringa spazio.
Se A è una variabile di tipo string, con la scrittura len(A) indichiamo la lunghezza della stringa
memorizzata in A, ossia il numero dei caratteri che formano la stringa.
Esempio. A = ‘alpha’ len(A)=5
B =’un cane nero’ len(B)= 12 (anche i due spazi sono “caratteri” della stringa)
Se A è una variabile di tipo string, con la scrittura A(n1,n2) indichiamo la stringa formata
dai caratteri di A che ci sono a partire dal termine nella posizione n1 fino al termine nella posizione n2
compresa.
Esempio. M=’maggio’
M(1,1)=’m’ M(1,3)=’mag’ M(3,5)=’ggi’
Se N e C sono due variabili string, con la scrittura N&C (leggere “N unita a C” o “N concatenata a C”)
indichiamo una nuova stringa formata dalla stringa di N a cui uniamo alla sua destra la stringa di C
Esempio N= ‘Rossi ‘ C= ‘Alberto’
N&C = ‘Rossi Alberto’
63
procedura lettura
procedure STR1; la procedura ha nome STR1
variables L, integer; dichiarazione di variabile intera
variables AS, BS, CS, DS string; dichiarazione di variabili stringhe
BS = ‘Aprile’; assegnazione della costante string ‘Aprile’
L = len(BS); calcolo della lunghezza della stringa BS;
AS = ‘mese di ’ & BS; assegnazione a AS del valore stringa ottenuto concatenando una
costante e (il valore di) una variabile: AS vale ‘mese di Aprile’;
procedura lettura
procedure STR2; la procedura ha nome STR2
variables L, J integer; dichiarazione di variabili intere
variables AS, BS, string; dichiarazione di variabili stringhe
BS =‘Aprile’; assegnazione della costante string ‘Aprile’
L = len(BS); calcola la lunghezza del valore (stringa) di BS che è 6
Seguono due esempi di problemi su stringhe che riguardano esercizi di pseudolinguaggio nelle gare.
PROBLEMA1
Si consideri la seguente procedura STR3.
procedure PROVA4;
variables J, L, C integer;
variables A, B string;
read A;
C = 0;
L = len(A);
for J from 1, step 1 to L do;
B = A(J,J) ;
if B = ‘a’ then C = C + 1; endif;
endfor;
write C;
64
endprocedure;
Il valore di input per A è: ‘9, a, b, 2, ac, 5, a, 4, 4a, 5b’, Determinare il valore di output per C
e scriverlo nella casella sottostante.
C
SOLUZIONE
C 4
PROBLEMA 2
Premessa.
Sia S=’tennis’ e C=’r’
L'operatore ==, verifica se due stringhe sono uguali. Dunque, saranno veri i seguenti:
'a' == 'a'
S == 'tennis'
'r' == C
e falsi i seguenti
'a' == 'b'
'Tennis' == S (diverse per via della maiuscola)
C == 'C' (poiché confronto ‘C’ con 'r')
Sapendo che il valore in input per FRASE è 'Nel mezzo del cammin di nostra vita' e per CAR è il carattere
'm', calcolare il valore di output per C.
SOLUZIONE
65
C 3
66