Salta ai contenuti. | Salta alla navigazione

Strumenti personali

21 settembre 2016 - laboratorio

Linguaggi e Traduttori - Compito A

Prof. Marco Gavanelli

21 settembre 2016

Esercizio 1 (punti 14)

In una città la rete idrica segue le strade. La città è a pianta romana: ci sono strade parallele all'asse Nord-Sud e strade parallele all'asse Est-Ovest. Le strade parallele sono a distanza di 1km una dalla successiva.

Se viene rilevata la presenza di un inquinante nell'acqua dell'acquedotto, vengono mandate delle squadre di operai a chiudere degli idranti. Ciascuno degli idranti è posizionato all'incrocio di due strade ed è identificato da due coordinate intere: X e Y. Le squadre, invece, sono identificate da un colore (stringa).

Il piano di intervento è riportato in un file di testo  idranti.txt , che contiene una sequenza di dati del tipo:


    colore: stringa
    X, Y: interi

Questo significa che la squadra del dato colore deve andare a chiudere l'idrante con coordinate (X,Y).

Ad esempio, se il file idranti.txt contiene i seguenti dati:

ROSSO 3 4
BLU 2 3
BLU 1 2
ROSSO 4 4

significa che la squadra rossa deve chiudere prima l'idrante che si trova alle coordinate (3,4), poi quello alle coordinate (4,4). La squadra blu, invece, deve chiudere prima l'idrante in (2,3), poi quello in (1,2). Tutte le squadre partono dalla posizione (0,0).

Si desidera sapere quale delle squadre deve percorrere più strada.

Nell'esempio in figura, la squadra Rossa deve percorrere 3+4+1=8km, mentre la squadra Blu deve percorrere 3+2+1+1=7km.

Nella risoluzione del problema, è richiesto di definire ed usare almeno una funzione di ordine superiore e di definire opportune strutture dato.

Esercizio 2 (Punti 4)

Si scriva un programma Lex che, dato un testo, aggiunge ad ogni indirizzo email valido il corrispondente link con mailto del formato html; ad esempio il testo:

Scrivere a luigi.rossi@esempio.com ma non a gino.@prova..com

viene sostituito con

Scrivere a <a href="mailto:luigi.rossi@esempio.com">luigi.rossi@esempio.com</a> ma non a gino.@prova..com

Un indirizzo email è valido se è costituito da:

  • un indirizzo locale, costituito da una successione di caratteri che possono includere lettere, numeri e carattere punto '.' , in cui il punto non può essere il primo né l'ultimo carattere e non ci possono essere due punti consecutivi
  • il carattere '@'
  • il dominio, costituito da una successione di caratteri che possono includere lettere, numeri e carattere punto. Il punto deve comparire almeno una volta, non può essere il primo o l'ultimo carattere e non ci possono essere due punti consecutivi

Per semplificare il problema, nel seguente caso:

Scrivi a luigi..rossi@esempio.it

è accettabile sia l'output (indirizzo non riconosciuto)

Scrivi a luigi..rossi@esempio.it

sia l'output (riconosciuta sottostringa)

Scrivi a luigi..<a href="mailto:rossi@esempio.it">rossi@esempio.it</a>

 

 

 

 

 

 


 

 

 

 

 

 

Soluzione 1

 

 

data Perc = Perc { col :: String, x :: Int, y :: Int} deriving Show

main = do
    string <- readFile "idranti.txt" 
    let perc = lettura string
        squadre = remdup (map col perc)
    print (maxf (lunghezza perc) squadre)
    print (map (lunghezza perc) squadre)
    print squadre


lunghezza :: [Perc] -> String -> Int
lunghezza perc squadra = sumdist (filter ((== squadra).col) perc)

sumdist xs = let pairs = zip xs ((Perc "" 0 0):xs)
             in sum (map dist pairs)

dist ((Perc _ x1 y1),(Perc _ x2 y2)) = abs(x1-x2)+abs(y1-y2)

maxf f [x] = x
maxf f (x:xs) = let maxr = maxf f xs
                in if (f maxr) > (f x) then maxr else x

remdup xs = foldr (\y ys -> if elem y ys then ys else (y:ys))  [] xs

lettura s = map (conv.words) (lines s)
conv [c1,x1,y1] = Perc c1 (read x1) (read y1)

 

Soluzione 2

 

WORD	[a-z0-9]+
ADDR	{WORD}+("."{WORD})*
EMAIL	{ADDR}@{DOMAIN}
DOMAIN  {WORD}("."{WORD})+

%%

{EMAIL}	printf("<a href=\"mailto:%s\">%s</a>",yytext,yytext);

%%