Edizione VIII

Problema 1 – Quadristringhe

Una quadristringa è una stringa su un alfabeto dato che ha la forma XXXX, ovvero, che è composta di quattro parti uguali ripetute.

Per esempio, abcabcabcabc è una quadristringa.

Si scriva un programma che, data in ingresso una stringa sull’alfabeto a, b, c, lasci sul nastro SI se la stringa di ingresso è una quadristringa, NO altrimenti.

NASTRO INIZIALENASTRO FINALE
ababababSI
bacbacbacbacSI
cbabcbcbNO
ccccSI
aaaaaNO

Problema 2 – Tristringhe

Analogamente all’esercizio precedente, una tristringa è una stringa che ha la forma XXX, ovvero, che è composta di tre parti uguali ripetute.

Per esempio, abcabcabc è una tristringa.

Si scriva un programma che, data in ingresso una stringa sull’alfabeto a, b, c, lasci sul nastro SI se la stringa di ingresso è una tristringa, NO altrimenti.

NASTRO INIZIALENASTRO FINALE
aaaSI
bbbbbbSI
ababababNO
babacbabacbabacSI

Problema 3 – I multidispari I
Riconoscimento di espressioni

I numeri multidispari sono quelli che hanno la forma (2(2(2(…(2+1)…)+1)+1)+1).
Sono multidispari

  • 2+1=3,
  • 2(2+1)+1=7
  • 2(2(2+1)+1)+1=15

Si scriva un programma che, ricevuta in ingresso una stringa sull’alfabeto {1, 2, +, [, ]} (in cui le parentesi quadre prendono il posto delle tonde), lasci sul nastro SI se la stringa ricevuta è l’espressione di un numero multidispari racchiusa fra parentesi, NO altrimenti.

NASTRO INIZIALENASTRO FINALE
[2+1]SI
[[1]+2]NO
2+2NO
2[2+2]NO
[2[2[2[2+1]+1]+1]+1]SI
2[2[2[2+1]+1]+1]+1NO

Problema 4 – I multidispari II
Calcolo

Con riferimento all’esercizio precedente, si scriva un programma che, ricevuta in ingresso una espressione valida per un numeromultidispari (sempre racchiusa fra parentesi), lasci sul nastro il numero decimale corrispondente al risultato del calcolo.

NASTRO INIZIALENASTRO FINALE
[2+1]3
[2[2+1]+1]7
[2[2[2[2[2[2[2+1]+1]+1]+1]+1]+1]+1]255

Problema 5 – I multidispari III
Riconoscimento dei valori

Con riferimento agli esercizi precedenti sui multidispari, si scriva un programma che, ricevuto in ingresso un numero decimale, lasci sul nastro SI se il numero in questione è un multidispari, NO altrimenti.

NASTRO INIZIALENASTRO FINALE
3SI
7SI
35NO
511SI
2041NO

Problema 6 – Conversione esadecimale-binario

I numeri in base 16, o esadecimali, utilizzano come cifre le consuete cifre decimali 0..9, più le lettere A, B, C, D, E, F che rappresentano, rispettivamente, 10, 11, 12, 13, 14, 15.

  • Per esempio, il numero esadecimale 2B vale 2×161+11×160, ovvero 43 in decimale.
  • I numeri in base 2, o binari, utilizzano invece esclusivamente le cifre 0 e 1.
  • Per esempio, 1001 in binario vale 1×23+0x22+0x21+1×20, ovvero 9 in decimale.

Si scriva un programma che, ricevuto in ingresso un numero esadecimale, lasci sul nastro lo stesso numero espresso in notazione binaria.

Suggerimento: si noti che una cifra esadecimale corrisponde al più a 4 cifre binarie.

NASTRO INIZIALENASTRO FINALE
11
A1010
F1ABA11110001101010111010
B810111000
20100000
00

Problema 7 – Vettori fagici

Il DNA degli esseri viventi è costituito da una lunga catena di basi (adenina, timina, guanina, citosina, indicate rispettivamente con A, T,G, C).
Su una sequenza di basi operano degli enzimi, che per via chimica possono operare trasformazioni sulla sequenza di DNA.
In particolare, i vettori fagici sono in grado di eliminare certe sotto-sequenze di DNA, ricongiungendo le estremità del frammento dopo la rimozione.

