Bonjour à tous,
Je me heurte à un gros mur je suis à cours d’idée pour réduire mon score !!!
J’ai jouer avec les boucles, les Patterns , les recherche de runes contenant la mêmes lettre … et la ben je n’ai plus d’idée et du coup je me retrouve un peu bloqué …
Quelqu’un pourrait-il me guidé vers la voie de la liberté s’il vous plait?
Alain
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
**/
int char_to_int(char c)
{
int value = -1;
if( c == ' ')
{
return value;
}
for(char cc = 'A' ; cc <= 'Z' ; cc++)
{
value++;
if( cc == c)
{
return value;
}
}
value = -1;
return value;
}
class Rune
{
public :
Rune()
{
//On démarre l'alphabet à zéro, donc -1 = espace
Number = -1 ;
}
int Get_Number()
{
return Number;
}
void Set_Number(int n)
{
if( n > 25)
{
this->Number = -1;
}
else if ( n < -1)
{
this->Number = 25;
}
else
{
this->Number = n;
}
}
private :
int Number;
};
class Player
{
public :
Player()
{
code.clear();
Position = 0;
Tape_count = 0;
Init_rune();
//On laisse la première rune en espace pour faciliter le texte
Avance();
}
void Avance()
{
code += '>';
Position++;
if( Position >= 29)
{
Position = 0;
}
}
void Recule()
{
code += '<';
Position--;
if( Position < 0)
{
Position = 29;
}
}
void Tape_la_rune()
{
code += '.';
Tape_count++;
}
void Augmente_la_rune()
{
code += '+';
rune[Position].Set_Number(rune[Position].Get_Number() + 1);
}
void Diminue_la_rune()
{
code += '-';
rune[Position].Set_Number(rune[Position].Get_Number() - 1);
}
void Init_rune()
{
for(int i = 0; i < 30 ; i++)
{
rune.push_back(Rune());
}
}
void Set_the_letter(int c)
{
int Wanted_letter = c;
if(rune[Get_Position()].Get_Number() > Wanted_letter)
{
if( Wanted_letter < 10 && rune[Get_Position()].Get_Number() > 18)
{
while(rune[Get_Position()].Get_Number() != Wanted_letter)
{
Augmente_la_rune();
}
}
else
{
while(rune[Get_Position()].Get_Number() != Wanted_letter)
{
Diminue_la_rune();
}
}
}
else
{
if( Wanted_letter > 18 && rune[Get_Position()].Get_Number() < 10)
{
while(rune[Get_Position()].Get_Number() != Wanted_letter)
{
Diminue_la_rune();
}
}
else
{
while(rune[Get_Position()].Get_Number() != Wanted_letter)
{
Augmente_la_rune();
}
}
}
}
void Loop_thru_Pattern(string Pattern,string str)
{
//On mets en place toute les lettres du pattern
for(int i = 0 ; i < Pattern.size() ; i++)
{
int actual_letter = char_to_int(Pattern.at(i));
Avance();
//Rune qui contient la lettre
Set_the_letter(actual_letter);
}
//On compte combien de fois le patten se repete
int size = (str.size() / Pattern.size() ) ;
cerr << "Nombre de tour neccessaire : " << size/25 << " et il reste : " << (size%25) << endl;
int loop_number = (size/25);
//On compte combien il nous reste
int reste;
if(loop_number == 0)
{
loop_number++;
reste = 0;
}
else
{
reste = (size%25);
}
int needed_size = ((size - reste)) ;
while(loop_number != 0)
{
cerr << "Loop turn : " << loop_number << endl;
int next_letter = (needed_size / loop_number) - 1;
cerr << next_letter << endl;
Avance();
//rune que l'on doit remettre à zéro
Set_the_letter(next_letter);
add_to_code('[');
for(int i = 0 ; i < Pattern.size() ; i++)
{
Recule();
}
for(int i = 0 ; i < Pattern.size() ; i++)
{
Tape_la_rune();
Avance();
}
Diminue_la_rune();
add_to_code(']');
//Nous sommes à un espace donc on remet la rune à -1
rune[Get_Position()].Set_Number(-1);
loop_number--;
needed_size -= (25*loop_number);
if(reste != 0)
{
for(int i = 0 ; i < Pattern.size() ; i++)
{
Recule();
}
}
}
cerr << "Reste = " << reste << endl;
for(int i = 0 ; i < reste ; i++)
{
if(Pattern.size() != 1)
{
for(int i = 0 ; i < Pattern.size() ; i++)
{
Tape_la_rune();
Avance();
}
}
else
{
Tape_la_rune();
}
}
}
string search(string str)
{
string pattern = "";
if( !str.empty())
{
//On recherche un pattern
for(int i = 0 ; i <= str.size() ; i++)
{
cerr << str.at(i) << endl;
string Pat = str.substr(0,i+1);
string text = str.substr(Pat.size(),str.size());
if(Pattern_search(Pat,text))
{
return Pat;
}
}
}
return pattern;
}
bool Pattern_search(string Pattern,string text)
{
for(int i = 0 ; i < text.size() ;i++)
{
for(int j = 0 ; j < Pattern.size() ; j++)
{
if(i+j < text.size() && Pattern.at(j) != text.at(i+j) )
{
return false;
}
}
if( i + (Pattern.size() - 1) <= text.size())
{
i += Pattern.size() - 1;
}
else
{
return false;
}
}
cerr << Pattern << endl;
return true;
}
//Recherche du chemin le plus rapide
void Search_letter(string str)
{
string Pattern = search(str);
if( !Pattern.empty() && Pattern != str)
{
cerr << "Nous avons un pattern : " << Pattern << endl;
Loop_thru_Pattern(Pattern,str);
return;
}
search(str);
for(int i = 0 ; i < str.size() ; i++)
{
if( Position == 0)
{
Avance();
}
int search = char_to_int(str.at(i));
bool exist = false;
//On recherche dans nos runes si nous avons déja cette lettre
for(int i = 0 ; i < rune.size() ; i++)
{
if(rune[i].Get_Number() == search)
{
Aller_a_la_rune(i);
Tape_la_rune();
exist = true;
break;
}
}
cerr << "La lettre " << str.at(i) << " n'as pas encore été utilisée" << endl;
//Si aucune rune ne contient notre lettre on cherche le moyen le plus court pour y acceder
if(!exist)
{
Set_the_letter(search);
Tape_la_rune();
if(i + 1 < str.size() && char_to_int(str.at(i + 1)) != search && search != -1)
{
Avance();
}
}
}
}
void Aller_a_la_rune(int n)
{
if( n < Position)
{
while( n != Position)
{
Recule();
}
}
else if( n > Position)
{
while( n != Position)
{
Avance();
}
}
}
void Play(string str)
{
Search_letter(str);
}
string Get_code()
{
return code;
}
void add_to_code(char c)
{
code += c;
}
int Get_tape_count()
{
return Tape_count;
}
int Get_Position()
{
return Position;
}
private :
string code ;
int Position;
int Tape_count;
vector<Rune> rune;
};
int main()
{
string magic_phrase;
getline(cin, magic_phrase);
Player tim = Player();
tim.Play(magic_phrase);
cout << tim.Get_code() << endl;
}