Salta ai contenuti. | Salta alla navigazione

Strumenti personali

13 giugno 2022 - lab

Linguaggi e Traduttori

Prof. Marco Gavanelli

 

13 giugno 2022

 

TESTO IN ITALIANO

Un file di testo subtitles.vtt contiene i sottotitoli di un video, così come stati generati da un servizio web.

I sottotitoli generati automaticamente non sono molto affidabili e contengono molti tag html che ne limitano la leggibilità e non sono necessari.

Per questo, si richiede di scrivere una funzione Haskell semplifica che permette di semplificare il file. Tale funzione deve prendere come parametro una stringa, che rappresenta il nome del file, e salvare su disco una copia del file semplificata come dettagliato nel seguito.

 

Esercizio 1 (punti 10)

La prima operazione che la funzione semplifica deve fare è togliere tutti i tag html e salvare i sottotitoli semplificati nel file "stripped.vtt". I tag html sono compresi fra i caratteri ' < ' e ' > '; vanno quindi eliminate tutte le sequenze di caratteri comprese fra ' < ' e ' > '.

Per fare questo, si scriva una funzione di ordine superiore

 

dividi :: (a -> Bool) -> [a] -> ([a], [a])

La funzione dividi prende come parametri

  • una funzione f
  • una lista xs

e fornisce una coppia

  • il primo elemento della coppia contiene la sottosequenza di elementi di xs
    • che comincia dal primo elemento della lista xs
    • e per cui tutti gli elementi della sottosequenza rendono vera la funzione f
    (quindi è lo stesso risultato della funzione predefinita takeWhile)
  • il secondo elemento della coppia contiene tutti gli altri elementi della lista.

In altre parole, la coppia di uscita (primi,secondi) è tale che

  • xs == primi++secondi
  • tutti gli elementi di primi rendono vera la funzione f
  • f (head secondi) == False oppure secondi==[]

 

Esercizio 2 (punti 5)

Ciascun sottotitolo (una volta tolti i tag html) è costituito da diverse righe, come segue:

  • una prima riga contenente
    • un orario di inizio (stringa)
    • una freccia "-->"
    • un orario di fine (stringa)
    • altre informazioni non importanti
  • le righe successive (fino alla prossima riga contenente "-->" esclusa) contengono il testo da visualizzare

Si chiede di estendere la funzione semplifica scritta nell'esercizio 1 in modo che carichi i sottotitoli in una lista di un nuovo tipo Subtitle; infine deve stampare a video la lista di Subtitle.

Il tipo Subtitle va definito opportunamente e deve contenere

  • gli orari di inizio e fine (stringhe)
  • le righe contenenti il testo da visualizzare (lista di stringhe, una stringa per ogni riga)

 

Requisito per ulteriori punti (punti 4)

In tutti i punti in cui è possibile, si usino funzioni di ordine superiore (o list comprehensions).

 

TEXT IN ENGLISH

A text file subtitles.vtt contains the subtitles of a video, as they are obtained from a web service.

The automatically generated subtitles are not very reliable, and they contain many html tags that are not necessary and make them difficult to read for a person.

For this reason, it is required to write a Haskell function semplifica that simplifies the file.

 

Such a function should take as a parameter a String, that represents the name of the file, and save on disk a simplified version of the file as detailed in the following.

 

Exercise 1 (10 points)

The first operation the semplifica function should perform is to remove all the html tags and save the new version of the file with name "stripped.vtt". Html tags are included between the characters ' < ' and ' > '; therefore all the character sequences between ' < ' and ' > ' must be deleted.

To do this, write the higher-order function:

 

dividi :: (a -> Bool) -> [a] -> ([a], [a])

function dividi takes as parameters

  • a function f
  • a list xs

and returns a pair, where

  • the first element of the pair contains the subsequence of elements of xs
    • that starts from the first element of the xs list
    • and for which all the elements of the subsequence make function f true
    (so, it is the same result of the predefined takeWhile function)
  • the second element of the pair contains all the remaining elements of the list.

In other words, the returned pair (primi,secondi) is such that

  • xs == primi++secondi
  • for all the elements of primi, function f returns True
  • either f (head secondi) == False or secondi==[]

 

Exercise 2 (5 points)

After removing html tags, each subtitle consists of several lines, as follows:

  • the first line contains
    • a starting time (String)
    • an arrow "-->"
    • an end time (String)
    • other unimportant information
  • the following lines (all the following lines until a line containing "-->" is found) contain the text to be visualized.

Extend now the semplifica function written in exercise 1 so that it loads the subtitles in a list of Subtitle; finally it should print the Subtitle list on screen.

The Subtitle type should be defined so that it contains

  • the start and end times (two Strings)
  • the lines containing the text to be visualized (list of String, one String for each line)

 

Requirement to obtain further points (4 points)

Use higher-order functions (or list comprehensions) whenever possible.