2014-04-06 46 views
-4

TE IT的Saurabh Bothra想与他的一个后辈进行一次秘密的私人对话。但他只能通过他的同班同学马纳夫沙赫与她交谈,他不相信他!密码文本程序:编码竞争

为了维护他的隐私,Saurabh寻求Hacking Guru Hardik Anvekar的帮助。哈迪克向他介绍了ROT13--一种在UNIX系统中用于加密的方法。 Saurabh使用了这个想法,并提出了他自己的方法。 Saurabh向他的小辈传授了这种方法,当他在校园内靠近湖边遇到她时,他可以在没有Manav的帮助下与她交谈。

在Saurabh的加密技术中,Saurabh会根据字母序列中的第一个字符的位置用另一个字母替换纯文本的每个字母。假设第一个字符是G(字母表中的第7个字母),那么Saurabh会用明文的第一个字符替换6个字符。Saurabh会对前7个字符进行替换,然后他将使用该键的第二个字符并用这种方式替代进一步的人物。一旦密钥的所有字符都用完了 - Saurabh将再次开始使用第一个字符并加密整个明文。

但不幸的是,Saurabh只能设备的方法,但他不能编码。他相信你写一个代码来打印密文,而不是向任何人透露他的秘密方法。

输入格式

测试用例T(< = 100) 纯文本和密钥由@字符分隔的数量。

输出格式

密文只能

采样输入

1我们最大的弱点就在于放弃。最保险的方法成功总是尝试只是一个更多的时间。@拉夫

样本输出

Uax mxkanymn qyuehymm fcym ch xzmzex lg. Kyv dfso xzmovdi rvt oj npxxzkj oy glqusm ni nls domn ihy dfiv kzdv. 
+0

好的,你的问题是什么? –

+0

请提供相同的代码 – user3503041

+0

请阅读此:http://stackoverflow.com/help/how-to-ask –

回答

0

首先,你已经拥有一个可怕的规范。它包含了一些神奇的数字,而没有解释它们来自哪里。无论如何,为了好玩,我实现了它,并得到了一个工作程序,这就是我想到的。

考虑的关键 '拉夫':

  • 取第一个字母 'G'。其“抵消”比“a”大6。那就是,ord('g') - ord('a') == 6
  • 对于连续7(6 + 1)个字母,使用6的偏移值。也就是说,对于明文中的每个字符,如果它是一个字母,就给它加6(如果结果超过'z',则减去26)。
  • 即使未使用明文中的每个字符,也会消耗这6次偏移中的7次偏移之一!如果角色是标点符号的空间,请不要将6添加到它,但仍然将其视为7次使用中的一个!
  • 键中的下一个字母是'a'。这给了0的偏移量。使用它1(0 + 1)时间。
  • 下一个字母是'u',偏移量为20.使用它21次。
  • 依此类推。

所以你的算法是这样的:

O + 6 => U : #1 of 7 6s 
u + 6 => a : #2 of 7 6s 
r + 6 => x : #3 of 7 6s 
" "  : #4 of 7 6s 
g + 6 => m : #5 of 7 6s 
r + 6 => x : #6 of 7 6s 
e + 6 => k : #7 of 7 6s 
a + 0 => a : #1 of 1 0s 
t +20 => n : #1 of 21 20s 
e +20 => y : #2 of 21 20s 
... 
and so on 

什么我不告诉你怎么做(这是你的比赛:-)):

  • 保留情况。例如,chr(ord('U') + 20) == 'i',但您不想将大写'U'翻译为小写'i'。
  • 创建这些偏移量的流,并为输入流中的每个字符使用一个。

提示:

  • 你想产生偏移而不是一次创建它们所有的列表的迭代器。