Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- using namespace std;
- //Lo emplea la codificacion cesar para desplazar letras en las dos direcciones
- char letraCiclica (char letra,int offset){//Sube o baja una letra d
- bool sentido(offset>0 ? true : false);
- while (offset !=0){
- sentido ? offset --: offset++ ;
- sentido ? ++letra : --letra ;//Sube o baja en el abecedario
- if (letra<'A'){letra ='Z';}//La letra esta por debajo de A pasa a Z
- if (letra>'Z'){letra ='A';}//La letra esta por encima de Z pasa a A
- }
- return letra;
- }
- //***********************************************************************************************
- //Codificacion cesar
- string cesar(string &mensaje,int shift,bool operacion=true){
- //Rotacion ciclica
- if (operacion){//ENCODE
- for (unsigned index=0;index<mensaje.size();index++){//Recorre letras del mensaje
- mensaje[index]=letraCiclica(mensaje[index],shift+index);
- }
- }else{//DECODE
- for (int index=mensaje.size()-1;index>=0;index--){//Recorre letras del mensaje
- mensaje[index]=letraCiclica(mensaje[index],-(shift+index));
- }
- }
- return mensaje;
- }
- //***********************************************************************************************
- //Recibe un ROTOR numero rotor ,
- string rotorCode(vector<string> &rotores,int rotor,string alfabeto ,string &mensaje,bool operacion){
- string tmp;
- //cout <<mensaje<<endl;
- for (auto letra:mensaje){//Recorre las letras del mensaje
- for (unsigned index=0;index<alfabeto.size();index++){//Busca la letra en el rotor , ojo el sentido
- //ENCODE
- if (operacion && alfabeto [index] ==letra ) {//Busca la letra a codificar en el alfabeto directo ...
- tmp+=rotores[rotor][index];//Anade la letra codificada a tmp
- }
- //DECODE
- if ( !operacion && rotores[rotor][index] ==letra ) {//Busca la letra a codificar en el alfabeto directo ...
- tmp+=alfabeto [index];//Anade la letra decodificada a tmp
- }
- }
- }
- return tmp;
- }
- //***********************************************************************************************
- string enigma(vector<string> &rotores,string &alfabeto,string &mensaje,int shift ,string operacion){
- //Primera codificacion ENCODE o decodificacion codigo CESAR
- if (operacion=="ENCODE"){ cesar(mensaje,shift); }
- // Codificacion por ROTOR - N
- if (operacion=="ENCODE"){
- for (int rotor=0;rotor<3;rotor ++){//Recorre 3 rotores 0 1 2
- mensaje=rotorCode(rotores,rotor,alfabeto ,mensaje, ( operacion=="ENCODE"? true :false) );//Cambio de rotor
- }
- }else{
- for (int rotor=2;rotor>=0;--rotor ){//Recorre 3 rotores 2 1 0
- mensaje=rotorCode(rotores,rotor,alfabeto ,mensaje, ( operacion=="ENCODE"? true :false) );//Cambio de rotor
- }
- }
- //ultima decodificacion DECODE si es decode
- if (operacion!="ENCODE"){ cesar(mensaje,shift,false); } //DECODE
- return mensaje;
- }
- //***********************************************************************************************
- //***********************************************************************************************
- int main()
- {
- vector<string> rotores;
- string alfabeto("ABCDEFGHIJKLMNOPQRSTUVWXYZ");//Alfabeto de base a combinar con ROTORES
- string Operation;
- getline(cin, Operation);//Encode or Decode
- int pseudoRandomNumber;//Starting shift
- cin >> pseudoRandomNumber; cin.ignore();
- for (int i = 0; i < 3; i++) {//ROTORs 0 1 2
- string rotor;
- getline(cin, rotor);
- rotores.push_back(rotor);
- }
- string message;//Mensaje to Encode or Decode
- getline(cin, message);
- cout <<enigma(rotores,alfabeto,message,pseudoRandomNumber ,Operation)<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement