Łamacz GG (SPOJ - JGGHACK) – pomoc w znalezieniu błędu w kodzie

0

Witam, potrzebuję pomocy w znalezieniu błędu w kodzie łamiącym hasło GG. Program działa, niestety spoj go nie akceptuje. Może ktoś bardziej doświadczony w programowaniu, pomoże mi. Podaję link do zadania//pl.spoj.com/problems/JGGHACK/

#include <iostream>

using namespace std;

int main()
{
    string kod;
    cin >> kod;
    int dlugoscKodu = kod.length();
    string tablicaZnakow = "ABCDEFGHIJKLMNOP";
    int tablicaWartosciPierwszegoZnakuWparze[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    int tablicaWartosciDrugiegoZnakuWparze[] = {0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240};
    int wartoscPierwszegoZnaku = 0, wartoscDrugiegoZnaku = 0, sumaWartosciDwochZnakow=0;

    for (int i =0; i<dlugoscKodu; i=i+2)
    {
        int k=0;
        while (k<=15)
        {
            if (kod[i] == tablicaZnakow[k])
            {
                wartoscPierwszegoZnaku = tablicaWartosciPierwszegoZnakuWparze[k];
                break;
            }
            k++;
        }
        int p=0;
        while (p<=15)
        {
            if (kod[i+1] == tablicaZnakow[p])
            {
                wartoscDrugiegoZnaku = tablicaWartosciDrugiegoZnakuWparze[p];
                break;
            }
            p++;
        }
        sumaWartosciDwochZnakow = wartoscPierwszegoZnaku + wartoscDrugiegoZnaku;

        cout << (char)sumaWartosciDwochZnakow;
    }
    cout << endl;

    return 0;
}
4

https://ideone.com/05mPsQ

dla 3 inputow przetwarza tylko pierwszy

3

Strasznie skomplikowany ten kod. Tu masz wersję sprawdzającą poprawność danych wejściowych, a bardziej czytelną.

#include <iostream>
#include <cctype>
#include <exception>

void throwIfInvalidEncodedChar(char ch) {
    if (ch < 'A' || ch > 'P')
        throw std::invalid_argument("invalid encoded character"); 
}

std::string decodeGaduGadu(const std::string encoded) {
    std::string result;
    for (auto it = encoded.begin(); it != encoded.end(); ++it) {
        throwIfInvalidEncodedChar(*it);
        auto lowerHex = *it - 'A';
        if (++it == encoded.end()) {
            throw std::invalid_argument("length of encoding is not even");
        }
        throwIfInvalidEncodedChar(*it);
        auto higherHex = *it - 'A';
        result.push_back(lowerHex + higherHex * 16);
    }
    return result;
}

int main()
{
    std::string encoded;
    
    while (std::cin >> encoded) {
        std::cout << decodeGaduGadu(encoded) << '\n';
    }
 
    return 0;
}

Zwróć uwagę, że operacje wejścia wyjścia są oddzielone od rozwiązania właściwego problemu.

0

Dzięki za podpowiedzi, umieściłam swój kod w pętli while(cin>>kod) i spoj zaakceptował. Nie doczytałam, że w tym zadaniu potrzebna jest nieokreślona ilość danych wejściowych.

Jasne, przeanalizuję dokładnie powyższy kod. Dzięki.

0

Żeby było jasne, twoje rozwiązanie jest poprawne (poza operacjami IO). Problem w tym, że trzeba spiąć pośladki, żeby zrozumieć co to robi twój kod.
Im szybciej nauczysz się pisać czytelny kod tym lepiej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1