Skip to content

Instantly share code, notes, and snippets.

@senapk
Created March 30, 2017 00:39
Show Gist options
  • Save senapk/904983585635e9cd0c43b30bd9fb1b9a to your computer and use it in GitHub Desktop.
Save senapk/904983585635e9cd0c43b30bd9fb1b9a to your computer and use it in GitHub Desktop.
#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