Esercizi di Gara della VII edizione
AVVISI:
· Se non specificato altrimenti negli esercizi, le sequenze iniziali su nastro si intendono non vuote, ovvero contenenti almeno un simbolo. La difficoltà degli esercizi è direttamente proporzionale al loro punteggio.
· Per numero decimale si intende un numero positivo o nullo rappresentato con le cifre 0, 1, 2, ..., 9, senza zeri iniziali non significativi; per esempio 0 e 19 sono numeri validi, mentre 0032 deve essere scritto come 32.
· Nel fornire le soluzioni, ricordarsi di pulire il nastro finale da ogni simbolo che non costituisca la risposta!
· Ogni volta che si salva la soluzione di un esercizio con il simulatore della macchina di Turing, il “timestamp” dell’esercizio viene aggiornato con il tempo trascorso fino a quel momento.
Esercizio 1: Musica, musica! [Punti 1.5] Tradizionalmente, le sette note della scala musicale vengono denominate in Italia do, re, mi, fa, sol, la, si. Le stesse note nel sistema anglosassone vengono indicate con le prime lettere dell'alfabeto: A, B, ... G, con do=C, re=D, … sol=G, la=A, si=B. Si scriva un programma che, data una stringa di note nel sistema anglosassone, lasci sul nastro le note equivalenti nel sistema italiano, separate da un punto. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
(Tanti auguri)
CCDCFE |
DO.DO.RE.DO.FA.MI |
(Fra' Martino)
CDECCDECEFGEFG |
DO.RE.MI.DO.DO.RE.MI.DO.MI.FA.SOL.MI.FA.SOL |
(Zerlina cede alle lusinghe di Don Giovanni -- Mozart)
BACBAC |
SI.LA.DO.SI.LA.DO |
Esercizio 2: Sottostringa [Punti 3]. Data una stringa s di caratteri di lunghezza n, e due interi i e j, con 1<=i<=j<=n, si vuole estrarre la sottostringa di s contenente i caratteri dall'i-esimo al j-esimo, estremi inclusi. Si scriva un programma che, dati in input i e j (in notazione decimale) e una stringa, tutti separati da un punto, lasci sul nastro solo la sottostringa richiesta. Si assuma che la stringa s possa contenere tutti i caratteri MAIUSCOLI nell'alfabeto A...Z. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
1.5.BANANA |
BANAN |
7.16.SUPERCALIFRAGILISTIC |
ALIFRAGILI |
4.4.CAROTA |
O |
Esercizio 3: La dama lineare I [punti 2]. Il gioco della dama lineare si gioca fra due giocatori, che chiameremo Bianco e Nero, su una "scacchiera” di 12 caselle disposte in linea. Ogni giocatore ha inizialmente 4 pedine del proprio colore, che indicheremo con B (per il Bianco) e N (per il Nero). Useremo invece il carattere "S" per le caselle vuote. All'inizio della partita, le quattro pedine di ogni giocatore occupano un estremo della scacchiera, e ci sono quattro caselle vuote fra i due giocatori:
BBBBSSSSNNNN
Durante il gioco, le pedine possono spostarsi e possono essere "mangiate", come si vedrà più avanti. Ad ogni momento durante una partita, la scacchiera dovrà contenere sempre 12 caselle: alcune saranno libere, altre occupate da pedine. Ogni giocatore avrà da 0 a 4 pedine del proprio colore (se ne ha 0, ha perso e la partita è finita), ma deve sempre essere presente almeno una pedina di uno dei due giocatori.
Si scriva un programma che, data una stringa di simboli sull'alfabeto {B, S, N}, lasci sul nastro "SI" se la stringa rappresenta una configurazione valida della scacchiera, come definito sopra, o "NO" altrimenti. Suggerimento: si noti che una configurazione è considerata valida in base al numero delle caselle e delle pedine presenti, ignorando le loro posizioni. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
BBBBSSSSNNNN |
SI |
BBBNSSSSSNNN |
SI |
BSNSN |
NO (troppo corta) |
BSSSSBBBSSNNN |
NO (troppo lunga) |
BBSBBBNNNNSS |
NO (5 B) |
NSSSSSSSSSSS |
SI |
BNBSSSSSSNNN |
SI |
SSSSSSSSSSSS |
NO (ci vuole almeno una pedina) |
Esercizio 4: La dama lineare II [Punti 1]. Durante una partita a dama, può essere utile poter "ruotare" la scacchiera, in modo da guardare le pedine dalla prospettiva dell'avversario. Si scriva un programma che, data in ingresso una stringa rappresentante una scacchiera valida, la restituisca vista dal punto di vista dell'avversario. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
BBSBBSSNSNNN |
NNNSNSSBBSBB |
BSBBSSSSBSNN |
NNSBSSSSBBSB |
NNNSNSSBBSBB |
BBSBBSSNSNNN |
Esercizio 5: La dama lineare III [Punti 3.5]. I giocatori muovono a turno, similmente a quanto avviene nel gioco della dama; inizia sempre il Bianco. Al proprio turno, un giocatore può muovere una propria pedina avanti di una casella, se la casella di destinazione è libera: per esempio, la prima mossa di una partita è obbligatoriamente
BBBBSSSSNNNN -> BBBSBSSSNNNN
oppure può "mangiare" una pedina avversaria saltandola, se se la trova davanti e se la casella successiva è libera, come fa il bianco in questo esempio:
BBBSSBNSSNNN -> BBBSSSSBSNNN
In questo caso, se nella posizione di destinazione è ancora possibile mangiare una pedina avversaria, essa deve essere mangiata nella stessa mossa (doppio o triplo salto):
BBBSBNSNSNNN -> BBBSSSSSBNNN
Si scriva un programma che, data in input una configurazione della scacchiera, esegua una mossa valida del bianco, lasciando sul nastro la situazione della scacchiera dopo la mossa. Si assuma che nella scacchiera di ingresso ci sia sempre esattamente una mossa possibile per il bianco. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
BBBBSSSSNNNN |
BBBSBSSSNNNN |
SBNSNSSNSSSN |
SSSSSBSNSSSN |
SSSBSSSSSSNN |
SSSSBSSSSSNN |
BBSSBNNSSSSS |
BSBSBNNSSSSS |
Esercizio 6: Notazione polacca inversa [Punti 2]. Nella notazione polacca inversa per le espressioni aritmetiche, gli operatori seguono gli operandi (sono postfissi anziché infissi). 1+2 si scrive 1 2 +, e (1+2)*(3+1) è 1 2 + 3 1 + *. Si scriva un programma per macchina di Turing capace di calcolare il valore di semplici espressioni in notazione polacca inversa, composte da numeri decimali (a una sola cifra) e dagli operatori P (per +) e M (per -). Si assuma che tutti gli operandi in ingresso, i risultati parziali, e il risultato finale siano interi fra 0 e 9. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
14P |
5 |
51M |
4 |
611PM |
4 |
12P3M22PP |
4 |
53P11PM1M |
5 |
Esercizio 7: Cifrario di Cesare [Punti 1.5]. Durante le sue guerre in Gallia, Giulio Cesare usava un semplice cifrario per comunicare con i suoi generali. In questo cifrario, ogni lettera era traslata di un numero fisso di posizioni. Nel cifrario originale, questo numero era 13: si aveva dunque
in chiaro ABCDEFGHIJKLMNOPQRSTUVWXYZ
cifrato NOPQRSTUVWXYZABCDEFGHIJKLM
Si scriva un programma per macchina di Turing che implementi un cifrario di Cesare generalizzato. Il programma prende in ingresso un numero decimale (da 1 a 25) seguito da una stringa su A-Z, e deve lasciare sul nastro la stessa stringa, cifrata traslando ogni lettera del numero indicato di posizioni. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
3ABC |
DEF |
13BACO |
ONPB |
1BACO |
CBDP |
Esercizio 8: Domani è un altro giorno [Punti 5]. Si scriva un programma che, data una data sul nastro di ingresso nel formato gg/mm/aaaa, lasci sul nastro la data incrementata di un giorno. Si assuma che tutti gli anni divisibili per 4 (anche quelli secolari divisibili per 400) siano bisestili. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
01/02/2001 |
02/02/2001 |
31/10/2003 |
01/11/2003 |
28/02/2000 |
29/02/2000 |
28/02/2001 |
01/03/2001 |
31/12/2003 |
01/01/2004 |
Esercizio 9: Scambio di coppia [Punti 1]. Scrivere un programma per macchina di Turing che scambi a due a due i caratteri di una stringa formata da A, B e C, fornita sul nastro in ingresso. Se la stringa contiene un numero dispari di caratteri, l’ultimo carattere rimane inalterato. Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
AB |
BA |
ABCB |
BABC |
ABBCA |
BACBA |
A |
A |
BCCABA |
CBACAB |
CCCC |
CCCC |
Esercizio 10: Il conto della serva [Punti 1.5]. Si programmi una macchina di Turing che, data in ingresso una cifra espressa in euro (intera), lasci sul nastro la stessa cifra espressa in lire, con l'assunzione che 1 euro valga 2000 lire, più mille lire (la cresta della serva). Esempi:
NASTRO INIZIALE |
NASTRO FINALE |
1 |
3000 |
2 |
5000 |
15 |
31000 |
540 |
1081000 |
0 |
1000 |