PIウィンドウ暗号化


13

これは、PI数字を使用してメッセージをエンコードする単純な暗号化方法です。この方法は単純です。

キーは、ウィンドウの開始位置を示す正の整数です。

スペースを含まない小文字のみを含む暗号化する文字列を指定すると、その長さを取得し、PIのN番目の数字を見つけて、数字で示された量だけすべての文字を右にシフトします。

たとえば、キーがで2、エンコードするhouse場合、2番目のキーから5桁のウィンドウを取得します。14159その後、次のようになります。

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

a。-プログラム/関数/アルゴリズムは2つのパラメーターを受け取ります。1つはスペースを含まない小文字とキーのみで構成される文字列で、1(1は3を参照)と1000の間の正の整数になります。以下の理由で、上記の精度でPIを計算するのにどれくらいの時間がかかるかよくわかりません。

b.-コード内でPIを自分で計算する必要があります。これは、Pi Dayと比較するためのきちんとしたWebページです。入力では、1000桁を超えるPIを計算することはありません。つまり、length(message)+ key <= 1000です。

Piを計算することにより、コード内でそれをハーコードしたり(コードゴルフのような)、コードに埋め込まれた定数を使用したり、三角関数のID(2 * acos(0))やWeb参照を使用したりしません。

c.-出力は暗号化された文字列になります。

これはコードゴルフの質問です。短いコードが勝ちます!

2014年7月14日に受賞の回答を受け入れます。


1
文字がアルファベットの末尾を超えてシフトするとどうなりますか?アルファベットの先頭への回り込みが発生しますか?
デジタル外傷14年

1
はい、最初からやり直します。
BrunoJ

6
「自分を計算する」とは何ですか?ArcCos(-1)
マーティンエンダー14年

1
自分が言いたいことを自分で計算して説明し、3が最初の数字であると指摘しました。
BrunoJ

1
これは実際には本当にスマートな暗号化アルゴリズムのように見えますが、なぜこれが広く使用されないのですか(e ^ piなどのより複雑な定数を除き)。
ASKASK 14年

回答:


3

CJam-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

パイソン-370

[OK]を、素敵な1、ついにおかげで作業パイの事だリンク1リンク2を

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

16のべき乗を巧みに表現してくれたMichaelに感謝します。

これにより、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バイト節約します。
マイケルM. 14年

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

phttp://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 14年

0

CoffeeScript-148文字/バイト

初めてのコードゴルフ

残念ながら、ラッピングはサポートされていません(したがって、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のデモ

と呼ばれる:

アラートe「ハウス」、2

isvxn


「コードに埋め込まれた定数を使用すること」が許可されていないことを明確に示しているため、質問全体を読みましたか?
core1024
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.