/* Recherches dans des tableaux de booleens      */

public class RecherchesDansTableauBooleenEnConsole {

///////////////////////////////////////////////////

/* Generation et retour d'un tableau de booleens */
/* tires au sort avec equiprobabilite            */
/* n : La taille du tableau à générer            */

  static boolean [] generationAleatoire(int n) {
    boolean [] t = new boolean[n];
    for ( int i = 0 ; i < n ; i++ ) {
      t[i] = ( Math.random() < 0.5); }
    return t;
  }

/* Affichage complet d'un tableau de booleens    */
/*  - '0' pour false                             */
/*  - '1' pour true                              */
/* t : Le tableau de booleens à afficher         */

  static void afficher(boolean [] t) {
    for ( int i = 0 ; i < t.length ; i++ ) {
      if ( t[i] ) {
        Console.afficher('1'); }
        else {
        Console.afficher('0'); } }
  }

/* Calcul et retour du nombre de booleens true   */
/* presents dans un tableau de booleens          */
/* t : Le tableau de booleens                    */

  static int nombreDeVrais(boolean [] t) {
    int nb = 0;
    for ( int i = 0 ; i < t.length ; i++ ) {
      if ( t[i] ) {
        nb++; } }
    return nb;
  }

/* Calcul et retour du nombre de series          */
/* de booleens identiques consecutifs presentes  */
/* dans un tableau de booleens                   */
/* t : Le tableau de booleens                    */

  static int nombreSeries(boolean [] t) {
    int nb = 1;
    boolean enCours = t[0];
    for ( int i = 1 ; i < t.length ; i++ ) {
      if ( t[i] != enCours ) {
        nb++;
        enCours = t[i]; } }
    return nb;
  }

/* Calcul et retour de la longueur maximale      */
/* de toutes les series de true consecutifs      */
/* presents dans un tableau de booleens          */
/* t : Le tableau de booleens                    */

  static int longueurMaxSeriesVrais(boolean [] t) {
    int lMax;
    int cpt;
    boolean enCours;
    lMax = 0;
    cpt = 0;
    enCours = false;
    for ( int i = 0 ; i < t.length ; i++ ) {
      if ( t[i] ) {
        if ( !enCours ) {
          cpt = 0;
          enCours = true; }
        cpt++; }
        else {
        if ( enCours ) {
          if ( cpt > lMax ) {
            lMax = cpt; }
          enCours = false; } } }
    if ( enCours ) {
      if ( cpt > lMax ) {
        lMax = cpt; } }
    return lMax;
  }

/* Test si un motif de booleens coincide         */
/* avec les booleens presentes dans un tableau   */
/* de booleens a partir d'un indice              */
/* motif : Le tableau de booleens motif          */
/* t : Le tableau de booleens où est effectué    */
/*     le test                                   */
/* p : L'indice de recherche                     */

  static boolean concordance(boolean [] motif,boolean [] t,int p) {
    int i;
    boolean res;
    i = 0;
    res = true;
    while ( ( res ) && ( i < motif.length ) ) {
      res = ( motif[i] == t[p] );
      i++;
      p++; }
    return res;
  }

/* Determination et retour de l'indice           */
/* de la 1ère occurrence d'un motif de booleens  */
/* recherché dans un tableau de booleens         */
/* Retour de -1 si motif non present             */
/* motif : Le tableau de booleens motif          */
/* t : Le tableau de booleens où est effectuée   */
/*     la recherche                              */

  static int premiereOccurrence(boolean [] motif,boolean [] t) {
    int pos;
    int i;
    int nt;
    pos = -1;
    i = 0;
    nt = t.length-motif.length+1;
    while ( ( pos == -1 ) && ( i < nt ) ) {
      if ( concordance(motif,t,i) ) {
        pos = i; }
        else {
        i++; } }
    return pos;
  }

/* Calcul et retour un tableau de booleens       */
/* construit à partir d'une chaine de caracteres */
/* ou les 0 codent des false et les 1 codent     */
/* des true                                      */
/* s : La chaine de caractères                   */

  static boolean [] motif(String s) {
    boolean [] t = new boolean[s.length()];
    char [] tc = s.toCharArray();
    for ( int i = 0 ; i < t.length ; i++ ) {
      switch (tc[i]) {
        case '0' :
          t[i] = false;
          break;
        case '1' :
          t[i] = true;
          break;
        default :
          Console.afficherln("Erreur!!!");
          break; } }
    return t;
  }

/////////////////////////////////////////////////

/* Programme principal                           */

  public static void main(String [] args) {
    Console.setTitle("RecherchesDansTableauBooleen");
    int n;
    int nb;
    int lm;
    boolean [] motif;
    int pos;
    String s;
    Console.afficher("Taille du tableau ? ");
    n = Console.saisirInt();
    boolean [] t = generationAleatoire(n);
    afficher(t);
    Console.sautDeLigne();
    nb = nombreDeVrais(t);
    Console.afficherln("Nombre de vrai                 : ",nb);
    nb = nombreSeries(t);
    Console.afficherln("Nombre de series               : ",nb);
    nb = longueurMaxSeriesVrais(t);
    Console.afficherln("Longueur max des series de vrai: ",nb);
    Console.afficher("Longueur du motif ? ");
    lm = Console.saisirInt();
    motif = generationAleatoire(lm);
    afficher(motif);
    Console.sautDeLigne();
    pos = premiereOccurrence(motif,t);
    Console.afficherln("Position du motif              : ",pos);
    Console.afficher("Motif ? ");
    s = Console.saisirString();
    motif = motif(s);
    pos = premiereOccurrence(motif,t);
    Console.afficherln("Position du motif              : ",pos);
  }
}