Некоторый алгоритм из одной цепочки символов получает новую цепочку следующим образом. Сначала вычисляется длина исходной цепочки символов; если она чётна, то в середину цепочки символов добавляется символ А, а если нечётна, то в начало цепочки добавляется символ Б. В полученной цепочке символов каждая буква заменяется буквой, следующей за ней в русском алфавите (А — на Б, Б — на В и т. д., а Я — на А). Получившаяся таким образом цепочка является результатом работы алгоритма.
Например, если исходной была цепочка ВРМ, то результатом работы алгоритма будет цепочка ВГСН, а если исходной была цепочка ПД, то результатом работы алгоритма будет цепочка РБЕ.
Дана цепочка символов ТОР. Какая цепочка символов получится, если к данной цепочке применить описанный алгоритм дважды (т. е. применить алгоритм к данной цепочке, а затем к результату вновь применить алгоритм)? Русский алфавит: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ.
#include<iostream>
using namespace std;
int main(){
//исходная строка и новая
string str = "TOP", newStr = "";
if(str.length()%2) //если нечётная, то в начало добавляем В
newStr = "B"+str;
else{ //иначе в середину А
for(int i = 0; i < str.length()/2; i++)
newStr+=str[i];
newStr+="A";
for(int i = str.length()/2; i < str.length(); i++)
newStr+=str[i];
}
//заменяем буквы
for(int i = 0; i < newStr.length(); i++){
newStr[i] = newStr[i]+1;
}
//output: CUPQ
cout << newStr << endl;
return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
#include <windows.h>
void prepare(std::string& value, char a, char b)
{
size_t sz = value.size();
if(sz % 2)
value.insert(0, 1, b);
else
value.insert(sz / 2, 1, a);
}
auto shift = [](const char c, const char a)
{
return (c != 'Ё')
? (c != 'Е')
? a + ((c - a + 1) % 32)
: 'Ё'
: 'Ж';
};
std::string& process(std::string& s, const char a, const char b, int repeat)
{
if(!repeat) return s;
prepare(s, a, b);
std::transform(s.begin(), s.end(), s.begin(),
[&](char c){return shift(c, a);
});
return process(s, a, b, repeat - 1);
};
int main()
{
SetConsoleOutputCP(1251);
std::string one("ВРМ");
std::string two("ТОР");
std::cout << process(one, 'А', 'Б', 1) << "\n" // ВГСН
<< process(two, 'А', 'Б', 2) << std::endl; // ГФБРТ
}