//---------------------------------------------------------------
//       class:  guess.cpp
//---------------------------------------------------------------


#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

double eval(int *pj);

class RandomGuess {

public:
  RandomGuess(int);
  void cycledResults();
  void cycledDetailResults();
  void setVec(int);           //set num 1's from beginning of vec
  void randomSetVec(int);     //randomly set num 1's to vec
  void display();             //display the value and sequence
  void saveVec(int *);        //save the sequence

  void guess101_v0_v9(int );  //guess the 101/maximum sequence
  void guess101_v50_v99(int );  //guess the 101/maximum sequence
  void guess101_i_j_k_in_v50_v99();  //guess the 101/maximum sequence
  void guess101_v50_v99_wildly(int); //guess the 101/maximum sequence
  void guess101_v50_v99_wildly(); //guess the 101/maximum sequence


private:

  int numOnes;                //number of 1's in vec[100]
  int vec[200];               //vec[100] repeat in vec[100::199]--for efficiency
  int maxValue;
  int maxValuedVec[100];
};


RandomGuess::RandomGuess(int n)
{
  int i;

  for (i = 0; i < 200; i++)
    vec[i] = 0;
  for (i = 0; i < 100; i++)
    maxValuedVec[i] = 0;
  maxValue = 0;
  numOnes = n;
  srand(time(0));
  setVec(n);
}


void RandomGuess::setVec(int num)
{

  int i, k;
  if (num == 0) {
    for (i = 0; i < 200; i++)
      vec[i] = 0;
    return;
  }

  for (i = 0; i < num; i++)
    vec[i] = 1;
  
  for (i = 0; i < 100; i++)
    vec[100 + i] = vec[i];

  return;
}


void RandomGuess::randomSetVec(int num)
{

  int i, k;
  if (num == 0) {
    for (i = 0; i < 200; i++)
      vec[i] = 0;
    return;
  }

  for (i = 0; i < 100; i++)
    vec[i] = 0;
  for (i = 0; i < num; i++) {
    k = rand() % 100;
    vec[k] = 1;
  }
  for (i = 0; i < 100; i++)
    vec[100 + i] = vec[i];

  return;
}

void RandomGuess::cycledResults()
{

  int i;

  for (i = 0; i < 100; i++)
    cout<<eval(&vec[i])<<"  ";

  cout<<endl;

  return;
}


void RandomGuess::cycledDetailResults()
{

  int i, j;

  for (i = 0; i < 100; i++){
    cout<<"i = "<<i<<"  value = "<<eval(&vec[i])<<" The sequence is: "<<endl;
    for (j = 0; j < 100; j++)
      cout<<vec[i + j];
    cout<<endl;
  }

  cout<<endl;

  return;
}


//suppose number (xN) of 1 in vec[0::9]
void RandomGuess::guess101_v0_v9(int xN)
{

  int i, j, value;

  //vec[10::49] = 1; others = 0
  for (i = 0; i < 100; i++)
    vec[i] = 0;
  for (i = 10; i < 50; i++)
    vec[i] = 1;

  //initialize
  maxValue = (int) eval(&vec[0]);
  saveVec(vec);
  display();

  //guess
  for (i = 0; i <= 10 - xN; i++) {
    for (j = 0; j < xN; j++)
      vec[i + j] = 1;
    value = (int) eval(&vec[0]);
    if (value > maxValue) {
      maxValue = value;
      saveVec(vec);
      display();
      }
    for (j = 0; j < xN; j++)
      vec[i + j] = 0;
  }

  return;

}


//suppose number (xN) of 1 in vec[50::99]
void RandomGuess::guess101_v50_v99(int xN)
{

  int i, j, value;

  //vec[10::49] = 1; others = 0
  for (i = 0; i < 100; i++)
    vec[i] = 0;
  for (i = 10; i < 50; i++)
    vec[i] = 1;

  //initialize
  maxValue = (int) eval(&vec[0]);
  saveVec(vec);
  display();

  //guess
  for (i = 50; i <= 100 - xN; i++) {
    for (j = 0; j < xN; j++)
      vec[i + j] = 1;
    value = (int) eval(&vec[0]);
    if (value > maxValue) {
      maxValue = value;
      saveVec(vec);
      display();
      }
    for (j = 0; j < xN; j++)
      vec[i + j] = 0;
  }

  return;

}

//given number (xN) of 1's in vec[50::99]
//guess wildly
void RandomGuess::guess101_v50_v99_wildly(int xN)
{

  int i, j, value;

  //vec[10::49] = 1; others = 0
  for (i = 0; i < 100; i++)
    vec[i] = 0;
  for (i = 10; i < 50; i++)
    vec[i] = 1;

  //initialize
  maxValue = (int) eval(&vec[0]);
  saveVec(vec);
  display();

  //guess
  while (1) {     //loop forever!!
    for (i = 0; i < xN; i++) {
      j = rand() % 50;
      //cout<<"j = "<<j<<endl;
      vec[50 + j] = 1;
    }
    value = (int) eval(&vec[0]);
    if (value > maxValue) {
    maxValue = value;
    saveVec(vec);
    display();
    }
    for (j = 50; j < 100; j++)
      vec[j] = 0;
  }
  return;
}

