﻿#include <iostream>
#include <fstream>
#include <cstdlib>
#include <math.h>
#include <sstream>
#include <string>

using namespace std;

string program[100];

int energia(string program);
string atalakit(string program);
bool is_irany(char cr);
string visszaalakit(string ujprogram);



int main()
{
    setlocale(LC_ALL, "hun");

    //1. feladat
    ifstream be;
    be.open("program.txt");
    if(be.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    int darabszam;
    be >> darabszam;
    unsigned int i=0;
    while(!be.eof()) {

        be >> program[i];
        i++;

    }
    int db=i-1;
    /*
    for(i=0; i<db; i++){

        cout << program[i] << endl;

    }
    */
    //2/a feladat: Egyszerûsíthetõ-e az utasítás
    cout << "2/a feladat" << endl;
    int sorszam;
    cout << "Adja meg az utasítás sorszámát (1-" << db << " között): ";
    cin >> sorszam;
    sorszam--;
    bool egyszerusitheto=false;
    i=0;
    while(i!=program[sorszam].length()-1 && !egyszerusitheto) {

        if((program[sorszam][i]=='E' && program[sorszam][i+1]=='D') ||
           (program[sorszam][i]=='D' && program[sorszam][i+1]=='E') ||
           (program[sorszam][i]=='N' && program[sorszam][i+1]=='K') ||
           (program[sorszam][i]=='K' && program[sorszam][i+1]=='N')) egyszerusitheto=true;
        i++;

    }
    if(egyszerusitheto) cout << "Az utasítás egyszerûsíthetõ" << endl;
    else cout << "Az utasítás nem egyszerûsíthetõ" << endl;

    //2/b feladat
    cout << "2/b feladat" << endl;
    int x=0, y=0, lepesszam;
    float maxtavolsag=0; //1/c feladathoz
    i=0;
    while(i!=program[sorszam].length()) {

        if(program[sorszam][i]=='E') y++;
        if(program[sorszam][i]=='D') y--;
        if(program[sorszam][i]=='N') x--;
        if(program[sorszam][i]=='K') x++;
        if(maxtavolsag<sqrt(x*x+y*y)) {
            maxtavolsag=sqrt(x*x+y*y);
            lepesszam=i;
        }
        i++;

    }
    cout << "A robotnak " << abs(x) << " lépést kell tenni a KN tengely mentén és " << abs(y) << " lépést kell tenni az ED tengely mentén." << endl;

    //2/c feladat
    cout << "2/c feladat" << endl;
    cout << "A robot a " << lepesszam << " lépésnél kerül a legtávolabb és a " << "maximális távolság: " ;
    printf("%.3f",maxtavolsag);
    cout << endl;

    //3. feladat
    cout << "3. feladat" << endl;

    for(int i=0; i<db; i++) {

        if(energia(program[i])<=100) cout << i+1 << " " << energia(program[i]) << endl;

    }

    //4. feladat
     cout << "4. feladat" << endl;
    ofstream ki;
    ki.open("ujprog.txt");
    if(ki.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }

    for(int i=0; i<db; i++) {

        ki  << atalakit(program[i]) << endl;

    }
    ki.close();
    cout << "A fájlbaírás kész." << endl;
    //5. feladat
    cout << "5. feladat" << endl;
    string ujutasitas;
    cout << "Adjon meg egy új formátumú utasítást: ";
    cin >> ujutasitas;
    cout << ujutasitas << ": " << visszaalakit(ujutasitas) << endl;
    /// cout << "11E3DK: " << visszaalakit("11E3DK"); ///csak teszt
    cin.get();
    return 0;
}
///függvények definíciója
int energia(string program) {

    int e=2; //indulás két egység
    e+=program.length(); //minden megtett távolság egy egység
    for(unsigned int i=0; i<program.length()-1; i++) {

        if(program[i]!=program[i+1]) e+=2; //irányváltás 2 egység

    }
    return e;
}

string atalakit(string program) {

    stringstream ujprogram;

int szamlalo=1;
    for(unsigned i=0; i<program.length(); i++) {

        if(program[i]==program[i+1]){

            szamlalo++;

        }

        if(program[i]!=program[i+1]) {
            if(szamlalo==1) ujprogram << program[i] ;
            else ujprogram << szamlalo << program[i] ;
            szamlalo=1;
        }

    }
    return ujprogram.str();

}

bool is_irany(char cr) {

    if(cr=='E' || cr=='D' || cr=='K' || cr=='N') return true;
    else return false;

}

string visszaalakit(string ujprogram) {
    int szam;
    stringstream program, resz;
    char ch_100, ch_10, ch_1;
    //elõször megnézzük, hogy mi van akkor, ha szám van az elején
    if(!is_irany(ujprogram[0]) && is_irany(ujprogram[1])) {         //1. szám, 2. irány
          ch_1=ujprogram[0];
          szam=ch_1-'0';
          for(int j=0; j<szam-1; j++){

            program << ujprogram[1];

          }

    }
    else if(!is_irany(ujprogram[0]) && !is_irany(ujprogram[1]) && is_irany(ujprogram[2])) {    //1. szám, 2. szám, 3. irány

          ch_10=ujprogram[0], ch_1=ujprogram[1];
          szam = 10*(ch_10-'0')+(ch_1-'0');

          for(int j=0; j<szam-1; j++){

            program << ujprogram[2];

          }

    }
    else if(!is_irany(ujprogram[0]) && !is_irany(ujprogram[1]) && !is_irany(ujprogram[2])) {    //1-3. szám

          ch_100=ujprogram[0], ch_10=ujprogram[1], ch_1=ujprogram[1];
          szam =  100*(ch_100-'0')+10*(ch_10-'0')+(ch_1-'0');

          for(int j=0; j<szam-1; j++){

            program << ujprogram[3];

          }

    }
	 else if(is_irany(ujprogram[0]))  program << ujprogram[0];
    for(unsigned int i=1; i<ujprogram.length(); i++) {


        if(!is_irany(ujprogram[i]) && !is_irany(ujprogram[i+1]) && !is_irany(ujprogram[i+2])) {   //3 egymást követõ szám
          ch_100=ujprogram[i], ch_10=ujprogram[i+1], ch_1=ujprogram[i+2];
          szam=(ch_100-'0')*100 + (ch_10-'0')*10+ (ch_1-'0');
          cout << szam<< endl;
          for(int j=0; j<szam-1; j++){

            program << ujprogram[i+3];

          }

        }
        else if(is_irany(ujprogram[i-1]) && !is_irany(ujprogram[i]) && !is_irany(ujprogram[i+1]) && is_irany(ujprogram[i+2])) { //pontosan kettõ egymást követõ szám

          ch_10=ujprogram[i], ch_1=ujprogram[i+1];
          szam = 10*(ch_10-'0')+ch_1-'0';


          cout << szam << endl;
          for(int j=0; j<szam-1; j++){

            program << ujprogram[i+2];

          }

        }
        else if(is_irany(ujprogram[i-1]) && !is_irany(ujprogram[i]) && is_irany(ujprogram[i+1])) { //pontosan egy szám, elõtte, utána irány
          ch_1=ujprogram[i];
          szam=ch_1-'0';
          for(int j=0; j<szam-1; j++){

            program << ujprogram[i+1];

          }

        }
        else if(is_irany(ujprogram[i])) {     //csak irány

            program << ujprogram[i];
        }

    }

    return program.str();

}
