#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>
#include <iterator>

using namespace std;

typedef vector<int> Sayilar;

class Problem
{
  public:
    // Bilgilendirme yapıp yeni sayılar üretiyor
    Problem();
    // Yeni sayılar üretiyor
    void problem_uret();
    // Eldeki sayıları ve hedefi ekrana basıyor
    void yaz();
    // Oyuncudan bilgi alıp gerekeni yapıyor
    void satir_oku();
    // Verilen sayılar vector'deyse ve işlem uygunsa işlemi yapıyor
    int islem_yap( int sayi1, char isaret, int sayi2 );
    // Oyuncu hedefe ulaşmışsa yeni sayılar üretiyor
    void kontrol();
    // Vector'ü bir işlem önceki haline döndürüyor
    void geri_al();
  
  private:
    // Oyuncunun kullanabileceği sayıları tutan vector
    Sayilar elde;
    // Oyuncunun kullandığı sayıları ve sonuçlarını tutan vector
    Sayilar yapilmis;
    // Ulaşılması gereken hedef
    int hedef;
};

Problem::Problem()
{
  cout << endl ;
  cout << "[CG]Islem oyununa hosgeldiniz" << endl;
  cout << endl;
  cout << "Islemlerinizi [7 - 5] formatıyla girin" << endl;
  cout << "[+ - * /] isaretlerini kullanabilirsiniz" << endl;
  cout << "Yaptiginiz islemi geri almak icin [<<]" << endl;
  cout << "Yeni sayilar uretmek icin [n]" << endl;
  cout << "Oyundan cikmak icin [x] yazin" << endl;
  cout << endl;
  problem_uret();
  yaz();
}

void Problem::problem_uret()
{
  srand( time( NULL ) );
  elde.clear();
  yapilmis.clear();
  for( int i = 0; i < 5; i++ )
  {
    elde.push_back( rand() % 9 + 1 );
  }
  elde.push_back( rand() % 90 + 10 );
  hedef = rand() % 900 + 100;
  cout << "---Yeni sayilar uretildi---" << endl;
  cout << endl;    
}

void Problem::yaz()
{
  sort( elde.begin(), elde.end() );
  cout << "[ ";
  for( unsigned int i = 0; i < elde.size(); ++i )
  {
    cout << elde[i] << " ";
  }
  cout << "] = " << hedef << endl;
}

void Problem::satir_oku()
{
  string girdi;
  getline( cin, girdi );
  if( girdi == "x" || girdi == "X" )
  {
    exit( 0 );
  }
  else if( girdi == "n" || girdi == "N" )
  {
    problem_uret();
    yaz();
  }
  else if( girdi == "<<" )
  {
    geri_al();
  }
  else
  {
    stringstream gecici;
    int sayi1 = 0, sayi2 = 0;
    char isaret = '\0';
    gecici << girdi;
    gecici >> sayi1 >> isaret >> sayi2;
    int tmp = islem_yap( sayi1, isaret, sayi2 );
    switch( tmp )
    {
      case 0:
        yaz();
        break;
      
      case 1:
        cout << "Listede olmayan sayi / hatali yazim" << endl;
        break;
      
      case 2:
        cout << "Kalanli veya sifira bolme yapilamaz" << endl;
        break;
		}
	}
}

int Problem::islem_yap( int sayi1, char isaret, int sayi2 )
{
  Sayilar::iterator yer;
  yer = find( elde.begin(), elde.end(), sayi1 );
  if( yer == elde.end() )
  {
    return 1;
  }
  elde.erase( yer );
  yer = find( elde.begin(), elde.end(), sayi2 );
  if( yer == elde.end() )
  {
    elde.push_back( sayi1 );
    return 1;
  }
  elde.erase( yer );
  switch( isaret )
  {
    case '+':
    elde.push_back( sayi1 + sayi2 );
    yapilmis.push_back( sayi1 );
    yapilmis.push_back( sayi2 );
    yapilmis.push_back( sayi1 + sayi2 );
    return 0;
    
    case '-':
    elde.push_back( sayi1 - sayi2 );
    yapilmis.push_back( sayi1 );
    yapilmis.push_back( sayi2 );
    yapilmis.push_back( sayi1 - sayi2 );
    return 0;
    
    case '*':
    elde.push_back( sayi1 * sayi2 );
    yapilmis.push_back( sayi1 );
    yapilmis.push_back( sayi2 );
    yapilmis.push_back( sayi1 * sayi2 );
    return 0;
    
    case '/':
    if( sayi2 == 0 || sayi1 % sayi2 != 0 ) {
      elde.push_back( sayi1 );
      elde.push_back( sayi2 );
      return 2;
    }
    elde.push_back( sayi1 / sayi2 );
    yapilmis.push_back( sayi1 );
    yapilmis.push_back( sayi2 );
    yapilmis.push_back( sayi1 / sayi2 );
    return 0;
    
    default:
    elde.push_back( sayi1 );
    elde.push_back( sayi2 );
    return 1;
  }
}

void Problem::kontrol()
{
  string girdi;
  if( find( elde.begin(), elde.end(), hedef ) != elde.end() )
  {
    cout << endl;
    cout << "Tebrikler sonuca ulastiniz" << endl;
    problem_uret();
    yaz();
  }
}

void Problem::geri_al()
{
  Sayilar::iterator yer;
  if( yapilmis.empty() )
  {
    cout << "Henuz hic islem yapmadiniz#514747#FFFFFF" << endl;
  }
  else
  {
    yer = find( elde.begin(), elde.end(), yapilmis.back() );
    elde.erase( yer );
    yapilmis.pop_back();
    elde.push_back( yapilmis.back() );
    yapilmis.pop_back();
    elde.push_back( yapilmis.back() );
    yapilmis.pop_back();
    yaz();
  }
}

int main()
{
  Problem problem;
  while( true )
  {
    problem.kontrol();
    problem.satir_oku();
  }
}

