Окно шифрования 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 года.

BrunoJ
источник
1
Что происходит, когда буквы сдвигаются после конца алфавита? Происходит ли переход к началу алфавита или что-то еще?
Цифровая травма
1
Да, вы просто начинаете все сначала.
BrunoJ
6
Что считается "вычислить себя"? ArcCos(-1)?
Мартин Эндер
1
Я лучше объяснил, что я хотел сказать, вычислив это сам и указал, что 3 - это первая цифра.
BrunoJ
1
На самом деле это похоже на действительно умный алгоритм шифрования, почему он не используется широко (за исключением более сложной константы, такой как e ^ pi или чего-то менее узнаваемого)?
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*-}%
уйти, потому что SE это зло
источник
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)

Willem
источник
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"
core1024
источник
А как насчет 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))

РЕДАКТИРОВАТЬ # 1: упростил мой модуль арифметики.

РЕДАКТИРОВАНИЕ № 2: рефакторинг формулы BBP.

BeetDemGuise
источник
0

Хаскелл - 265 267 байты (без ввода-вывода)

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"
gxtaillon
источник
Сделал опечатку в своем бонусном разделе. d 2 "isvsn"должно бытьd 2 "isvxn"
Spedwards
Исправлена. Спасибо, что заметили.
gxtaillon
0

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

Мой первый в истории Code Golf

К сожалению, он не поддерживает перенос (так что в конечном итоге az будет пунктуацией)

e = (m, k) -> (m.split (''). map (v, i) -> String.fromCharCode v.charCodeAt () + parseInt Math.PI.toString (). replace ('.', '') .slice (к-1, m.length + к-1) [I]). присоединиться ( '')

Демо на CSSDeck

Вызывается с:

оповещение е 'дом', 2

isvxn

ISNIT
источник
Читали ли вы весь вопрос, поскольку в нем четко указано, что вам не разрешено «использовать любую встроенную константу в вашем коде»?
core1024