uniroma1
.E*Main.scala
.cognome.nome
. Sulle postazioni del laboratorio sarà /home/studente/Desktop/cognome.nome/
.cognome.nome.zip
(zip -r cognome.nome.zip cognome.nome/
).cognome.nome.zip
.Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Scrivere nel file E1.scala
un metodo currificato def buildMatrix(rows:Int, cols:Int)(f:(Int,Int) => Double):Vector[Vector[Double]]
che restituisce una matrice di Double
con rows
righe e cols
colonne dove f(i,j)
descrive il contenuto della cella (i,j)
.
Più precisamente, il metodo restituisce un Vector[Vector[Double]]
v
tale che per ogni i
in [0,rows-1]
e per ogni j
in
[0,cols-1]
si ha v(i)(j) == f(i,j)
.
Usare il main di prova nella directory di lavoro E1
. Non modificare alcun file tranne E1.scala
.
Scrivere nel file E2.scala
una versione parallela fibPar
del seguente metodo ricorsivo fib
definito nel file Fib.scala
usando fork-join in Scala mediante il costrutto par
. La soluzione deve assumere la presenza di 2 core nella CPU.
def fib(a:Int, b:Int)(n:Int):Long =
if (n < 2) a
else if (n == 2) b
else fib(a,b)(n-1) + fib(a,b)(n-2)
Usare il main di prova nella directory di lavoro E2
, mettendo sulla riga di comando tutti i file Scala forniti. Non modificare alcun file tranne E2.scala
.
Suggerimento: nel metodo fibPar
, che non dovrebbe essere ricorsivo, eseguite in parallelo le due chiamate fib(a,b)(n-1)
e fib(a,b)(n-2)
Scrivere nel file E3.scala
un metodo def subList(l:List[T]):Boolean
applicabile su un oggetto List[T]
s
che restituisce true
se e solo se tutti gli elementi di l
appaiono anche in s
nello stesso ordine, anche non consecutivamente.
Usare il main di prova nella directory di lavoro E3
. Non modificare alcun file tranne E3.scala
.
Scrivere nel file E4.scala
un metodo piuGiovane
che, dato un Vector
s
di oggetti Studente(id, nome)
e un Vector
e
di oggetti Eta(id, eta)
, restituisce un Option[String]
che vale None
se s
è vuoto e Some(x)
, dove x è il nome dello studente più giovane, altrimenti. Si assuma che ogni id contenuto in s sia anche contenuto in e. Gli id sono unici in ciascuna collezione e servono come chiave primaria in s e in e.
Usare il main di prova nella directory di lavoro E4
. Non modificare alcun file tranne E4.scala
.
object E1 {
def buildMatrix(rows:Int, cols:Int)(f:(Int,Int) => Double):Vector[Vector[Double]] = {
def buildRow(row:Int, cols:Int):Vector[Double] = (0 until cols).toVector.map(col => f(row,col))
(0 until rows).toVector.map(row => buildRow(row, cols))
}
}
object E2 {
def fibPar(a:Int, b:Int)(n:Int):Long = {
if (n < 2) a
else if (n == 2) b
else {
val (x,y) = Par.par {
Fib.fib(a,b)(n-1)
}
{
Fib.fib(a,b)(n-2)
}
x + y
}
}
}
import scala.language.implicitConversions
object E3 {
implicit def seq2MySeq[T](s:List[T]):MyList[T] = new MyList(s)
}
class MyList[T](s:List[T]) {
import E3._
def subList(l:List[T]):Boolean = {
if (l.isEmpty) true
else if (s.isEmpty) false
else if (s.head == l.head) s.tail.subList(l.tail)
else s.tail.subList(l)
}
}
object E4 {
def piuGiovane(s:Vector[Studente], e:Vector[Eta]):Option[String] = {
if (s.isEmpty) None
else {
val m:Map[Int,Vector[Eta]] = e.groupBy(_.id)
Some(s.reduce((x,y) => if (m(x.id)(0).eta < m(y.id)(0).eta) x else y).nome)
}
}
}