Szyfrowanie okna PI

13

Jest to prosta metoda szyfrowania, która wykorzystuje cyfry PI do kodowania wiadomości, metoda jest prosta:

Klucz jest tylko dodatnią liczbą całkowitą, która wskazuje, gdzie zaczyna się okno:

Biorąc pod uwagę ciąg do zaszyfrowania, zawierający tylko małe litery, bez spacji, bierzesz jego długość, a następnie znajdujesz N-tą cyfrę PI, a następnie przesuwasz każdą literę w prawo o kwotę wskazaną przez cyfrę.

Na przykład, jeśli klucz jest 2i chcę zakodować house, wybieram okno z 5 cyframi z drugiego: 14159i wtedy staje się:

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

a.- Twój program / funkcja / algorytm otrzyma dwa parametry, ciąg złożony tylko z małych liter bez spacji i klucz, który będzie tylko dodatnią liczbą całkowitą od 1 (1 odnosi się do 3) do 1000, co może być więcej lub mniej, ponieważ nie jestem pewien, ile czasu zajmuje obliczenie PI z tą dokładnością, ponieważ:

b. - Musisz samodzielnie obliczyć PI w kodzie, oto fajna strona do porównania z: Dzień Pi . Dane wejściowe nigdy nie powinny wymagać obliczenia PI poza cyfrą 1000, co oznacza, że ​​długość (komunikat) + klawisz <= 1000.

Przez obliczanie Pi mam na myśli nie kodowanie go w kodzie (głupie jak na golfa kodu), ani używanie żadnej wbudowanej stałej w kodzie, ani żadnej tożsamości trygonometrycznej (2 * acos (0)), ani żadnych odnośników do stron internetowych.

c. - Wynikiem będzie tylko zaszyfrowany ciąg.

To pytanie do kodu golfowego, wygrywa krótszy kod!

Zwycięską odpowiedź przyjmuję 14 lipca 2014 r.

BrunoJ
źródło
1
Co się stanie, gdy litery zostaną przesunięte poza koniec alfabetu? Czy występuje zawijanie na początku alfabetu, czy coś innego?
Digital Trauma
1
Tak, zaczynasz od początku.
BrunoJ
6
Co się liczy jako „oblicz się sam”? ArcCos(-1)?
Martin Ender
1
Wyjaśniłem lepiej to, co chciałem powiedzieć, obliczając to sam i wskazałem, że 3 to pierwsza cyfra.
BrunoJ
1
To faktycznie wydaje się być naprawdę inteligentnym algorytmem szyfrującym, dlaczego nie jest to powszechnie stosowane (z wyjątkiem bardziej skomplikowanej stałej, takiej jak e ^ pi lub coś mniej rozpoznawalnego)?
ZAPYTAJ

Odpowiedzi:

3

CJam - 51

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

Przykładowe dane wejściowe:

zebra
20

Wynik:

dkdxe

Działa to dla (długość łańcucha) + klucz <= 2000, ale jest dość powolny dla interpretera online (wciąż szybki z interpreterem Java).

Oto wersja, która działa do 200 i możesz spróbować na http://cjam.aditsu.net/, nie czekając zbyt długo:

l_,li(2e3,-2%{2+_2/@*\/2e200+}*Ab><]z{~+_'z>26*-}%
aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
5

Python - 370

Ok, fajnie, w końcu udało mi się pracować z pi dzięki link1 i 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

Przykładowe dane wyjściowe:

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

i kolejny:

Wimt fcy d dnyh uhkvkv qhvadil   

>>> f („To była bardzo tajna wiadomość”, 1)

Willem
źródło
1

JavaScript - 167 173 176

Dzięki Michaelowi za sprytną reprezentację potęg 16.

Może to obliczyć PI do 16-tej cyfry.

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}

Przypadek testowy:

> e("house",2)
"isvxn"
rdzeń 1024
źródło
Co powiesz na m=1i m<<=4zamiast m='0x1'i m+=0? Oszczędza 3 bajty.
Michael M.
1

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

Większość wersji gry w golfa jest łatwa do odczytania i zrozumienia. Ostatnia linia nie jest opisana poniżej:

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

EDYCJA 1: uprościła moją arytmetykę modułu.

EDYCJA 2: przebudowano formułę BBP.

BeetDemGuise
źródło
0

Haskell - 265 267 bajty (bez 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

pjest golfową wersją algorytmu, którą można znaleźć na stronie http://rosettacode.org/wiki/Pi#Haskell

e jest funkcją kodowania:

λ> e 2 "house"
"isvxn"

Nie zapętla się, jeśli indeks znajduje się poza małym alfabetem. Oznacza to, że niektóre inne znaki mogą poślizgnąć się w zakodowanym ciągu:

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

Niestety przesunięcie zajmuje więcej sekund niż 10 000obliczenie wyniku. Na szczęście przy wielokrotnym użyciu tego samego przesunięcia cyfry należy obliczać tylko za pierwszym razem.

Bonus - dekodowanie

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

Ponownie, jeśli testujemy isvxn:

λ> d 2 "isvxn"
"house"
gxtaillon
źródło
Zrobiłem literówkę w dziale bonusów. d 2 "isvsn"powinno byćd 2 "isvxn"
Spedwards
Naprawiony. Dzięki za zauważenie.
gxtaillon
0

CoffeeScript - 148 znaków / bajtów

Mój pierwszy w historii Code Golf

Niestety nie obsługuje owijania (więc az skończyłoby się interpunkcją)

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

Demo na CSSDeck

Dzwoni z:

alert e „house”, 2

isvxn

ISNIT
źródło
Czy przeczytałeś całe pytanie, ponieważ wyraźnie stwierdza, że ​​nie wolno ci „używać żadnej wbudowanej stałej w swoim kodzie”?
core1024