Si scriva un programma che simuli il funzionamento di un vettore fagico.
Il programma, ricevute in ingresso due stringhe sull’alfabeto {A, T, G, C} separate da X, rimuove tutte le occorrenze disgiunte della prima stringa all’interno della seconda stringa, e lascia sul nastro la sola stringa risultante.
Nel caso di più occorrenze sovrapposte (per esempio: se si vuole rimuovere ATA da CATATAG), si rimuova soltanto l’occorrenza più a sinistra (producendo come risultato CTAG).

NASTRO INIZIALENASTRO FINALE
AXCTAAGACCTGC
ACCXCACTACCTACCAGCACTTAG
CTTAXGATTACAGATTACA
ATAXCATATAGCTAG
ATTAXATTAATTA 

Problema 8 – XOR esadecimale

Si scriva un programma che, dati in ingresso due numeri esadecimali (si veda l’esercizio 6) separati da un punto, lasci sul nastro il risultato dell’or esclusivo (o xor) applicato ai due numeri.
L’operatore xor è definito come segue: se nella rappresentazione binaria dei due operandi le cifre nella stessa posizione hanno lo stesso valore, allora la cifra corrispondente del risultato sarà 0; altrimenti, essa sarà 1.
Per esempio (…)

A216 xor 1F16 = 101000102 xor 000111112 = 101111012 = BD16

Si assuma che i numeri esadecimali passati in ingresso abbiano la stessa lunghezza, e si produca un risultato della stessa lunghezza.
Per questo esercizio, sono ammessi gli 0 iniziali.

NASTRO INIZIALENASTRO FINALE
A5.BC19
1B4.020194
1.10
0A224.555555F771
00.0000

Problema 9 – Gruppi ciclici

Un gruppo ciclico G(n,k), con 0 < n < k, è una sequenza di interi tali che il primo elemento è sempre 0, e quelli successivi sono calcolati aggiungendo n al precedente e calcolando il risultato modulo k.
La sequenza si interrompe quando viene generato un numero già presente.

Per esempio,

  • G(2,5)={0,2,4,1,3}
  • G(3,6)={0,3}
  • G(1,5)={0,1,2,3,4}.

Si scriva un programma che, presi in ingresso n e k, con 1 < k < 10, lasci sul nastro il gruppo ciclico G(n,k), nell’ordine corretto.

NASTRO INIZIALENASTRO FINALE
2502413
3603
49048372615
39036
140123
280246

Problema 10 – Il lamba-calcolo

Il lambda-calcolo è un formalismo per la definizione e l’applicazione di funzioni.
Una lambda-espressione è costituita da una dichiarazione di parametri, preceduti dalla lettera L, seguita da una espressione; le due parti sono separate da un punto.

Per esempio, la lambda-espressione Lx.x rappresenta la funzione f(x)=x (si noti però che le lambda-espressioni non introducono nomi per le funzioni: nel primo caso, non compare il nome f).

L’applicazione di una funzione a un argomento viene denotata scrivendo l’argomento a destra della funzione: per esempio, (Lx.x)3rappresenta la funzione f(x)=x applicata a 3, ovvero f(3), e dunque vale 3).
Le applicazioni possono anche essere multiple: in questo caso, si calcola prima l’applicazione più a sinistra e più interna rispetto alle parentesi.

Per esempio, (Lx.x+1)((Lx.2x)3) = (Lx.x+1)6 = 7, mentre (Lx.xx)(Lx.x)3 = (Lx.x)(Lx.x)3 = (Lx.x)3 = 3.

Useremo un lambda-calcolo semplificato con una sola variabile (x), e un solo termine base (e).
Una lambda-espressione è una sequenza di elementi, ciascuno dei quali può essere un termine oppure una applicazione.
Un termine può essere una x oppure una e.
Una applicazione ha la forma [lambda-espressione]termine oppure [lambda-espressione]applicazione.

Si noti che, visto che abbiamo una sola variabile, non occorre avere un simbolo distinto per “Lx.”: è sufficiente la partentesi quadra.

Si scriva un programma che, ricevuta in ingresso una lambda-espressione, lasci sul nastro il risultato della sua valutazione secondo le regole sopra esposte.

Suggerimento: si scriva il programma in modo che esso applichi ripetutamente una riscrittura di una applicazione (la più interna a sinistra).

Per esempio:

  • [xx]ex -> eex
  • [x[xx]e]x -> [xee]x -> xee
  • [[xex]e]x -> [eee]x -> eee
  • [[xe]x][ex]e -> [xe][ex]e -> [xe]ee -> eee
NASTRO INIZIALENASTRO FINALE
ee
[x]ee
[xx][x]xxx
[xx][x]eee
[x[xx]e]xxee
xx
[ex[x]e]xexe

Lascia un commento