#include <iostream>         // cin, cout
#include <fstream>          // fájlkezelés
#include <vector>           // vector adattípus
#include <string>           // szöveg adattípus
#include <algorithm>        // maximum (max_element)

using namespace std;

void feladat(int f)
{
    printf("-------------------------------------------------------------------------\n");
    printf("%d. feladat\n" ,f);
    printf("-------------------------------------------------------------------------\n");
}

void F1_2(vector<string> &osv, vector<int> &dob)
{
    ifstream fbe;
    fbe.open("osvenyek.txt");
    string temp;
    while(fbe >> temp)
    {
        osv.push_back(temp);
    }
    fbe.close();
    fbe.open("dobasok.txt");
    int itemp;
    while(fbe >> itemp)
    {
        dob.push_back(itemp);
    }
    cout << endl;
    feladat(2);
    cout << "A dobások száma: " << dob.size() << endl;
    cout << "Az ösvények száma: " << osv.size() << endl;
}

bool max_szempont(string a, string b)
{
    return a.length() < b.length();
}

void F3(vector<string> osv)
{
    feladat(3);
    vector<string>::iterator it = max_element(osv.begin(),osv.end(),[](string a, string b) {return a.size() < b.size();});
    string maxh = *it;
    cout << "Az egyik leghosszabb a(z) " << it - osv.begin() + 1 << ". ösvény, hossza: " << maxh.size() << endl;
}

void F4(vector<string> osv, vector<int> dob, int &os, int &jsz)
{
    feladat(4);
    cout << "Adja meg egy ösvény sorszámát! ";
    cin >> os;
    cout << "Adja meg a játékosok számát! ";
    cin >> jsz;
}

void F5(vector<string> osv, int os)
{
    feladat(5);
    vector<char> mezok={'M','V','E'};
    int db;
    for(char mezo:mezok)
    {
        db = count(osv[os].begin(),osv[os].end(),mezo);
        if(db>0) printf("%c: %d darab\n",mezo,db);
    }
}

void F6(vector<string> osv, int os)
{
    ofstream fki;
    fki.open("kulonleges.txt");
    char mezo;
    for(auto i=0;i<osv[os].size();i++)
    {
        mezo=osv[os][i];
        if(mezo!='M') fki << i+1 << "\t" << mezo << endl;
    }
    fki.close();
}

void F7(vector<string> osv, vector<int> dob, int os, int jsz)
{
    feladat(7);
    vector<int> pozicio={0,0,0,0,0};       // max. 5 játékos lehet
    int vege,nyertes=0;
    for(auto i=0;i<dob.size()-jsz;i+=jsz)
    {
        for(auto j=0;j<jsz;j++)
        {
            pozicio[j]+=dob[i+j];
            if(pozicio[j]>=osv[os].size())
                nyertes=j+1;
                vege=i/jsz+1;
        }
        if(nyertes!=0) break;
    }
    printf("A játék a(z) %d. körben fejeződött be. A legtávolabb jutó(k) sorszáma: %d\n",vege,nyertes);
}

void F8(vector<string> osv, vector<int> dob, int os, int jsz)
{
    feladat(8);
    vector<int> pozicio={0,0,0,0,0};       // max. 5 játékos lehet
    vector<int> nyertesek={};
    int vege=0;
    for(auto i=0;i<dob.size()-jsz;i+=jsz)
    {
        for(auto j=0;j<jsz;j++)
        {
            pozicio[j]+=dob[i+j];
            if(pozicio[j]<osv[os].size())
            {
                switch(osv[os][pozicio[j]-1])
                {
                    case 'V': pozicio[j]-=dob[i+j]; break;
                    case 'E': pozicio[j]+=dob[i+j];
                }
            }
            if(pozicio[j]>=osv[os].size()) nyertesek.push_back(j+1);
        }
        if(nyertesek.size()>0) break;
    }
    cout << "Nyertes(ek): ";
    for(auto i=0;i<nyertesek.size();i++)
    {
        cout << nyertesek[i] << " ";
    }
    if(nyertesek.size()==jsz)
        cout << "Mindenki nyertes!" << endl;
    else
    {
        cout << "\nA többiek pozíciója:" << endl;
        for(auto i=0;i<jsz;i++)
        {
            if(pozicio[i] < osv[os].size())
                cout << i+1 << ". játékos, " << pozicio[i] << ". mező" << endl;
        }
    }
}

int main()
{
    setlocale(LC_ALL,"");
    // adatok
    cout << "TÁRSAS - 2023. október emelt informatika" << endl;
    vector<string> osvenyek;
    vector<int> dobasok;
    int os, jsz;
    F1_2(osvenyek, dobasok);
    F3(osvenyek);
    F4(osvenyek, dobasok, os, jsz);
    F5(osvenyek,os-1);
    F6(osvenyek,os-1);
    F7(osvenyek, dobasok, os-1, jsz);
    F8(osvenyek, dobasok, os-1, jsz);

    return 0;
}
