2012-07-25 2 views
2

임 STL 알고리즘에 대한 CS106L의 연습을하고 있는데, random_shuffle을 사용하여 대체 암호화에 대해 질문합니다.Mono-alphabetic Subsitution STL을 사용하여 암호화, cs106l

질문은 입니다. random_shuffle을 사용하면 원본 문자열을 허용하고 임의의 Monoalphabetic Substitution Cipher로 암호화하는 MonoalphabeticSubstitutionEncrypt 함수를 구현하십시오. 처음에 의미

나는 A-Z 에 "AB..XYZ"그냥이라고 random_shuffle과이 있고 "KVDQ ... MSB" 같은 것을 생성하고 원래 문자열을 암호화 매핑을한다.

매핑을 사용하여 수행 할 수 있지만 해당 STL 알고리즘 만 사용해야합니다.

누구든지 아이디어가 있습니까? 고맙습니다!

나는이 방법으로 그것을하지만 STL 알고리즘의 힘을 사용하지 않는 메신저처럼 보인다

string MonoSubsitutionEncrypt(string line){ 
    string original = "abcdefghijklmnopqrstuvwxyz"; 
    string excrypt = original; 
    random_shuffle(encrypt.begin(), encrypt.end()); 
    map<char, char> m; 
    for (int i = 0;i < original.length(); i++) 
     m.insert(make_pair(original[i],encrypt[i])); 
    string result; 
    for (int i = 0; i < line.length(); i++) 
     result += m[line[i]]; 
    return result; 
} 
+0

+1 나는 당신에게 과제를 준 교수가 마음에 듭니다. 그 교수가 STL 알고리즘을 홍보하고 있다는 것을 듣기 좋습니다 :) – Mahesh

+0

보통 사람들은 숙제 태그를 "잊어 버렸습니다". :) – Wug

답변

0

내가 생성하고, 생성시에 배열/벡터를 섞고, 그리고 operator()를 오버로드 매핑 클래스를 사용하십시오 입력의 암호화 된 버전을 반환합니다. 다용도로 사용하려면 해독을위한 키로 사용할 스크램블 된 알파벳을 검색하는 멤버 함수 (또는 연산자)가 필요합니다.

그렇다면 std::transform으로 암호화 자체를 수행하는 것이 매우 간단합니다.

+0

yaaa .. 내가 생각하는 것 역시 맵핑을 사용하지 않고 STL을 사용하는 것이 가능한가? 더 잘할 수 있을까요? –

+1

@TimothyLeung : 단일 문자 대체 *가 매핑이라는 점을 감안할 때 매핑이 분명히이를 수행하는 확실한 방법입니다. 나는 다른 일을 할 수 있다고 생각하지만, "더 나은"자격을 얻으려면 꽤 인상적이어야합니다. –

1

방금 ​​바이트를 다른 바이트로 무작위로 섞은 버전을 작성했습니다. 아스키 문자 만 받아들이고 출력하도록하려면 여러 번 처리해야합니다. 문자열의 끝을 나타 내기 위해 보존해야하기 때문에 특별히 null 문자를 처리했습니다. STL 클래스

#include <algorithm> 
#include <iostream> 
#include <vector> 
#include <string> 

template class Filler (T) 
    constructor Filler(T item) 
     initial = item 

    T operator()() 
     return initial++ 

    private T initial 

template class Encryptor (T1, T2) 
    constructor Encryptor(T1 mapping) 
     cipher = mapping 

    T2 operator() (T2 value) 
     return cipher[value] 

    private T1 cipher 

int main (int c, char * v[]) 
    // stl class, big enough to hold each char 
    vector<unsigned char> alphabet(256)  

    // creates a filler object described above 
    Filler<unsigned char> filler(0)   

    // stl function, fills alphabet with one of each char 
    generate_n(alphabet.begin(), 256, filler) 

    // stl function, shuffles alphabet (start at 1, leave NULL character at beginning) 
    random_shuffle(alphabet.begin() + 1, alphabet.end()) 

    // creates a generator to be passed to transform 
    Encryptor<vector<unsigned char>, unsigned char> e(alphabet) 

    // get input value: either first parameter, or nothing if no parameters 
    string input = c > 1 ? v[1] : "" 

    // stl function, uses encryptor containing alphabet mapping to obfuscate input 
    transform(input.begin(), input.end(), input.begin(), e) 

    // printing the string yields garbled crap 
    cout << input << endl; 

문서 사용 : STL과 방법에 대한 string vector ostream

문서 사용 : generate_nrandom_shuffletransform

이 경우 다음과 같이 내 알고리즘

의사 코드이다 게시물을 너무 많이주고, som 그것을 편집하십시오.

관련 문제