Nome
                       
Cognome
                       
Matricola
          
Soluzione esame gg/mm/aaaa
DomandaRisposta
1

Disegnare la memoria vista come ripiani numerati dopo aver eseguito queste istruzioni, sapendo che viene stampato 2 4 5.

   int a;
   int *b;
   b = &a;
   print("%d %d %d\n", a, &a, &b);

(linguaggi di programmazione)

Il valore di a è il primo numero stampato, quindi 2. Il suo indirizzo è il secondo, quindi 4. Quindi la locazione di memoria 4 contiene il numero 2.

L'indirizzo di b è il terzo numero, quindi 5. Il suo valore è l'indirizzo di a, che è il secondo numero stampato 4. Quindi la locazione di memoria 5 contiene il numero 4.

+---+
|   | 0
+---+
|   | 1
+---+
|   | 2
+---+
|   | 3
+---+
| 2 | 4
+---+
| 4 | 5
+---+
|   | 6
+---+
|   |

2

Convertire i numeri 10, 3 e 9 in binario; sommare il primo con il secondo, al risultato sottrarre il terzo. Queste operazioni vanno effettuate in binario.

(rappresentazioni numeriche o logica applicata)

10 / 2 = 5 resto 0
 5 / 2 = 2 resto 1
 2 / 2 = 1 resto 0
 1 / 2 = 0 resto 1

10 = 1010b

 3 / 2 = 1 resto 1
 1 / 2 = 0 resto 1

3 = 11b

 9 / 2 = 4 resto 1
 4 / 2 = 2 resto 0
 2 / 2 = 1 resto 0
 1 / 2 = 0 resto 1

9 = 1001b

  1010 +
    11 =
 -------
     0 + 1 ⇒ 1
    1 + 1 ⇒ 1, riporto 1
   0 + 1(riporto)  ⇒ 1
  1111

1010 + 11 = 1111

  1111 -
  1001 =
 --------
     1 - 1 = 0
    1 - 0 = 1
   1 - 0 = 1
  1 - 1 = 0
 --------
  0110

1111 - 1001 = 0110

3

Scrivere un programma Python che verifica se un grafo ha una clique di grandezza n. Non è necessario il codice della classe Grafo.

(grafi)

# verifica se l'insieme di nodi e' una clique del grafo
def clique(grafo, nodi):
	for n in nodi:
		if grafo.successori(n) - {n} < nodi - {n}:
			return False;
	return True;

# presenza di una clique grande n
def cliquen(grafo, n):
	print('   ', n)
	for c in itertools.combinations(grafo.nodi(), n):
		print('       ', c)
		if clique(grafo, set(c)):
			return True;
	return False;
4

Scrivere l'espressione regolare che collima con le stringhe di lettere minuscole che contengono almeno una a e almeno una b.

(linguaggi formali)

L'espressione regolare deve contenere almeno una a e almeno una b, per cui potrebbe avere la forma …a…b…. Le altre lettere devono essere in [a-z], per cui si ottiene [a-z]*a[a-z]*b[a-z]*.

Questa espressione regolare collima con le stringhe che contengono almeno una a e almeno una b tranne quelle in cui tutte le b precedono tutte le a.

Il problema si risolve aggiungendo in alternativa l'espressione regolare simile [a-z]*b[a-z]*a[a-z]* in cui le b possono precedere la a.

[a-z]*a[a-z]*b[a-z]*|[a-z]*b[a-z]*a[a-z]*
5

Fornire un esempio di problema nella classe di complessità P, uno nella classe NP e uno NP-hard.

(calcolabilità e complessità)

Un problema in P è quello di stabilire se un sottoinsieme dato di nodi di un grafo è una clique del grafo. Uno che è sia in NP che NP-hard è quello di trovare un sottoinsieme con somma dispari di un insieme di interi.

NOTA: risposte prive di esauriente motivazione (es. i passaggi delle operazioni numeriche) verranno considerate nulle.