lab 7
diff --git a/src/sample/Algorithm.scala b/src/sample/Algorithm.scala
index 5693993..a5dbb61 100644
--- a/src/sample/Algorithm.scala
+++ b/src/sample/Algorithm.scala
@@ -4,21 +4,62 @@
   val MOVED_RIGHT: Char = 'r'
   val MOVED_LEFT: Char = 'l'
 
-  def sort(xs: Array[Int]): Array[Int] =
-    if (xs.length <= 1) xs
-    else {
-      val pivot = xs(xs.length / 2)
-      Array.concat(
-        sort(xs filter (pivot >)),
-        xs filter (pivot ==),
-        sort(xs filter (pivot <)))
+  def testSort(xs: Array[Int]): Long = {
+    val start = System.nanoTime()
+    sort(xs.toList)
+    val end = System.nanoTime()
+    end - start
+  }
+
+  def sort(lst: List[Int]): List[Int] =
+    lst match {
+      case Nil => Nil
+      case pivot :: tail => sort(tail filter {
+        pivot >
+      }) :::
+        pivot :: sort(tail filter {
+        pivot <=
+      })
     }
 
+  /**
+    * make from replay Array that contains only symbols toFind
+    *
+    * @param xs
+    * @param toFind
+    * @return
+    */
+  def getSeqOfOneChar(xs: Array[Char], toFind: Char): IndexedSeq[Char] =
+    for (i <- 0 until xs.length if xs(i) == toFind) yield xs(i)
+
   def countLeftMove(xs: Array[Char]): Int = {
-    xs.filter(_ == MOVED_LEFT).length
+    getSeqOfOneChar(xs, MOVED_LEFT).length
   }
 
   def countRightMove(xs: Array[Char]): Int = {
-    xs.filter(_ == MOVED_RIGHT).length
+    getSeqOfOneChar(xs, MOVED_RIGHT).length
+  }
+
+  def checkIn(xs: String, ys: String): Boolean = {
+    xs.contains(ys)
+  }
+
+  def findMaxRepeatedSeq(xs: Array[String]): String = {
+    var min = 0
+    for (elem <- xs) {
+      if (elem.length < xs(min).length) min = xs.indexOf(elem)
+    }
+    var maxString = ""
+    for (i <- 0 until xs(min).length)
+      for (j <- i + 1 until xs(min).length) {
+        var fl = true
+        for (elem <- xs) {
+          if (!checkIn(elem, xs(min).substring(i, j)))
+            fl = false
+        }
+        if (fl && (maxString.length < xs(min).substring(i, j).length))
+          maxString = xs(min).substring(i, j)
+      }
+    maxString
   }
 }
diff --git a/src/sample/ArtRico.java b/src/sample/ArtRico.java
index 229bd7c..f23f888 100644
--- a/src/sample/ArtRico.java
+++ b/src/sample/ArtRico.java
@@ -126,7 +126,7 @@
     menuRoot.setPrefSize(SCENE_WIDTH, SCENE_HEIGHT);
     createMainMenuButtons();
     scene = new Scene(menuRoot);
