Created
March 30, 2017 00:39
-
-
Save senapk/904983585635e9cd0c43b30bd9fb1b9a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
using namespace std; | |
string completar(string letra){ | |
return letra + ((letra == "x") ? "z" : "x"); | |
} | |
vector<string> preparar_texto(string texto){ | |
vector<string> cifrado; | |
int i = 0; | |
while((i + 1) < (int)texto.size()){//enquanto houver par | |
string um(1, texto[i]);//convertendo pra string | |
string dois(1, texto[i + 1]); | |
if(um == dois){ | |
cifrado.push_back(completar(um));//completo com x ou z | |
i += 1; | |
}else{ | |
cifrado.push_back(um + dois); | |
i += 2; | |
} | |
} | |
if((i + 1) == (int) texto.size())//sobrou um | |
cifrado.push_back(completar(string(1, texto[1]))); | |
return cifrado; | |
} | |
//adiciona os caracteres de palavra na string sem_repeticao evitando repeticoes | |
string remover_repetidos(string sem_repeticao, string palavra){ | |
for(auto c : palavra) | |
if(sem_repeticao.find(c) == string::npos)//nao encontrou | |
sem_repeticao += c; | |
return sem_repeticao; | |
} | |
//monta a matriz em um vetor de 25 | |
string montar_matriz(string chave){ | |
string sem_repeticao = remover_repetidos("", chave); | |
return remover_repetidos(sem_repeticao, "abcdefghijklmnopqrstuvxyz"); | |
} | |
struct Par{ | |
int l, c; | |
}; | |
Par mat_find(string matriz, char elem){ | |
int pos = matriz.find(elem); | |
return Par{pos / 5, pos % 5}; | |
} | |
//cifra desl = 1, decifrar desl = -1 | |
void codificar(Par &a, Par &b, int desl){ | |
if(a.l == b.l){ | |
a.l = (a.l + desl) % 5; | |
b.l = (b.l + desl) % 5; | |
} | |
else if(a.c == b.c){ | |
a.c = (a.c + desl) % 5; | |
b.c = (b.c + desl) % 5; | |
} | |
else | |
std::swap(a.c, b.c); | |
} | |
string pegar_letra(string chave, Par pos){ | |
return string(1, chave[pos.l * 5 + pos.c]); | |
} | |
vector<string> cifrar(vector<string> tclaro, string chave){ | |
vector<string> tcifrado; | |
for(auto dupla : tclaro){ | |
Par p1 = mat_find(chave, dupla[0]); | |
Par p2 = mat_find(chave, dupla[1]); | |
codificar(p1, p2, 1); | |
tcifrado.push_back("" + pegar_letra(chave, p1) + pegar_letra(chave, p2)); | |
} | |
return tcifrado; | |
} | |
int main(){ | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment