среда, 28 сентября 2011 г.

Brain exercise или Тренеровка для мозга

Один мой знакомый
прислал как то мне такой на первый взгляд бредовый текст:

94НН03 С006Щ3НN3 П0К4ЗЫ8437,
К4КN3 У9N8N73ЛЬНЫ3 83ЩN М0Ж37 93Л47Ь Н4Ш Р4ЗУМ! 8П3Ч47ЛЯЮЩN3 83ЩN! СН4Ч4Л4 Э70 6ЫЛ0 7РУ9Н0, Н0 С3ЙЧ4С Н4 Э70Й С7Р0К3 84Ш Р4ЗУМ ЧN7437
Э70 4870М47NЧ3СКN, Н3 З49УМЫ84ЯСЬ 06 Э70М. Г0Р9NСЬ. ЛNШЬ
0ПР393Л3ННЫ3 ЛЮ9N М0ГУ7 ПР0ЧN747Ь Э70.

Прочитав (точнее пробежав глазами) до конца эти крякозяблики, недолго
мучаясь, я облегчил себе задачу чтения и перевода в этот «цифрусский»
текст  кодом на C++: 
#include "stdafx.h"//для VC++

#include <iostream>
#include <fstream>

#include <map>

#include <algorithm>
#include <string>

using namespace std;

int main ( int argc, char *argv[] )

{

/*SignText for Russian words

(C) O. Halzov
2011-09-27

Конвертация между русским текстом и «знакорусским» :)

Русский текст=РУССКNЙ 73КC7

Для тренировки мозга и шутки ради.

Пример:

Читаем текст из файла и конвертируем его в
числотекст на экран:

SignText.exe E erussian.txt

Читаем числотекст из файла и конвертируем
его в русский текст на экран:

SignText.exe D drussian.txt*/

setlocale(0,"");//Дабы VC++ понял русский, а мы поняли его.

if (argc<=2){

cout<<"Please input 2 parameters: [E|D] - encode|decode
text and ['filename']!"
<<endl;

cout<<"Получишь не АБВГД, а 468Г9 :)"<<endl;

return 0;

}


std::map <char, char>
dec_list;//decode list

std::map <char, char>
enc_list;//encode list

string
strOut;

string strIn;

//Списки замены,наверняка можно обойтись одним, но пока некогда копать:

dec_list['4'] = 'А'; dec_list['7'] = 'Т'; dec_list['N'] = 'И'; dec_list['8'] = 'В';

dec_list['9'] = 'Д'; dec_list['6'] = 'Б'; dec_list['3'] = 'Е'; dec_list['0'] = 'О';

enc_list['А'] = '4'; enc_list['Т'] = '7'; enc_list['И'] = 'N'; enc_list['В'] = '8';

enc_list['Д'] = '9'; enc_list['Б'] = '6'; enc_list['Е'] = '3'; enc_list['О'] = '0';


ifstream b_file
(argv[2]);

while (!b_file.eof() ) {

b_file>>
strIn;

if (strOut.length()>0)

{

strOut=strOut
+ ' ' + strIn;

}

else

{

strOut=strIn;

}

}

b_file.close();

map<char, char>::iterator
pos;

using
std::replace;

//Работаем только с верхним регистром для улучшения читабельности:

transform(strOut.begin(),
strOut.end(),strOut.begin(), ::toupper);

if (*argv[1] == 'E'){

for (pos=enc_list.begin();
pos!=enc_list.end();++pos){

replace(strOut.begin(), strOut.end(), pos->first, pos->second);

}

}

if (*argv[1] == 'D'){

for (pos=dec_list.begin();
pos!=dec_list.end();++pos){

replace(strOut.begin(), strOut.end(), pos->first, pos->second);

}

}

//Результат на экран:

cout<< strOut << endl;

}