Accesso

Cherubino     Gara nazionale di programmazione della
Macchina di Turing
 
 

Esercizi di Gara della IX edizione


AVVISI:

·         Se non specificato altrimenti negli esercizi, le sequenze iniziali su nastro si intendono non vuote, ovvero contenenti almeno un simbolo.

·         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: Stringhe Trine [Punti 15]. Una stringa si dice trina se è della forma aaa, ovvero se è composta da tre parti uguali. Si scriva un programma che, ricevuta in ingresso una stringa sull'alfabeto {a, b, c}, lasci sul nastro al termine della computazione la stringa trina ottenuta triplicando la stringa di ingresso.

 

NASTRO INIZIALE

NASTRO FINALE

a

aaa

abc

abcabcabc

babba

babbababbababba

ccc

ccccccccc

 

Esercizio 2: Numeri Trini [Punti 10]. Un numero intero si dice trino se è divisibile per 3. Se n è trino, n+1 si dice strino e n+2 distrino. Si scriva un programma che, dato in input un numero decimale, lasci sul nastro una delle tre stringhe TRINO, STRINO o DISTRINO a seconda dei casi. Esempi:

 

NASTRO INIZIALE

NASTRO FINALE

3

TRINO

5

DISTRINO

82

STRINO

0

TRINO

 

Esercizio 3: Strinatura di numeri [15]. Si scriva un programma che, dato in ingresso un numero decimale, lasci sul nastro il numero strino più vicino.

 

NASTRO INIZIALE

NASTRO FINALE

24

25

2

1

0

1

91

91

 

Esercizio 4: Inserimento ordinato [Punti 15]. Sia data sul nastro una singola cifra decimale, seguita da una X e quindi da una sequenza di cifre decimali di lunghezza qualunque (anche 0). Si scriva il programma di una macchina di Turing che inserisca il numero dato nella sequenza in modo ordinato, lasciando sul nastro la sequenza risultante.

 

NASTRO INIZIALE

NASTRO FINALE

5X127

1257

1X0000111117777999

00001111117777999

3X

3

4X134

1344

1X133334

1133334

 

 

Esercizio 5: Intersomma progressiva [Punti 25]. L'intersomma di un numero decimale è la somma aritmetica delle cifre che lo compongono. Per esempio, l'intersomma di 186 è 1+8+6 ovvero 15. Ovviamente, è possibile calcolare l'intersomma del risultato, in questo caso 1+5 ovvero 6. Si scriva un programma che, ricevuto in ingresso un numero decimale, restituisca l'intera sequenza ottenuta applicando ripetutamente l'operazione di intersomma al numero di ingresso, fino a che il risultato non è costituito da una sola cifra. I valori nella sequenza devono essere separati da spazi. Esempi:

 

NASTRO INIZIALE

NASTRO FINALE

186

186 15 6

2500

2500 7

594326

594326 29 11 2

1

1

100000

100000 1

0

0

 

Esercizio 6: Contafoglie [Punti 15]. Un grafo è una struttura dati formata da un certo numero di nodi connessi da archi. Un tipo particolarmente importante di grafo è l'albero, caratterizzato dal fatto che ogni nodo può essere connesso a 0 o più figli. I nodi senza figli sono detti foglie. Tutti i nodi hanno esattamente un padre, ad eccezione del nodo alla base, detto radice, che è l'unico a non avere padre. Gli alberi in Informatica crescono al contrario che in Natura, e sono normalmente rappresentati con la radice in alto e le foglie in basso, come negli esempi illustrati più sotto. Per rappresentare un albero come una stringa è possibile usare le parentesi per indicare la relazione padre-figlio, e singole cifre decimali per indicare le foglie. Per esempio, (2 3) rappresenta un albero con una radice e due foglie contenenti i valori 2 e 3. L’albero ((1 2) 3) invece ha un nodo a sinistra che ha come figli due foglie (1 e 2) e un altro figlio foglia (valore 3). Alcuni esempi:

 

(2 3)

