From 8e982b9b7bd67d6265d8e7ccaf37263c1d2c6559 Mon Sep 17 00:00:00 2001
From: "joel.vonderwe" <joel.von-der-weid@etu.hesge.ch>
Date: Thu, 30 Jan 2020 15:48:11 +0100
Subject: [PATCH] Exos

---
 base_tp/.gitignore               |   3 +
 base_tp/build.sbt                |  73 +++++++++++++++++
 base_tp/project/build.properties |   1 +
 base_tp/src/fp/fp.scala          | 136 +++++++++++++++++++++++++++++++
 base_tp/src/intro/Euclid.scala   |  19 +++++
 base_tp/src/stack/Stack.scala    |  51 ++++++++++++
 6 files changed, 283 insertions(+)
 create mode 100644 base_tp/.gitignore
 create mode 100644 base_tp/build.sbt
 create mode 100644 base_tp/project/build.properties
 create mode 100644 base_tp/src/fp/fp.scala
 create mode 100644 base_tp/src/intro/Euclid.scala
 create mode 100644 base_tp/src/stack/Stack.scala

diff --git a/base_tp/.gitignore b/base_tp/.gitignore
new file mode 100644
index 0000000..382c6d7
--- /dev/null
+++ b/base_tp/.gitignore
@@ -0,0 +1,3 @@
+*~
+
+target/
diff --git a/base_tp/build.sbt b/base_tp/build.sbt
new file mode 100644
index 0000000..b2ce3c8
--- /dev/null
+++ b/base_tp/build.sbt
@@ -0,0 +1,73 @@
+organization := "ch.hepia"
+
+name := "tpscala"
+
+version := "2020"
+
+scalaVersion := "2.13.1"
+
+libraryDependencies ++= Seq(
+  "org.scalatest" %% "scalatest" % "3.1.0" % "test"
+)
+
+fork in run := true
+
+javaOptions in run += "-Xmx2G"
+
+
+scalacOptions ++= Seq(
+  "-deprecation",                      // Emit warning and location for usages of deprecated APIs.
+  "-encoding", "utf-8",                // Specify character encoding used by source files.
+  "-explaintypes",                     // Explain type errors in more detail.
+  "-feature",                          // Emit warning and location for usages of features that should be imported explicitly.
+  "-language:existentials",            // Existential types (besides wildcard types) can be written and inferred
+  "-language:higherKinds",             // Allow higher-kinded types
+  "-unchecked",                        // Enable additional warnings where generated code depends on assumptions.
+  "-Xcheckinit",                       // Wrap field accessors to throw an exception on uninitialized access.
+  "-Xfatal-warnings",                  // Fail the compilation if there are any warnings.
+  // "-Xlint:adapted-args",               // Warn if an argument list is modified to match the receiver.
+  // "-Xlint:by-name-right-associative",  // By-name parameter of right associative operator.
+  // "-Xlint:constant",                   // Evaluation of a constant arithmetic expression results in an error.
+  // "-Xlint:delayedinit-select",         // Selecting member of DelayedInit.
+  // "-Xlint:doc-detached",               // A Scaladoc comment appears to be detached from its element.
+  // "-Xlint:inaccessible",               // Warn about inaccessible types in method signatures.
+  // "-Xlint:infer-any",                  // Warn when a type argument is inferred to be `Any`.
+  // "-Xlint:missing-interpolator",       // A string literal appears to be missing an interpolator id.
+  // "-Xlint:nullary-override",           // Warn when non-nullary `def f()' overrides nullary `def f'.
+  // "-Xlint:nullary-unit",               // Warn when nullary methods return Unit.
+  // "-Xlint:option-implicit",            // Option.apply used implicit view.
+  // "-Xlint:package-object-classes",     // Class or object defined in package object.
+  // "-Xlint:poly-implicit-overload",     // Parameterized overloaded implicit methods are not visible as view bounds.
+  // "-Xlint:private-shadow",             // A private field (or class parameter) shadows a superclass field.
+  // "-Xlint:stars-align",                // Pattern sequence wildcard must align with sequence component.
+  // "-Xlint:type-parameter-shadow",      // A local type parameter shadows a type already in scope.
+  // "-Xlint:unsound-match",              // Pattern match may not be typesafe.
+  // "-Yno-adapted-args",                 // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver.
+  // "-Ypartial-unification",             // Enable partial unification in type constructor inference
+  // "-Ywarn-dead-code",                  // Warn when dead code is identified.
+  // "-Ywarn-extra-implicit",             // Warn when more than one implicit parameter section is defined.
+  // "-Ywarn-inaccessible",               // Warn about inaccessible types in method signatures.
+  // "-Ywarn-infer-any",                  // Warn when a type argument is inferred to be `Any`.
+  // "-Ywarn-nullary-override",           // Warn when non-nullary `def f()' overrides nullary `def f'.
+  // "-Ywarn-nullary-unit",               // Warn when nullary methods return Unit.
+  // "-Ywarn-numeric-widen",              // Warn when numerics are widened.
+  // "-Ywarn-unused:implicits",           // Warn if an implicit parameter is unused.
+  // "-Ywarn-unused:imports",             // Warn if an import selector is not referenced.
+  // "-Ywarn-unused:locals",              // Warn if a local definition is unused.
+  // "-Ywarn-unused:params",              // Warn if a value parameter is unused.
+  // "-Ywarn-unused:patvars",             // Warn if a variable bound in a pattern is unused.
+  // "-Ywarn-unused:privates",            // Warn if a private member is unused.
+  // "-Ywarn-value-discard"               // Warn when non-Unit expression results are unused.
+)
+
+scalacOptions in (Compile, console) --= Seq("-Ywarn-unused:imports", "-Xfatal-warnings")
+
+
+
+scalaSource in Compile := baseDirectory.value / "src"
+
+javaSource in Compile := baseDirectory.value / "java" / "src" 
+
+scalaSource in Test := baseDirectory.value / "test"
+
+    
diff --git a/base_tp/project/build.properties b/base_tp/project/build.properties
new file mode 100644
index 0000000..2930ee9
--- /dev/null
+++ b/base_tp/project/build.properties
@@ -0,0 +1 @@
+sbt.version=1.3.7
\ No newline at end of file
diff --git a/base_tp/src/fp/fp.scala b/base_tp/src/fp/fp.scala
new file mode 100644
index 0000000..e726e3d
--- /dev/null
+++ b/base_tp/src/fp/fp.scala
@@ -0,0 +1,136 @@
+
+/*
+ * 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 = {
+    def lenRec(as: List[A], size: Int): Int = {
+        as match {
+          case Nil => size
+          case _ :: rest => lenRec(rest, size+1)
+        }    
+    }
+    lenRec(as, 0)
+  }
+
+  /*
+   * Donne la longueur 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] = {
+    def revRec(as: List[A], newL: List[A]): List[A] = {
+      as match {
+        case Nil => newL
+        case v :: rest => revRec(rest, v :: newL)
+      }
+    }
+    revRec(as, List.empty[A])
+  }
+
+  /*
+   * Donne la longueur d'une liste. Votre implémentation ne peut
+   * utiliser aucune fonction de List excepté: -
+   *    - isEmpty
+   *    - head
+   *    - tail
+   */
+  def sum( xs: List[Int] ): Int = {
+    def sumRec(xs: List[Int], sum: Int): Int = {
+      xs match {
+          case Nil => sum
+          case v :: rest => sumRec(rest, sum+v)
+        }
+    }
+    sumRec(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
+   */
+  final def and( xs: List[Boolean] ): Boolean = xs match {
+    case Nil => true
+    case false :: _ => false
+    case _ :: rest => and(rest)
+  }
+
+  /*
+   *  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] = {
+    def flatRec(las: List[List[A]], flatten: List[A]): List[A] = {
+      las match {
+        case Nil => flatten
+        case as :: rest => flatRec(rest, flatten ++ as)
+      }
+    }
+    flatRec(las, List.empty[A])
+  }
+
+  /*
+   *  Applatit une liste. Votre implémentation 
+   *  ne peut utiliser aucune fonction de List !
+   *  Vous devez utiliser le pattern matching.
+   */
+  final def even[A]( as: List[A] ): Boolean = {
+    as match {
+        case Nil => true
+        case _ :: _ :: rest => evenRec(rest)
+        case _ :: Nil => false
+      }
+  }
+}
+
+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) )
+
+  require( rev(is) == List( 5, 4, 3, 2, 1 ) )
+
+  require( len(is) == 5 )
+  require( len( las1 ) == 0 )
+  require( len( bs1 ) == 4 )
+
+  require( flat(las1) == Nil )
+  require( flat(las2) == is )
+
+  require( sum(is) == 15 )
+  require( sum(flat(las2)) == sum(is) )
+
+  require( rev( bs1 ) == List( true, false, true, true ) )
+  require( rev( bs2 ) == bs2 )
+
+  require( even( is ) == false )
+  require( even( bs1 ) == true )
+  require( even( las1 ) == true )
+
+}
\ No newline at end of file
diff --git a/base_tp/src/intro/Euclid.scala b/base_tp/src/intro/Euclid.scala
new file mode 100644
index 0000000..eea14ba
--- /dev/null
+++ b/base_tp/src/intro/Euclid.scala
@@ -0,0 +1,19 @@
+package ch.unige.hepia.tp
+
+object Euclid extends App {
+
+  // Implémenter correctement cette fonction
+  def gcd( a: Int, b: Int ): Int = {
+    if (b == 0) {
+      a
+    } else {
+      gcd(b, a % b)
+    }
+  }
+
+  println( gcd( 100, 30 ) )  //=> 10
+  println( gcd( 30, 100 ) )  //=> 10
+  println( gcd( 12, 3732 ) ) //=> 12
+  println( gcd( 1, 3732 ) )  //=> 1
+  println( gcd( 25, 3732 ) ) //)> 1
+}
diff --git a/base_tp/src/stack/Stack.scala b/base_tp/src/stack/Stack.scala
new file mode 100644
index 0000000..52b4d57
--- /dev/null
+++ b/base_tp/src/stack/Stack.scala
@@ -0,0 +1,51 @@
+class Stack[A] {
+    import java.util.{ArrayList => JArrayList};
+    private var stack = new JArrayList[A];
+
+    //Retourne vrai si la pile est vide
+    def isEmpty: Boolean = stack.isEmpty
+
+    // Retourne le nombre d'éléments de la pile
+    def size: Int = stack.size
+
+    // Empile un élément sur la pile
+    def push( a: A ): Unit = stack.add(0, a)
+
+    // Dépile et retourne le sommet de la pile
+    def pop: A = {
+        if (stack.isEmpty) {
+            throw new Exception
+        } else {
+            stack.get(0)
+            stack.remove(0)
+        }
+    }
+
+    //Inverse les deux éléments au sommet de la pile
+    //ne fait rien si moins de deux éléments
+    def swap: Unit = {
+        if (stack.size >= 2) {
+            val v = pop
+            stack.add(1, v)
+        }
+    }
+}
+
+object Stack extends App {
+    println("Stack testing...")
+    var s = new Stack[Int]
+    assert(s.isEmpty)
+    assert(s.size == 0)
+    s.push(1)
+    assert(s.pop == 1)
+    s.push(1)
+    s.push(2)
+    s.push(3)
+    assert(s.size == 3)
+    assert(!s.isEmpty)
+    assert(s.pop == 3)
+    s.swap
+    assert(s.pop == 1)
+    assert(s.pop == 2)
+    println("Stack tested !")
+}
\ No newline at end of file
-- 
GitLab