Codingame - Encryption-Decryption of Enigma Machine
Може ли малко разяснения относно задачата: Encryption-Decryption of Enigma Machine в codingame.
Така както е зададен дефолтния код в задачата, според мен не може да се реши задачата защото четем съобщението едва след като сме прочели трите ротора. По този начин, след завъртането на цикъла, можем да работим само с третия ротор, а така не може да се реши задачата. Аз направих едно решение, което работи коректно, но играта не ми го приема.
https://pastebin.com/yiduuj3D
Благодаря за разясненията и забележките! Пооправих си малко кода и дори първият ми тест мина успешно. Но на останалите се провалям. Програмата ми се чупи със съобщение: string subscript out of range. Кой стринг ми е извън обхват не знам. И ако е така защо ми минава първият тест?
https://pastebin.com/yiduuj3D
Привет,
Предполагам проблема ти е тук:
std::string decryptedRotorMsg(std::string& msg, const std::string& rotor) {
const std::vector<int> msgIndexes = getMsgIndexes(msg);
const size_t arrSize = msgIndexes.size();
for (size_t i = 0; i < arrSize; i++)
{
msg[i] = getAlphaFromIndex(rotor.find(msg[i]));
}
return msg;
}
В msg[i] достъпваш несъщестнуващ индекс.
Пробвай да принтираш на cerr различни неща в твоята задача и ще видиш проблема.
Първия тест ти минава, защото е "прост" и не покрива голяма част от подводните камъни.
void printEncryptedMsg(const std::vector<std::string>& rotors, std::string& masage, const int& pseudoRandomNumber) {
std::string shiftMsg = caesarShift(pseudoRandomNumber, masage);
std::string encryptedMsgAfterFirstRotor = encryptedRotorMsg(shiftMsg, rotors[0]);
std::string encryptedMsgAfterSecondRotor = encryptedRotorMsg(encryptedMsgAfterFirstRotor, rotors[1]);
std::string encryptedMsgAfterThirdRotor = encryptedRotorMsg(encryptedMsgAfterSecondRotor, rotors[2]);
std::cout << encryptedMsgAfterThirdRotor << std::endl;
}
Това може да стане с един цикъл.
Нямаш нужда от нови променливи.