((1 2) 3)

((1 2) ((3)))

 

Più in generale nei nostri alberi le parentesi introducono un nodo intermedio nell’albero i cui figli possono essere:

·         Un nuovo nodo intermedio

·         Una foglia (una cifra compresa tra 0 e 9).

Si scriva il programma di una macchina di Turing che, dato un albero sul nastro (codificato come descritto e senza spazi intermedi), scriva il numero di foglie in esso presenti.

 

NASTRO INIZIALE

NASTRO FINALE

2

1

(12)

2

((((1)2)(23))(111))

7

(1)

1

((1))

1

((2)(4)(6)(123456789))

12

 


Esercizio 7: Profondità di un albero [Punti 30]. Come visibile negli esempi dell'esercizio precedente, un albero è tipicamente organizzato per livelli, dati dal numero di nodi che si incontrano partendo dalla radice per arrivare a un nodo dato. Per esempio, i livelli dell'albero ((12)((3)) sono descritti nella figura seguente:

 

Si scriva il programma di una macchina di Turing che, data sul nastro la definizione di un albero, ne calcoli la profondità, ovvero il numero di livelli massimo dell’albero.

 

NASTRO INIZIALE

NASTRO FINALE

9

1

(12)

2

((12)3)

3

((12)((3)))

4

((43563)(2(1)))

4

 


Esercizio 8: Diametro di un albero [Punti 40]. Si definisce C(l) la cardinalità del livello l di un albero il numero di nodi di quel livello. Si scriva il programma di una macchina di Turing che, dato un albero sul nastro, scriva la cardinalità massima dell’albero, ovvero il più grande valore di C(l) al variare di l (tale valore è detto diametro dell'albero). Per esempio, nel caso riportato in figura  il diametro sarà 3:

NASTRO INIZIALE

NASTRO FINALE

(((12)2(3((3))))

5

2

1

((534)(((11))56))

6

(44)

2

((44)32)

3

 

Esercizio 9: Albero binario [Punti 20]. Un albero è binario se e solo se ogni nodo ha al più due figli. Si scriva il programma di una macchina di Turing che scriva B sul nastro se un albero è binario, N altrimenti.

 

NASTRO INIZIALE

NASTRO FINALE

1

B

(12)

B

(123)

N

(1(23))

B

((12)(1(23)3))

N

 

 

 

Esercizio 10: Algebra Booleana [Punti 30]. L'algebra booleana opera su due soli valori, detti vero e falso, spesso codificati con 1 (per vero) e 0 (per falso). Su questi valori booleani sono definiti un certo numero di operatori, fra cui l'operatore unario not (negazione) e gli operatori binari and (congiunzione), or (disgiunzione), imp (implicazione) e eqv (equivalenza). Il valore calcolato da questi operatori è definito dalle seguenti tabelle di verità:

 

Una espressione booleana è costituita da una sequenza di valori booleani e relativi operatori, con l'aggiunta di parentesi per indicare l'ordine di valutazione (le espressioni più interne vanno valutate per prime). Si scriva un programma che, ricevuta in ingresso una espressione booleana, lasci sul nastro il risultato della sua valutazione (che sarà, ovviamente, uno dei due valori possibili: 0 o 1). Si assuma che l'operatore not sia codificato con il simbolo “!”, l'and con “*”, l'or con “+”, l'imp con “-” e l'eqv con “=”. Esempi:

 

NASTRO INIZIALE

NASTRO FINALE

0=0

1

1+(0=0)

1

1*(1-0)

0

1

1

(0+(0-(1=0)))+(!0)

1

  I GARA
  II GARA
  III GARA
  IV GARA
  V GARA
  VI GARA
  VII GARA
  VIII GARA
  IX GARA
  GARA ROTARY 2006
  X GARA
  XI GARA
  XII Gara
  XIII Gara
  XIV Gara
  XV Edizione
  XVI Edizione
  XVII Edizione
  XVIII Edizione
  XIX Edizione
(Altri collegamenti...)