-    scene.getStylesheets().add(ArtRico.class.getResource("style.css")
+    scene.getStylesheets().add(ArtRico.class.getResource(STYLE_FILE)
         .toExternalForm());
     primaryStage.setScene(scene);
     primaryStage.show();
diff --git a/src/sample/Bot.java b/src/sample/Bot.java
index 8e9a11b..a29203b 100644
--- a/src/sample/Bot.java
+++ b/src/sample/Bot.java
@@ -5,7 +5,7 @@
 /**
  * program can play without player
  */
-public class Bot {
+public class Bot implements Constants {
   final int timeOfMoving = 2000;
   Player player;
   Ball ball;
@@ -36,20 +36,20 @@
       if (time < timeOfMoving) {
         if (player.getTranslateX() + player.getWidth() / 2
             < ball.getTranslateX() + ball.getWidth()) {
-          return 'r';
+          return RIGHT_MOVE;
         } else {
-          return 'l';
+          return LEFT_MOVE;
         }
       } else {
         if (player.getTranslateX() + player.getWidth() / 2
             < ball.getTranslateX()) {
-          return 'r';
+          return RIGHT_MOVE;
         } else {
-          return 'l';
+          return LEFT_MOVE;
         }
       }
     } else {
-      return 'n';
+      return NOT_MOVE;
     }
   }
 
diff --git a/src/sample/Client.java b/src/sample/Client.java
index 4efba36..84062b8 100644
--- a/src/sample/Client.java
+++ b/src/sample/Client.java
@@ -42,7 +42,7 @@
   @Override
   public void run() {
     try {
-      sleep(100000);
+      sleep(WAIT_TIME);
     } catch (InterruptedException e) {
       scene = new Scene(initGame());
       prepareActionHandlers();
@@ -50,7 +50,7 @@
     }
     while (working) {
       try {
-        sleep(10000);
+        sleep(WAIT_TIME);
       } catch (InterruptedException e) {
         return;
       }
@@ -89,10 +89,10 @@
     scene.setOnKeyPressed(event -> {
       switch (event.getCode().toString()) {
         case "LEFT":
-          direction = 'l';
+          direction = LEFT_MOVE;
           break;
         case "RIGHT":
-          direction = 'r';
+          direction = RIGHT_MOVE;
           break;
         case "SPACE":
           server.animationSwitch();
@@ -106,7 +106,7 @@
       lastKey.add(event.getCode().toString());
     });
     scene.setOnKeyReleased(event -> {
-      direction = 'n';
+      direction = NOT_MOVE;
     });
   }
 
diff --git a/src/sample/Constants.java b/src/sample/Constants.java
index f41fdee..96b0ecf 100644
--- a/src/sample/Constants.java
+++ b/src/sample/Constants.java
@@ -18,7 +18,9 @@
   char MEDIUM_MODE = 'm';
   char HARD_MODE = 'h';
   char REPLAY_MODE = 'r';
-  int ITER_COUNT = 10000;
+  char LEFT_MOVE = 'l';
+  char RIGHT_MOVE = 'r';
+  char NOT_MOVE = 'n';
   int NOTES_ON_SCREEN = 19;
   int PLAYER_WIDTH_EASY = 280;
   int PLAYER_WIDTH_MEDIUM = 200;
@@ -42,7 +44,10 @@
   int STATISTICS_LABEL_INDENTS = 20;
   int STATISTICS_LABEL_HEIGHT = 130;
   int STATISTICS_LABEL_WIDTH = 320;
+  int WAIT_TIME = 100000;
+  int START_DELAY = 500;
   String[] TOP_LABEL_CONTENT = {"REPLAY", "MODE", "PLAYED", "MOVED LEFT"
       , "MOVED RIGHT"};
   String RESOURCE_FOLDER = "Resource\\";
+  String STYLE_FILE = "style.css";
 }
diff --git a/src/sample/Game.java b/src/sample/Game.java
index 721a558..d46295c 100644
--- a/src/sample/Game.java
+++ b/src/sample/Game.java
@@ -42,11 +42,11 @@
   public void startGame() {
     client = new Client(gameMode, this);
     try {
-      Thread.sleep(500);
+      Thread.sleep(START_DELAY);
     } catch (InterruptedException e) {
     }
     scene = client.scene;
-    scene.getStylesheets().add(Game.class.getResource("style.css")
+    scene.getStylesheets().add(Game.class.getResource(STYLE_FILE)
         .toExternalForm());
     gameStage.setScene(scene);
     gameStage.setOnCloseRequest(e -> {
@@ -92,7 +92,8 @@
       int fileNumber = ((int) e.getY()) / GRID_LABEL_HEIGHT - 1;
       if (fileNumber != -1 && fileNumber < NOTES_ON_SCREEN) {
         menuRoot.getChildren().remove(gridPane);
-        replayFile = RESOURCE_FOLDER + replays.get(fileNumber).getReplayName();
+        replayFile = RESOURCE_FOLDER
+            + replays.get(fileNumber + currentIter).getReplayName();
         startGame();
       } else if (fileNumber == -1) {
         ReplayInfo.sortBy = (int) e.getX() * 5 / (SCENE_WIDTH -
@@ -201,27 +202,17 @@
   }
 
   void sortTest() {
-    long start;
-    long end;
     long traceTime;
     Algorithm algorithm = new Algorithm();
     JavaSort javaSort = new JavaSort();
-    int[] array = new int[replays.size()*100];
-    for (int j = 0; j < 100; j++){
-      for (int i = 0; i < replays.size(); i++) {
-        array[j * replays.size() + i] = replays.get(i).getGameTime();
-      }
+    int[] array = new int[fileNames.length];
+    for (int i = 0; i < fileNames.length; i++) {
+      array[i] = replays.get(i).getGameTime();
     }
     System.out.println("Time of sorting:");
-    start = System.nanoTime();
-    algorithm.sort(array);
-    end = System.nanoTime();
-    traceTime = end - start;
+    traceTime = algorithm.testSort(array);
     System.out.println("Scala: " + traceTime);
-    start = System.nanoTime();
-    javaSort.sort(array);
-    end = System.nanoTime();
-    traceTime = end - start;
+    traceTime = javaSort.testSort(array);
     System.out.println("Java:  " + traceTime);
   }
 
diff --git a/src/sample/JavaSort.java b/src/sample/JavaSort.java
index 8ddeac4..6154e9a 100644
--- a/src/sample/JavaSort.java
+++ b/src/sample/JavaSort.java
@@ -5,6 +5,13 @@
  */
 public class JavaSort {
 
+  long testSort(int[] xs) {
+    long start = System.nanoTime();
+    sort(xs);
+    long end = System.nanoTime();
+    return end - start;
+  }
+
   /**
    * interface for quicksort
    *
@@ -22,6 +29,7 @@
    * @param r
    */
   void sort(int[] xs, int l, int r) {
+
     int pivot = xs[(l + r) / 2];
     int a = l;
     int b = r;
diff --git a/src/sample/MoveConstants.java b/src/sample/MoveConstants.java
deleted file mode 100644
index fa3d44e..0000000
--- a/src/sample/MoveConstants.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package sample;
-
-/**
- *
- */
-interface MoveConstants {
-  final char MOVED_RIGHT = 'r';
-  final char MOVED_LEFT = 'l';
-  final char NOT_MOVED = 'n';
-}
diff --git a/src/sample/ReplayInfo.java b/src/sample/ReplayInfo.java
index c116fda..0bfc83a 100644
--- a/src/sample/ReplayInfo.java
+++ b/src/sample/ReplayInfo.java
@@ -21,13 +21,13 @@
     this.replayName = replayName;
     replay = Serializer.loadReplay(RESOURCE_FOLDER + replayName);
     switch (replay.toCharArray()[0]) {
-      case 'e':
+      case EASY_MODE:
         replayMode = "EASY";
         break;
-      case 'm':
+      case MEDIUM_MODE:
         replayMode = "MEDIUM";
         break;
-      case 'h':
+      case HARD_MODE:
         replayMode = "HARD";
         break;
     }
diff --git a/src/sample/Server.java b/src/sample/Server.java
index e6c9b3e..c91bc3d 100644
--- a/src/sample/Server.java
+++ b/src/sample/Server.java
@@ -54,7 +54,7 @@
     client.setContent(player, ball, bricks, leftWall, rightWall, top, bottom);
     client.interrupt();
     try {
-      sleep(100000);
+      sleep(WAIT_TIME);
     } catch (InterruptedException e) {
       timer = new AnimationTimer() {
         @Override
@@ -173,9 +173,7 @@
     if (replayNow) {
       replayIterator = 1;
     } else {
-      for(int i = 0; i < 1000; i++) {
-        Serializer.saveReplay(replay);
-      }
+      Serializer.saveReplay(replay);
       replay = "" + gameMode;
     }
     client.resetBricks();
diff --git a/src/sample/SimpleObject.java b/src/sample/SimpleObject.java
index 44b9f88..5c9a7e7 100644
--- a/src/sample/SimpleObject.java
+++ b/src/sample/SimpleObject.java
@@ -1,5 +1,7 @@
 package sample;
 
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
 import javafx.scene.layout.Pane;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
diff --git a/src/sample/Sorting.scala b/src/sample/Sorting.scala
deleted file mode 100644
index 0168170..0000000
--- a/src/sample/Sorting.scala
+++ /dev/null
@@ -1,13 +0,0 @@
-package sample
-
-class Sorting {
-  def sort(xs: Array[Int]): Array[Int] =
-    if (xs.length <= 1) xs
-    else {
-      val pivot = xs(xs.length / 2)
-      Array.concat(
-        sort(xs filter (pivot >)),
-        xs filter (pivot ==),
-        sort(xs filter (pivot <)))
-    }
-}
diff --git a/src/sample/Statistics.java b/src/sample/Statistics.java
index c311089..8f00408 100644
--- a/src/sample/Statistics.java
+++ b/src/sample/Statistics.java
@@ -23,6 +23,8 @@
   int allTimeMovedRight;
   int allTimeMovedLeft;
   int allTimeNotMoved;
+  String theBiggestSeq;
+  String [] allReplays;
 
   public Statistics() {
     replays = new ArrayList<>();
@@ -30,6 +32,7 @@
     allTimeMovedRight = 0;
     allTimeMovedLeft = 0;
     allTimeNotMoved = 0;
+    theBiggestSeq = "";
     this.stage = new Stage();
     start(stage);
   }
@@ -47,13 +50,17 @@
       replays.add(replayInfo);
     }
 
+    allReplays = new String[fileNames.length];
+
     for (int i = 0; i < replays.size(); i++) {
       allTimePlayed += replays.get(i).getGameTime();
       allTimeMovedRight += replays.get(i).getRightMovingTime();
       allTimeMovedLeft += replays.get(i).getLeftMovingTime();
+      allReplays[i] = replays.get(i).replay;
     }
 
     allTimeNotMoved = allTimePlayed - allTimeMovedLeft - allTimeMovedRight;
+    theBiggestSeq = new Algorithm().findMaxRepeatedSeq(allReplays);
   }
 
   @Override
@@ -68,7 +75,7 @@
       buttons[i].setPrefHeight(STATISTICS_LABEL_HEIGHT);
       buttons[i].setTranslateX(SCENE_WIDTH / 2 - STATISTICS_LABEL_WIDTH / 2);
     }
-    buttons[0].setText("Time played: " + allTimePlayed);
+    buttons[0].setText("The biggest sequence: " + theBiggestSeq);
     buttons[1].setText("Time moved right: " + allTimeMovedRight);
     buttons[2].setText("Time moved left: " + allTimeMovedLeft);
     buttons[3].setText("Time not moved: " + allTimeNotMoved);
diff --git a/src/sample/style.css b/src/sample/style.css
index 3811225..c848f70 100644
--- a/src/sample/style.css
+++ b/src/sample/style.css
@@ -1,21 +1,25 @@
 .root {
-    -fx-background-image: url("metal.jpg");
+  -fx-background-image: url("metal.jpg");
 }
 
 .label {
-    -fx-text-fill: white;
-        -fx-font-family: "Arial Narrow";
-        -fx-font-size: 20;
-        -fx-font-weight: bold;
-        -fx-background-image: url("brick.jpg");
-        -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );
+  -fx-text-fill: white;
+  -fx-font-family: "Arial Narrow";
+  -fx-font-size: 20;
+  -fx-font-weight: bold;
+  -fx-background-image: url("brick.jpg");
+  -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );
 }
 
 .button {
-    -fx-text-fill: white;
-    -fx-font-family: "Arial Narrow";
-    -fx-font-size: 20;
-    -fx-font-weight: bold;
-    -fx-background-image: url("brick.jpg");
-    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );
+  -fx-text-fill: white;
+  -fx-font-family: "Arial Narrow";
+  -fx-font-size: 20;
+  -fx-font-weight: bold;
+  -fx-background-image: url("brick.jpg");
+  -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );
+}
+
+#b {
+  -fx-background-image: url("brick.jpg");
 }
\ No newline at end of file