From 4b98529ae6269cdc8fef4e76d77821ad9b988816 Mon Sep 17 00:00:00 2001
From: "quentin.leblanc@etu.hesge.ch" <quentin.leblanc@etu.hesge.ch>
Date: Thu, 30 Jan 2020 15:07:01 +0100
Subject: [PATCH] TP3

---
 TP3/build.sbt                 |   5 ++
 TP3/project/build.properties  |   1 +
 TP3/src/main/scala/3.fp.scala | 152 ++++++++++++++++++++++++++++++++++
 3 files changed, 158 insertions(+)
 create mode 100644 TP3/build.sbt
 create mode 100644 TP3/project/build.properties
 create mode 100644 TP3/src/main/scala/3.fp.scala

diff --git a/TP3/build.sbt b/TP3/build.sbt
new file mode 100644
index 0000000..6e42885
--- /dev/null
+++ b/TP3/build.sbt
@@ -0,0 +1,5 @@
+name := "TP3"
+
+version := "0.1"
+
+scalaVersion := "2.13.1"
diff --git a/TP3/project/build.properties b/TP3/project/build.properties
new file mode 100644
index 0000000..e7c6f8a
--- /dev/null
+++ b/TP3/project/build.properties
@@ -0,0 +1 @@
+sbt.version = 1.3.7
\ No newline at end of file
diff --git a/TP3/src/main/scala/3.fp.scala b/TP3/src/main/scala/3.fp.scala
new file mode 100644
index 0000000..9120c7c
--- /dev/null
+++ b/TP3/src/main/scala/3.fp.scala
@@ -0,0 +1,152 @@
+
+/*
+ * Implémenter les fonctions suivantes en suivant les commentaires.
+ * Respectez également les consignes suivantes:
+ *  - Toutes les fonctions doivent être pures
+ *  - Tout doit être immutable (val au lieu de var)
+ *  - Utiliser la recursion terminale si possible
+ *  - Utiliser le pattern matching si possible
+ */
+object Serie3 {
+
+  /*
+   * Donne la longueur d'une liste. Votre implémentation ne peut
+   *  utiliser aucune fonction de List excepté isEmpty()
+   */
+  def len[A]( as: List[A] ): Int = {
+
+    @scala.annotation.tailrec
+    def size(rem: List[A], s: Int): Int = {
+      rem match {
+        case Nil => s
+        case _ :: bs => size(bs, s+1)
+      }
+    }
+
+    size(as, 0)
+  }
+
+  /*
+   * Inverse l'ordre des elements d'une liste. Votre implémentation ne peut
+   * utiliser aucune fonction de List excepté: -
+   *    - isEmpty
+   *    - ::
+   *    - head
+   *    - tail
+   */
+  def rev[A]( as: List[A] ): List[A] = {
+    @scala.annotation.tailrec
+    def takeLast(rem: List[A], bs: List[A]): List[A] = {
+      rem match {
+        case Nil => bs
+        case a :: tail => takeLast(tail, a::bs)
+      }
+    }
+    takeLast(as, Nil)
+  }
+
+  /*
+   * Somme les elements d'une liste. Votre implémentation ne peut
+   * utiliser aucune fonction de List excepté: -
+   *    - isEmpty
+   *    - head
+   *    - tail
+   */
+  def sum( xs: List[Int] ): Int = {
+    @scala.annotation.tailrec
+    def acc(rem: List[Int], s: Int): Int ={
+      rem match{
+        case Nil => s
+        case a :: bs => acc(bs, s+a)
+      }
+    }
+    acc(xs, 0)
+  }
+
+  /*
+   *  Retourne vrai si et seulement si la liste xs ne
+   *  comprend que des valeures vraies. Votre implémentation 
+   *  ne peutcutiliser aucune fonction de List excepté:
+   *    - isEmpty
+   *    - head
+   *    - tail
+   */
+  @scala.annotation.tailrec
+  final def and(xs: List[Boolean] ): Boolean = {
+    xs match {
+      case true :: Nil => true
+      case true :: bs => and(bs)
+      case _ => false
+    }
+  }
+
+  /*
+   *  Applatit une liste. Votre implémentation 
+   *  ne peut utiliser aucune fonction de List excepté:
+   *   - isEmpty
+   *   - head
+   *   - tail
+   *   - ++
+   *
+   */
+  def flat[A]( las: List[List[A]] ): List[A] = {
+
+    @scala.annotation.tailrec
+    def through(as: List[List[A]], dst: List[A]): List[A] = {
+      as match {
+        case Nil => dst
+        case Nil::bs => through(bs, dst)
+        case (head::tail):: bs => through(tail::bs, head::dst)
+      }
+    }
+
+    rev(through(las, Nil))
+  }
+
+  /*
+   *  Retourne vrai si la Liste a une nombre pair d'éléments. Votre
+   *  implémentation ne peut utiliser aucune fonction de List !  Vous
+   *  devez utiliser le pattern matching.
+   */
+  def even[A]( as: List[A] ): Boolean = {
+    len(as)%2 == 0
+  }
+
+}
+
+object Serie3Main extends App {
+
+  import Serie3._
+
+  val is = List( 1, 2, 3, 4, 5 )
+  val bs1 = List( true, true, false, true )
+  val bs2 = List( true, true, true )
+  val las1 = List.empty[List[Int]]
+  val las2 = List( List(1,2), List(3), List(4,5) )
+
+  println("1st")
+  require( rev(is) == List( 5, 4, 3, 2, 1 ) )
+
+  println("2nd ")
+  require( len(is) == 5 )
+  require( len( las1 ) == 0 )
+  require( len( bs1 ) == 4 )
+
+  println("3rd")
+  require( flat(las1) == Nil )
+  require( flat(las2) == is )
+
+  println("4th")
+  require( sum(is) == 15 )
+  require( sum(flat(las2)) == sum(is) )
+
+  println("5th")
+  require( rev( bs1 ) == List( true, false, true, true ) )
+  require( rev( bs2 ) == bs2 )
+
+  println("6th")
+  require( !even( is ) )
+  require( even( bs1 ) )
+  require( even( las1 ) )
+
+}
-- 
GitLab