//given random number of 1's in vec[50::99]
//guess wildly
void RandomGuess::guess101_v50_v99_wildly()
{

  int i, j, value, xN;

  //vec[10::49] = 1; others = 0
  for (i = 0; i < 100; i++)
    vec[i] = 0;
  for (i = 10; i < 50; i++)
    vec[i] = 1;

  //initialize
  maxValue = (int) eval(&vec[0]);
  saveVec(vec);
  display();

  xN = rand() % 49 + 1;
  //guess
  while (1) {     //loop forever!!
    for (i = 0; i < xN; i++) {
      j = rand() % 50;
      //cout<<"j = "<<j<<endl;
      vec[50 + j] = 1;
    }
    
    xN = rand() % 10;
    for (i = 0; i < xN; i++) {
      j = rand() % 10;
      //cout<<"j = "<<j<<endl;
      vec[j] = 1;
    }

    value = (int) eval(&vec[0]);
    if (value > maxValue) {
    maxValue = value;
    saveVec(vec);
    display();
    }
    for (j = 50; j < 100; j++)
      vec[j] = 0;
    for (j = 0; j < 10; j++)
      vec[j] = 0;

    xN = rand() % 49 + 1;  
  }
  return;
}

//suppose number "i-j-k/0-1-0/1-0-1" in vec[50::99]
void RandomGuess::guess101_i_j_k_in_v50_v99()
{

  int i, j, k, m, value;

  //vec[10::49] = 1; others = 0
  for (i = 0; i < 100; i++)
    vec[i] = 0;
  for (i = 10; i < 50; i++)
    vec[i] = 1;

  //initialize
  maxValue = (int) eval(&vec[0]);
  saveVec(vec);
  display();

  //guess
  k = 0;
  for (i = 50; i <= 97; i++)
    for (j = i + 1; j <= 98; j++) {
      //for (k = j + 1; k <= 99; k++) {
	//0-1-0 for i-j-k
	for (m = 50; m <= i; m++)
	  vec[m] = 0;
	for (m = i + 1; m <= j; m++)
	  vec[m] = 1;
	for (m = j + 1; m <= 99; m++)
	  vec[m] = 0;
	value = (int) eval(&vec[0]);
	if (value > maxValue) {
	  maxValue = value;
	  saveVec(vec);
	  display();
	  }

	//1-0-1 for i-j-k
	for (m = 50; m <= i; m++)
	  vec[m] = 1;
	for (m = i + 1; m <= j; m++)
	  vec[m] = 0;
	for (m = j + 1; m <= 99; m++)
	  vec[m] = 1;
	value = (int) eval(&vec[0]);
	if (value > maxValue) {
	  maxValue = value;
	  saveVec(vec);
	  display();
	  }
      }

  // cout <<"k = "<<k<<endl;
  return;

}

void RandomGuess::saveVec(int *v)
{
  for (int i = 0; i < 100; i++)
    maxValuedVec[i] = v[i];

  return;
}

void RandomGuess::display()
{
  cout<<endl<<"The maximum up to now is:  "<<maxValue<<endl;
  cout<<"And its corresponding sequence is:  "<<endl;

  for (int i = 0; i < 100; i++)
    cout<<maxValuedVec[i];
  cout<<endl;

  return;
}
 


//---------------------------------------------------------------
//       main:  guess101.cpp
//---------------------------------------------------------------
#include "guess.cpp"

int main(int argc, char *argv[])
{
  
  RandomGuess r1(atoi(argv[1]));
  //r1.randomSetVec(atoi(argv[1]));
  //r1.guess101_v0_v9(atoi(argv[2]));
  //r1.guess101_v50_v99(atoi(argv[2]));
  //r1.guess101_i_j_k_in_v50_v99();

  //r1.guess101_v50_v99_wildly(atoi(argv[2]));

  r1.guess101_v50_v99_wildly();
  //r1.cycledDetailResults();

  return 0; 

}


//---------------------------------------------------------------
//       main:  guess100.cpp
//---------------------------------------------------------------
#include <iostream.h>

double eval(int *pj);

int main()
{
  int vec[100];

  int i,j;

   for(i = 0; i < 100; i++){
    vec[i] = 0;
  }
  for(i = 0; i < 45; i++){
    vec[i] = 1;
  }
   
  cout <<"i = "<<i<<" value = "<<eval(vec) << "  And sequence is : "<<endl;
  for (j = 0; j <100; j++)
    cout<<vec[j];
  cout<<endl;
 
}
