Skip to content

Instantly share code, notes, and snippets.

@trueskawka
Last active January 30, 2017 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trueskawka/491de752f4dc596fc9a3da5a9e6271fa to your computer and use it in GitHub Desktop.
Save trueskawka/491de752f4dc596fc9a3da5a9e6271fa to your computer and use it in GitHub Desktop.
Decoding a message in C++
#include <cstdio>
int decode_number(int number, int mode)
{
char characters[] = { '!', '?', ',', '.', ' ', ';', '"', '\'' };
char letter;
if (mode == 0) {
number %= 27;
letter = 'A' + number - 1;
} else if (mode == 1) {
number %= 27;
letter = 'a' + number - 1;
} else {
number %= 9;
letter = characters[number-1];
}
if (number == 0) return mode = (mode + 1) % 3;
printf("%c", letter);
return mode;
}
int main() {
FILE *fp = stdin;
int ch = 0;
int number = 0;
int mode = 0;
while ( ((ch = getc(fp)) >= '0' && ch <= '9') || ch == ',' )
{
if ( ch != ',' )
{
ch = ch - '0';
number = number * 10 + ch;
} else {
mode = decode_number(number, mode);
number = 0;
}
}
mode = decode_number(number, mode);
printf("\n");
return 0;
}
// Test case:
// 313,12312,906,3337,2529,568,1994,689,14994,221,216,11,500,18,11684,0,136,1496,27,10
// "Poprawnie? Tak!"
char outputCharacter;
enum modeType {UPPERCASE, LOWERCASE, PUNCTUATION};
modeType mode = UPPERCASE;
char digitChar;
do {
digitChar = cin.get();
int number = (digitChar - '0');
digitChar = cin.get();
while ((digitChar != 10) && (digitChar != ',')) {
number = number * 10 + (digitChar - '0');
digitChar = cin.get();
}
switch (mode) {
case UPPERCASE:
number = number % 27;
outputCharacter = number + 'A' - 1;
if (number == 0) {
mode = LOWERCASE;
continue;
}
break;
case LOWERCASE:
number = number % 27;
outputCharacter = number + 'a' - 1;
if (number == 0) {
mode = PUNCTUATION;
continue;
}
break;
case PUNCTUATION:
number = number % 9;
switch (number) {
case 1: outputCharacter = '!'; break;
case 2: outputCharacter = '?'; break;
case 3: outputCharacter = ','; break;
case 4: outputCharacter = '.'; break;
case 5: outputCharacter = ' '; break;
case 6: outputCharacter = ';'; break;
case 7: outputCharacter = '"'; break;
case 8: outputCharacter = '\''; break;
}
if (number == 0) {
mode = UPPERCASE;
continue;
}
break;
}
cout << outputCharacter;
} while (digitChar != 10);
cout << "\n";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment