PI窗口加密


13

这是一种简单的加密方法,使用PI数字对消息进行编码,该方法很简单:

键只是一个正整数,它指示窗口从何处开始:

给定一个要加密的字符串,该字符串仅包含小写字母,没有空格,请计算其长度,然后找到PI的第N个数字,然后继续将每个字母向右移动该数字指示的数量。

例如,如果键是,2并且我想编码house,我从第二个开始选择5位数的窗口:14159然后它变成:

h -> i
o -> s
u -> v
s -> x
e -> n

a。-您的程序/函数/算法将接收两个参数,一个仅由无空格的小写字母组成的字符串,以及一个键,它只是1(1表示3)和1000之间的正整数,可能更多或更少,因为我不太确定以上述精度计算PI需要多长时间,因为:

b.-您必须自己在代码中计算PI,这是一个与之比较的简洁网页:Pi Day。输入中绝不能让您计算超过1000位的PI,这意味着length(message)+ key <= 1000。

通过计算Pi,我的意思是不要在您的代码中对其进行编码(对于代码高尔夫而言是愚蠢的),也不要在您的代码中使用任何嵌入的常数,任何三角标识(2 * acos(0))或任何Web参考。

c.-输出将只是加密的字符串。

这是一个代码高尔夫球问题,较短的代码胜出!

我将在2014年7月14日接受获奖答案。


1
当字母移到字母末尾会怎样?是否会回绕到字母的开头或其他内容?
Digital Trauma 2014年

1
是的,您只是从头开始。
BrunoJ 2014年

6
什么算作“自我计算”?ArcCos(-1)
Martin Ender 2014年

1
通过自己计算,我更好地解释了我想说的内容,并指出3是第一位数字。
BrunoJ 2014年

1
这实际上似乎是一种非常智能的加密算法,为什么没有广泛使用它(除非使用更复杂的常量(例如e ^ pi或难以识别的东西)?
ASKASK 2014年

Answers:


3

果酱-51

l_,li(2e4,-2%{2+_2/@*\/2e2000+}*Ab><]z{~+_'z>26*-}%

输入示例:

zebra
20

输出:

dkdxe

这适用于(字符串长度)+键<= 2000,但是对于在线解释器来说相当慢(对于Java解释器来说仍然很快)。

这是一个可运行200个版本的版本,您可以在http://cjam.aditsu.net/上尝试,而无需等待太长时间:

l_,li(2e3,-2%{2+_2/@*\/2e200+}*Ab><]z{~+_'z>26*-}%

5

Python-370

好的,很好,由于link1link2,终于有了pi的工作对象。

from decimal import *
def f(s,n): 
 j=len(s)
 getcontext().prec=j+n+5
 d=Decimal
 e=d(0)
 for k in range(0,j+n+5): 
  e+=(d(16)**(-k)*(d(4)/(8*k+1)-d(2)/(8*k+4)-d(1)/(8*k+5)-d(1)/(8*k+6)))
 c=`e`.split("'")[1].replace('.','')
 t=''
 for i,l in enumerate(s):
  o=ord(l)
  for v in[0,32]:
   if 64+v<o<91+v:
    l=chr(((o-65-v)+int(c[i+n-1]))%26+65+v)
  t+=l   
 print t

输出示例:

>>> f('house',2)
isvxn

另一个:

Wimt fcy d dnyh uhkvkv qhvadil   

>>> f('这是一个非常秘密的信息',1)


1

JavaScript的-167 173 176

感谢Michael巧妙地表达了16的幂。

最多可以计算出第16位的PI。

function e(s,o){for(p=i=n=r='',m=1;s[+i];m<<=4,n>o?r+=String.fromCharCode(s.charCodeAt(i)-+-(1e15*p+'')[o+i++]):0)p-=(4/((d=8*n++)+1)-2/(d+=4)-1/++d-1/++d)/m;return r}

测试用例:

> e("house",2)
"isvxn"

那么m=1m<<=4而不是m='0x1'm+=0呢?节省3个字节。
Michael M.

1

蟒- 321 304 288 285

from decimal import*
d=Decimal
s,n=raw_input(),input()
l=len(s)
getcontext().prec=n+l
print''.join([chr((v-97)%26+97)for v in map(sum,zip(map(ord,s),map(int,str(sum([(d(4)/(8*k+1)-d(2)/(8*k+4)-d(1)/(8*k+5)-d(1)/(8*k+6))/16**k for k in range(0,l+n)])).replace('.','')[n-1:n+l])))])

大多数高尔夫版本都易于阅读和理解。最后一行不在下面:

# Calculate PI using the BBP formula.
pi = 0
for k in range(0,l+n):
    pi += (d(1)/(16**k))*((d(4)/(8*k+1))-(d(2)/(8*k+4))-(d(1)/(8*k+5))-(d(1)/(8*k+6)))

# Remove the decimal point in PI.
pi = str(pi).replace('.','')

result = []
# For the ASCII sum of each pair of letters in `s` and its digit in PI 
for v in sum(zip(map(ord, s), map(int, pi))):
    result.append((v-97)%26+97)

# Convert all the ordinal values to characters
print ''.join(map(chr, result))

编辑1:简化了我的模块算法。

编辑#2:重构BBP公式。


0

哈斯克尔-265 267 字节(无IO)

p=g(1,0,1,1,3,3)where g(q,r,t,k,n,l)=if 4*q+r-t<n*t then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l) else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
e i s=zipWith(\k c->toEnum$fromIntegral k+fromEnum c::Char)(take(length s)$drop(fromIntegral$i-1)p)s

p是该算法的高尔夫版本,可以在http://rosettacode.org/wiki/Pi#Haskell中找到

e 是编码功能:

λ> e 2 "house"
"isvxn"

如果索引在小写字母之外,则不会循环。这意味着其他一些字符可以插入编码后的字符串中:

"Sfufv#Kork(mq}nns j{i&sv&xitmujtu&vey|h{xljej|35.)(\"%(\"\"&\" %\"\"$()$ ''\"&'!)$'(\"&($(\"& !$'&)]hrs\"ow olih7$Tdkhnsj ns&qpdlw}oplwmxbipn#o{ur!vhbp\"mitj/"

不幸的是,它需要花费几秒钟的时间,其偏移量要大于10 000计算输出的时间。幸运的是,当多次使用相同的偏移量时,只需要第一次计算数字即可。

奖金-解码

d i s=zipWith(\k c->toEnum$fromEnum c-fromIntegral k::Char)(take(length s)$drop(i-1)p)s

再一次,如果我们用isvxn

λ> d 2 "isvxn"
"house"

在您的奖金部分打了错字。d 2 "isvsn"应该是d 2 "isvxn"
Spedwards

固定。感谢您的关注。
gxtaillon 2014年

0

CoffeeScript-148个字符/字节

我第一次参加Code Golf

不幸的是,它不支持换行(因此az最终会变成标点符号)

e =(m,k)->(m.split('')。map(v,i)-> String.fromCharCode v.charCodeAt()+ parseInt Math.PI.toString()。replace('。', '').slice(k-1,m.length + k-1)[i])。join('')

CSSDeck上演示

致电:

提醒“房屋”,2

isvxn


您是否读完了整个问题,因为它清楚地表明不允许您“在代码中使用任何嵌入式常量”?
core1024
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.