PI 창 암호화


13

이것은 PI 숫자를 사용하여 메시지를 인코딩하는 간단한 암호화 방법입니다. 방법은 간단합니다.

키는 윈도우가 시작되는 위치를 나타내는 양의 정수입니다.

공백이없는 소문자 만 포함하고 암호화 할 문자열이 주어지면 길이를 가져 와서 PI의 N 번째 숫자를 찾은 다음 숫자로 표시된 양만큼 모든 문자를 오른쪽으로 이동합니다.

예를 들어 키가 2있고 인코딩하고 싶다면 house두 번째 숫자에서 5 자리의 창을 가져 와서 14159다음과 같이합니다.

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

프로그램 / 함수 / 알고리즘은 공백이없는 소문자로만 구성된 문자열과 키 (1 (1은 3을 나타냄)와 1000 사이의 양의 정수) 인 두 개의 매개 변수를 수신합니다. 또는 다음과 같은 이유로 정확한 정확도로 PI를 계산하는 데 시간이 얼마나 걸리는지 잘 모르겠습니다.

b.- 코드에서 직접 PI를 계산해야합니다. 다음은 깔끔한 웹 페이지입니다. Pi Day . 입력에서 1000 자리를 초과하여 PI를 계산해서는 안됩니다. 즉 length (message) + key <= 1000을 의미합니다.

Pi를 계산한다는 것은 코드에서 코드를 코드화하거나 (코드 골프에 적합하지 않음) 코드에 포함 된 상수 나 삼각 식별자 (2 * acos (0)) 또는 웹 참조를 사용하지 않는다는 의미입니다.

c.- 출력은 암호화 된 문자열입니다.

이것은 코드 골프 질문이며 짧은 코드가 승리합니다!

2014 년 7 월 14 일에 당첨 답변을 수락합니다.


1
알파벳 끝을지나 글자가 이동하면 어떻게됩니까? 알파벳의 시작 부분에 랩 어라운드가 발생합니까?
디지털 외상

1
예, 당신은 처음부터 다시 시작합니다.
BrunoJ

6
"자신을 계산하십시오"는 무엇입니까? ArcCos(-1)?
Martin Ender 2016 년

1
나는 스스로 계산하여 말하고 싶은 것을 더 잘 설명했고 3이 첫 번째 숫자라고 지적했다.
BrunoJ

1
이것은 실제로 정말 똑똑한 암호화 알고리즘처럼 보이지만 왜 널리 사용되지 않습니까?
ASKASK

답변:


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

좋아, 좋은 점은 마침내 link1link2 덕분에 파이 작업을 수행했습니다 .

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

자바 스크립트-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 바이트를 저장합니다.
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

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 2018 년

0

CoffeeScript-148 문자 / 바이트

내 최초의 코드 골프

불행히도 그것은 줄 바꿈을 지원하지 않습니다 (따라서 az는 문장 부호가됩니다)

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

CSSDeck 데모

로 전화 :

경보 전자 '집', 2

ISVXN


"코드에 포함 된 상수를 사용할 수 없다"고 명시되어 있으므로 전체 질문을 읽었습니까?
core1024
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.