Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <clocale>
- #include <string>
- #include <cctype>
- #include <vector>
- #include <string>
- #include <cstring>
- using namespace std;
- typedef unsigned short int usi;
- typedef unsigned char uc;
- // Функция возвращает код русского символа (в таблице Юникода) записанного в utf-8
- usi getcode(usi c) {
- usi ret = 0, p1 = 0xff00, p2 = 0x00ff;
- uc a = 0x1f, b = 0x3f;
- ret += (((c & p1) >> 8) & a);
- ret <<= 6;
- ret += (c & p2 & b);
- return ret;
- }
- // Функция возвращает преобразованный в utf-8 код русского символа
- usi toutf8(usi c) {
- usi ret = 0;
- uc a = 0xc0, b = 0x80;
- b += c & 0x003f;
- c >>= 6;
- a += c & 0x001f;
- ret += a;
- ret <<= 8;
- ret += b;
- return ret;
- }
- bool isupper_ru(usi c) {
- return c == 0x401 || c >= 0x410 && c <= 0x42f;
- }
- void crypto(string &s, int offset) {
- if (offset < 0)
- offset = 33 + offset;
- unsigned short int a = 0;
- unsigned char b = 0x80;
- for (int i = 0; i < s.size(); ++ i) {
- if (s[i] < 0) {
- usi t = 0, code;
- // Получение кода utf-8
- t += (uc)s[i];
- t <<= 8;
- t += (uc)s[i + 1];
- //
- code = getcode(t);
- /*
- (Ниже) Сдвиг русского символа по шифру Цезаря
- по определённому смещению.
- Отдельное описание для строчных и заглавных букв.
- Код символа для удобства преобразуется
- в порядковый номер буквы в алфавите и в этом виде
- происходит сдвиг.
- */
- if (isupper_ru(code)) {
- code -= 0x410;
- if (code >= 6) // Выделяется место для буквы Ё
- ++ code; //
- if (code < 0) // Буква Ё ставится на 6-ую позицию (начиная с 0)
- code = 6; //
- code = (code + offset) % 33;
- if (code == 6) //
- code = -15; // Обратная трансформация русского символа.
- if (code >= 7) // Для Ё выбирается значение в соответсвии
- -- code; // с таблицей Юникода.
- code += 0x410;
- }
- else {
- code -= 0x430;
- if (code >= 6 && code <= 32)
- ++ code;
- if (code > 32)
- code = 6;
- code = (code + offset) % 33;
- if (code == 6)
- code = 33;
- if (code >= 7 && code != 33)
- -- code;
- code += 0x430;
- }
- code = toutf8(code);
- s[i] = char(code >> 8);
- s[i + 1] = char(code & 0x00ff);
- ++ i;
- }
- }
- }
- // Функция возвращает vector из n первых слов словаря данной программы
- vector<string> read_words(const int n) {
- vector<string> ret(0);
- char buf[128];
- FILE* f = fopen("words.num", "r");
- for (int i = 0; i < n; ++ i) {
- fscanf(f, "%*s%*s%s", buf);
- ret.push_back(string(buf));
- }
- fclose(f);
- return ret;
- }
- // Функция возвращает только русские слова из входного файла
- vector<string> read_message() {
- vector<string> ret(0);
- char buf[8192];
- int last, current;
- FILE* f = fopen("input.txt", "r");
- while (fscanf(f, "%[А-ПР-Яа-пр-яЁё]%*[!-~\n ]", buf)) {
- current = ftell(f);
- if (current == last)
- break;
- last = current;
- ret.push_back(string(buf));
- }
- fclose(f);
- return ret;
- }
- const int _n = 69307;
- int main(void) {
- //setlocale(LC_ALL, "Russian");
- //69307
- vector<string> words = read_words(_n),
- message = read_message();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement