- ์ด ์ฝ๋๋ ๋จ์ํ ์๊ณ ๋ฆฌ์ฆ์ ํ์ด๋ด๋์ง ๊ฒ์ฌํ๊ธฐ ์ํ ์ฝ๋ ์
๋๋ค. ์ถ๊ฐ๋ก ์์ ํ ์์ ์
๋๋ค.
- ํ์ด์ฌ 2.7 ๊ธฐ์ค์ผ๋ก ์์ฑํ์์ผ๋ฉฐ ํ์ดํ ๋์ ๊ฑธ๋ง์ง ์๋ ์ฝ๋ ์
๋๋ค. C++์ฒ๋ผ ์ง๋จ์ต๋๋ค. ๊ทธ๊ฒ๋ ์๋์ง..
- ์ํด๋ถํ๋๋ฆฝ๋๋ค.
#-*-coding:utf-8 -*-
mapping = dict()
""" rd ๋ ๋ ํผ๋ฐ์ค ์ฌ์ ์ด๋ค. ํ๋ฌธ ๋จ์ด๋ค์ ๊ฐ์ง๊ณ ์์ """
rd = [ 'dick', 'jane', 'spot', 'puff', 'and', 'yertle']
""" ed๋ ์ํธ ์ฌ์ ์ด๋ค. ์ํธํ๋ ๋จ์ด๋ค์ ๊ฐ์ง๊ณ ์๋ค """
ed = ['bjvg', 'hxsn', 'qymm', 'rqat', 'xsb', 'pnetfn']
ed_ = ['bjvg', 'xsb', 'hxsn', 'xsb', 'qymm', 'xsb', 'rqat', 'xsb', 'pnetfn']
def decodewords(mappingdict, word):
tempstr = ""
for char in word:
tempstr = tempstr + mappingdict[char]
return tempstr
def copydictionary(tempdict, mappingdict):
""" ๋ ๊ฐ์ ์ฌ์ ์ ํฉ์นจ """
for key in tempdict.keys():
mappingdict[key] = tempdict[key]
return mappingdict
def wordmapping(mappingdict, plaintext, cryptogram):
""" ๋ ๊ฐ์ ๋จ์ด๋ฅผ ๋ฐ์์ ๋งคํ ํ
์ด๋ธ์ ์ ์ฉ ํ๋ค.
1) ๋จ์ด๋ผ๋ฆฌ ๋งคํ ํ
์ด๋ธ์ ์ถฉ๋ ์์ด ์ ์ฉ ๊ฐ๋ฅํจ
๋งคํํ
์ด๋ธ์ ์์ํ
์ด๋ธ์ ๋ฎ์ด์
True๋ฐํ
2) ๋จ์ด๋ผ๋ฆฌ ๋งคํ ํ
์ด๋ธ์ ์ถฉ๋ ์์ด์ ์ ์ฉ ๋ถ๊ฐ๋ฅํจ
๊ธฐ์กด ๋งคํํ
์ด๋ธ์ ๊ทธ๋๋ก.
False๋ฐํ
3) ๋ ๋ฌธ์์ ๊ธธ์ด๊ฐ ๋ค๋ฅด๋ฉด ๋ฌด์กฐ๊ฑด False๋ฐ
"""
if len(plaintext) != len(cryptogram):
return False
tempmappingdict = mappingdict.copy()
for i in range(len(cryptogram)):
char = cryptogram[i]
chkresult = checkintegrity(tempmappingdict, char, plaintext[i])
if chkresult == False:
return False
else:
tempmappingdict[char] = plaintext[cryptogram.index(char)]
mappingdict = copydictionary(tempmappingdict, mappingdict)
return True
def checkintegrity(mappingdict, indexchar, mappingchar):
"""
indexchar => ์ํธํ๋๊ธ์
mappingchar => ํ๋ฌธ
1) ๋งคํ ํ
์ด๋ธ์ ์ด๋ฏธ ํด๋น ํค ๊ฐ์ ๋ํ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ
1-1) ์ด๋ฏธ ์๋ ํค ๊ฐ๊ณผ ์๋ก ๋ค์ด์จ ํค ๊ฐ์ด ์ผ์นํ๋์ง ๊ฒ์ฌ
1-1-1) ์ด๋ฏธ ์๋ ํค์ ์๋ก ๋ค์ด์จ ํค ๊ฐ์ด ์ผ์น ํ๋ ๊ฒฝ์ฐ true๋ฐํ
1-1-2) ์ด๋ฏธ ์๋ ํค์ ์๋ก ๋ค์ด์จ ํค ๊ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ false๋ฐํ
2) ๋งคํ ํ
์ด๋ธ์ ํด๋น ํค ๊ฐ์ ๋ํ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ
2-1) ๊ทธ๋๋ก ๋งคํ ํ
์ด๋ธ์ ์
๋ ฅํ๊ณ true ๋ฐํ
์) indexchar = qymm
mappingchar = dick
mappingdict = {}
"""
tempkeys = mappingdict.keys()
if indexchar in tempkeys:
if mappingdict[indexchar] == mappingchar:
return True
else:
return False
else:
mappingdict[indexchar] = mappingchar
return True
def decode(edword):
if len(ed) == 0:
wordmapping(mapping, rd[0], edword)
print 'touch end -- ed is empty'
print mapping
return True
for rdword in rd:
print '--On Test %s, %s' % (edword, rdword)
if wordmapping(mapping, rdword, edword) == True:
rd.remove(rdword)
newedword = ed.pop()
result = decode(newedword)
if result == False:
ed.append(newedword)
rd.append(rdword)
else:
return True
return False
def main():
""" ๊ฐ๊ฐ์ 4๊ฐ์ ๊ธ์๋ฅผ ๊ฐ์ง dictionary๋ฅผ ๊ฐ์ง.
๋ชจ๋ ์ํธํ ๋ฌธ์ฅ์ ํ๋์ฉ ๋นผ์ ํด๋
ํจ
ํ๋ฌธ์ฌ์ = [ 'dick', 'jane', 'spot'] ์ํธ์ฌ์ = [ 'bjvg', 'rqat', 'hxsn']
์์ ๊ฐ์ด ๊ฐ์ ํ๋ฉด, 'bjvg'๋ 'dick','jane', 'spot' ์ธ ๊ฐ์ค์ ํ๋์.
1) 'bjvg'๋ฅผ 'dick'์ ๋งค์นญ ์ํด
1-1) 'bjvg'๋ฅผ 'dick'์ ๋งค์นญ ์ํค๋๋ฐ ๋ฌธ์ ๊ฐ ์์.
1-1-1) 'rqat'๋ฅผ 'jane'์ ๋งค์นญ ์์ผ๋ด
...
1-2) 'bjvg'๋ฅผ 'dick'์ ๋งค์นญ ์์ผฐ๋๋ฐ ๋ฌธ์ ๊ฐ ์์.
1-2-1) 'bjvg'๋ฅผ 'jane'์ ๋งค์นญ ์์ผ๋ด
...
๊ณ์ ์ํธ์ฌ์ ์ ๋จ์ด๋ฅผ ๋ฒ์ญ ์ํค๋๋ฐ ๋ ์ด์ ํด๋
ํ ๋จ์ด๊ฐ ์์ผ๋ฉด ๋.
decode ํจ์๋ ์๊ธฐ๊ฐ ํด๋
ํ ๋จ์ด๋ฅผ ์ถ๋ ฅํ๋ฏ๋ก ๊ฒฐ๊ตญ retval์ ํด๋
ํ ์ ์ฒด ๋ฌธ์์ด์ ๋ฐ
"""
strresult = "*"
retval = None
print '-------------------------'
print ed
print rd
print '-------------------------'
edword = ed.pop()
retval = decode(edword)
if retval == False:
print strresult
else:
for edword in ed_:
print decodewords(mapping,edword)
main()
#-*-coding:utf-8 -*-
import no12CryptKicker as cryptkicker
import unittest
class testUnit (unittest.TestCase):
def setup_testdict1(self):
self.testdict1 = {'b': 'd', 'v': 'c', 'g': 'k', 'j': 'i'}
pass
def setup_testdict2(self):
self.testdict2 = {'h': 'j', 'x': 'a', 's': 'n', 'n': 'e'}
pass
def teardown_testdict1(self):
self.testdict1 = dict()
pass
def teardown_testdict2(self):
self.testdict2 = dict()
pass
def test_func_wordmapping(self):
testemptydict = dict()
self.assertTrue(cryptkicker.wordmapping(testemptydict, 'dick', 'bjvg'))
self.assertDictEqual(testemptydict, {'b':'d', 'j':'i', 'v':'c', 'g':'k'})
def test_func_wordmapping2(self):
"""qymm์ dick๋ฅผ ๋ฃ์ผ๋ฉด ์ ์์ ์ผ๋ก false๊ฐ ๋ฐํ๋๋์ง ๊ฒ์ฌ """
testemptydict = dict()
self.assertFalse(cryptkicker.wordmapping(testemptydict, 'dick', 'qymm'))
def test_func_wordmapping3(self):
"""๊ธธ์ด๊ฐ ๋ค๋ฅธ ๋ฌธ์์ด์๋ฃ์ด์ ์ ๋๋ก ํ๋ณ ํ๋์ง ํ์ธ"""
testemptydict = dict()
self.assertFalse(cryptkicker.wordmapping(testemptydict, 'dick', 'xsb'))
def test_func_wordmappingWithCopy(self):
self.setup_testdict2()
self.assertTrue(cryptkicker.wordmapping(self.testdict2, 'dick', 'bjvg'))
self.assertDictEqual(self.testdict2, {'b': 'd', 'v': 'c', 'g': 'k', 'j': 'i','h': 'j', 'x': 'a', 's': 'n', 'n': 'e'})
testemptydict = dict()
self.assertTrue(cryptkicker.wordmapping(testemptydict, 'puff', 'qymm'))
self.assertDictEqual(testemptydict, {'q':'p', 'y':'u', 'm':'f'})
def test_func_checkintegrity(self):
testemptydict = dict()
self.assertTrue(cryptkicker.checkintegrity(testemptydict, 'b', 'd'))
self.assertTrue(cryptkicker.checkintegrity(testemptydict, 'j', 'i'))
self.assertTrue(cryptkicker.checkintegrity(testemptydict, 'v', 'c'))
self.assertTrue(cryptkicker.checkintegrity(testemptydict, 'g', 'k'))
testemptydict = dict()
self.assertTrue(cryptkicker.checkintegrity(testemptydict, 'm', 'c'))
self.assertFalse(cryptkicker.checkintegrity(testemptydict, 'm', 'k'))
def test_func_copydictionary(self):
self.setup_testdict1()
self.setup_testdict2()
self.assertDictEqual(cryptkicker.copydictionary(self.testdict1, self.testdict2), \
{'b': 'd', 'v': 'c', 'g': 'k', 'j': 'i','h': 'j', 'x': 'a', 's': 'n', 'n': 'e'})
if __name__ == "__main__":
suite = unittest.TestLoader().loadTestsFromTestCase(testUnit)
unittest.TextTestRunner(verbosity=2).run(suite)
#include <stdio.h>
#include <stdlib.h>
#include <map>
#include <list>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#ifndef NULL
#define NULL '\0'
#endif
typedef struct _sRsvWord
{
bool reserve;
string str;
_sRsvWord() {}
_sRsvWord(const string st) : str(st), reserve(false)
{
}
bool operator==(const _sRsvWord &rhs)
{ return str == rhs.str; }
} sRsvWord;
typedef map<int, list<sRsvWord> > Dict; //string length, string list
typedef Dict::iterator DictItor;
Dict g_Dictionary;
typedef list< list<string> > CryptList;
typedef CryptList::iterator CryptItor;
CryptList g_CryptStrings;
// ์ฌ์ ๋ก๋ฉ
bool Input(char *fileName)
{
FILE *fp = fopen(fileName, "r");
if (!fp) return false;
char line[ 256];
char *next = fgets(line, sizeof(line), fp);
if (!next)
{
fclose(fp);
return false;
}
const int size = atoi(next);
int cnt = 0;
while (next && size > cnt++)
{
next = fgets(line, sizeof(line), fp);
const int len = strlen(line)-1;
line[ len] = NULL; // ๊ฐํ๋ฌธ์ ์ ๊ฑฐ
DictItor it = g_Dictionary.find(len);
if (g_Dictionary.end() == it)
g_Dictionary.insert( Dict::value_type(len, list<sRsvWord>()) );
g_Dictionary[ len].push_back( sRsvWord(line) );
}
// ์ํธํ๋ ์คํธ๋ง ๋ก๋ฉ
while (next)
{
next = fgets(line, sizeof(line), fp);
const int len = strlen(line)-1;
line[ len] = NULL; // ๊ฐํ๋ฌธ์ ์ ๊ฑฐ
list<string> cryptStrings;
char *p = strtok(line, " ");
while (p)
{
cryptStrings.push_back(p);
p = strtok(NULL, " ");
}
g_CryptStrings.push_back( cryptStrings );
}
fclose(fp);
return true;
}
char g_MatchTable[ 26];
string GetMatchString(string &cryptString)
{
string str = cryptString;
const int len = cryptString.length();
for (int i=0; i < len; ++i)
str[ i] = g_MatchTable[ 'z'-cryptString[ i]];
return str;
}
void SetMatchString(string &cryptString, string &matchString)
{
const int len = cryptString.length();
for (int i=0; i < len; ++i)
{
g_MatchTable[ 'z'-cryptString[ i]] = matchString[ i];
}
}
string GetDictionaryString( string &findString )
{
const int len = findString.length();
DictItor it = g_Dictionary.find(len);
if (g_Dictionary.end() == it)
return "";
list<sRsvWord>::iterator i = find(it->second.begin(), it->second.end(), findString);
if (it->second.end() == i)
return "";
return i->str;
}
// '*' ํ์๋ฅผ ์ ์ธํ ์คํธ๋ง์ ๋น๊ตํด์ ๋ฆฌํดํ๋ค.
list<sRsvWord>::iterator GetNextDictionaryString( list<sRsvWord>::iterator beginItor,
const list<sRsvWord>::iterator endItor, string &findString )
{
list<sRsvWord>::iterator it = beginItor;
while (endItor != it)
{
if (it->reserve)
{
++it;
continue;
}
const int len = it->str.length();
if (len != findString.length())
break;
int i=0;
for (i=0; i < len; ++i)
{
if (findString[ i] == '*')
continue;
if (it->str[ i] != findString[ i])
break;
}
if (i==len) // ์ผ์น
return it;
++it;
}
return endItor;
}
// cryptString์ ์ฌ์ ์์๋ ๋จ์ด๋ก ์์ฝ์ํจ๋ค.
string ReserveTable( string &reserveString, string &cryptString, string &matchString )
{
string str;
list<sRsvWord>::iterator ritor;
const int len = cryptString.length();
DictItor it = g_Dictionary.find(len);
if (g_Dictionary.end() == it)
return "";
if (reserveString.empty())
{
ritor = GetNextDictionaryString(it->second.begin(), it->second.end(), matchString);
}
else
{
list<sRsvWord>::iterator i = find(it->second.begin(), it->second.end(), reserveString);
if (it->second.end() != i)
i->reserve = false; // ์์ฝ๋ ๋จ์ด ๋ณต๊ตฌ
ritor = GetNextDictionaryString(++i, it->second.end(), matchString );
}
if (it->second.end() != ritor)
{
SetMatchString(cryptString, ritor->str);
ritor->reserve = true;
str = ritor->str;
}
return str;
}
// ํ
์ด๋ธ ์์ฑ
bool MakeTable(list<string>::iterator crypStringItor, list<string>::iterator cryptEndItor )
{
if (crypStringItor == cryptEndItor)
return true;
string cryptString = *crypStringItor;
string matchString = GetMatchString(cryptString);
string dictString = GetDictionaryString(matchString);
if (dictString.empty())
{
string reseveString;
while (1)
{
reseveString = ReserveTable( reseveString, cryptString, matchString );
if (reseveString.empty())
return false;
if (MakeTable(++crypStringItor, cryptEndItor))
return true;
}
}
else
{
return MakeTable(++crypStringItor, cryptEndItor);
}
return true;
}
// ์ํธ๋ฌธ์ผ๋ก ๋งค์นญํ
์ด๋ธ์ ์ด์ฉํด์ ๊ธ์๋ฅผ ์ถ๋ ฅํ๋ค.
void PrintCryptString(list<string>::iterator beginIt, list<string>::iterator endIt)
{
list<string>::iterator it = beginIt;
if (it == endIt)
return;
string matchString = GetMatchString(*beginIt);
printf( "%s ", matchString.c_str() );
PrintCryptString(++it, endIt);
}
void DecryptLine(list<string> &cryptStrings)
{
for (int i=0; i < sizeof(g_MatchTable); ++i)
g_MatchTable[ i] = '*';
list<string>::iterator it = cryptStrings.begin();
MakeTable(cryptStrings.begin(), cryptStrings.end() );
PrintCryptString(cryptStrings.begin(), cryptStrings.end());
printf( "\n" );
}
// ๋ณตํธํ
void Decrypt()
{
CryptItor it = g_CryptStrings.begin();
while (g_CryptStrings.end() != it)
DecryptLine(*it++);
}
int main(int argc, char* argv[])
{
if (argc < 2)
return 0;
Input(argv[1]);
Decrypt();
return 0;
}