Шифрування вікна PI


13

Це простий метод шифрування, який використовує PI-цифри для кодування повідомлення, метод простий:

Ключ - це лише додатне ціле число, яке вказує, звідки починається вікно:

Давши рядок для шифрування, що містить лише малі літери, без пробілів, ви берете його довжину, потім знаходите N-ту цифру PI і переходите до зміщення кожної літери праворуч на суму, вказану цифрою.

Наприклад, якщо ключ є 2і я хочу кодувати house, я беру вікно з 5 цифр з другого: 14159і тоді воно стає:

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

a.- Ваша програма / функція / алгоритм отримає два параметри - рядок, складений лише з малих літер без пробілів, і ключ, який буде просто позитивним цілим числом між 1 (1 відноситься до 3) і 1000, що може бути більше або менше, оскільки я не зовсім впевнений, скільки часу потрібно для обчислення PI з вказаною точністю, оскільки:

b.- Ви повинні самі обчислити PI у своєму коді, ось охайна веб-сторінка для порівняння з: Pi Day . Вхід ніколи не повинен обчислювати PI понад 1000 цифр, тобто довжина (повідомлення) + ключ <= 1000.

Обчислюючи Pi, я маю на увазі не кодувати його у своєму коді (нерозумно для гольфу з кодом) і не використовувати будь-яку вбудовану константу у своєму коді, ані тригонометричну ідентичність (2 * acos (0)), ані будь-яку веб-посилання.

c.- Вихід буде просто зашифрованим рядком.

Це кодове питання про гольф, коротший виграш коду!

Я прийму виграшну відповідь 14 липня 2014 року.


1
Що відбувається, коли літери зміщені в кінці алфавіту? Чи відбувається обгортання до початку алфавіту чи щось інше?
Цифрова травма

1
Так, ви просто починаєте спочатку.
BrunoJ

6
Що вважається "обчислити себе"? ArcCos(-1)?
Мартін Ендер

1
Я пояснив краще, що хотів сказати, обчисливши це самостійно, і вказав, що 3 - це перша цифра.
BrunoJ

1
Це насправді здається дійсно розумним алгоритмом шифрування, чому його не застосовують широко (за винятком складнішої константи, наприклад, e ^ pi або чогось менш пізнаваного)?
АСКАСК

Відповіді:


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

Добре, хороший, нарешті , отримав пі річ , працюючи з завдяки link1 і LINK2 .

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-ти.

Це може обчислити PI до 16-ї цифри.

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=1і m<<=4замість m='0x1'і m+=0? Економить 3 байти.
Майкл М.

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

EDIT №1: спростила арифметику мого модуля.

EDIT №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

0

CoffeeScript - 148 символів / байт

Мій перший у світі код гольф

На жаль, він не підтримує обгортання (так що az в кінцевому підсумку буде пунктуацією)

e = (m, k) -> (m.split (''). map (v, i) -> String.fromCharCode v.charCodeAt () + parseInt Math.PI.toString (). Замінити ('.', '') .slice (k-1, m.length + k-1) [i]). join ('')

Демонстрація на CSSDeck

Телефонується з:

сигнал e 'будинок', 2

isvxn


Чи прочитали ви ціле запитання, оскільки чітко сказано, що вам заборонено "використовувати будь-яку вбудовану константу у свій код"?
core1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.