Mã hóa cửa sổ PI


13

Đây là một phương thức mã hóa đơn giản sử dụng các chữ số PI để mã hóa tin nhắn, phương thức này rất đơn giản:

Khóa chỉ là một số nguyên dương cho biết nơi cửa sổ bắt đầu sau đó:

Đưa ra một chuỗi để mã hóa, chỉ chứa các chữ cái viết thường, không có khoảng trắng, bạn lấy độ dài của nó, sau đó bạn tìm chữ số thứ N của PI và sau đó tiến hành dịch chuyển từng chữ cái sang bên phải với số lượng được chỉ định bởi chữ số.

Ví dụ: nếu khóa là 2và tôi muốn mã hóa house, tôi lấy một cửa sổ gồm 5 chữ số từ số thứ hai: 14159và sau đó nó trở thành:

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

a.- Chương trình / hàm / thuật toán của bạn sẽ nhận được hai tham số, một chuỗi chỉ gồm các chữ cái thường không có khoảng trắng và khóa, sẽ chỉ là một số nguyên dương giữa 1 (1 đề cập đến 3) và 1000, có thể nhiều hơn hoặc ít hơn vì tôi không chắc chắn sẽ mất bao lâu để tính PI với độ chính xác đã nói vì:

b.- Bạn phải tự tính toán PI trong mã của mình, đây là một trang web gọn gàng để so sánh với: Ngày Pi . Đầu vào không bao giờ khiến bạn tính PI vượt quá 1000 chữ số, nghĩa là độ dài (tin nhắn) + khóa <= 1000.

Bằng cách tính toán Pi, tôi có nghĩa là không mã hóa nó trong mã của bạn (ngớ ngẩn cho một mã golf) cũng như không sử dụng bất kỳ hằng số nhúng nào trong mã của bạn cũng như bất kỳ nhận dạng lượng giác nào (2 * acos (0)) cũng như bất kỳ tham chiếu web nào.

c.- Đầu ra sẽ chỉ là chuỗi được mã hóa.

Đây là một câu hỏi golf mã, chiến thắng mã ngắn hơn!

Tôi sẽ chấp nhận câu trả lời chiến thắng vào ngày 14 tháng 7 năm 2014.


1
Điều gì xảy ra khi các chữ cái được dịch chuyển qua cuối bảng chữ cái? Liệu quấn quanh đầu bảng chữ cái xảy ra hay cái gì khác?
Chấn thương kỹ thuật số

1
Vâng, bạn chỉ cần bắt đầu lại từ đầu.
BrunoJ

6
Điều gì được tính là "tự tính toán"? ArcCos(-1)?
Martin Ender

1
Tôi đã giải thích rõ hơn những gì tôi muốn nói bằng cách tự mình tính toán và chỉ ra rằng 3 là chữ số đầu tiên.
BrunoJ

1
Đây thực sự có vẻ giống như một thuật toán mã hóa thực sự thông minh, tại sao nó không được sử dụng rộng rãi (ngoại trừ một hằng số phức tạp hơn như e ^ pi hoặc một cái gì đó ít nhận ra hơn)?
HỎI

Câu trả lời:


3

CJam - 51

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

Ví dụ đầu vào:

zebra
20

Đầu ra:

dkdxe

Điều này hoạt động cho (độ dài chuỗi) + khóa <= 2000, nhưng khá chậm đối với trình thông dịch trực tuyến (vẫn nhanh với trình thông dịch java).

Đây là phiên bản hoạt động tới 200 và bạn có thể dùng thử tại http://cjam.aditsu.net/ mà không phải chờ đợi quá lâu:

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

5

Con trăn - 370

Ok, tốt đẹp, cuối cùng đã có điều pi làm việc với nhờ 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

Ví dụ đầu ra:

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

và khác:

Wimt fcy d dnyh uhkvkv qhvadil   

>>> f ('Đây là một tin nhắn rất bí mật', 1)


1

JavaScript - 167 173 176

Cảm ơn Michael vì sự đại diện thông minh của sức mạnh của 16.

Điều này có thể tính PI lên đến chữ số thứ 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}

Các trường hợp thử nghiệm:

> e("house",2)
"isvxn"

Những gì về m=1m<<=4thay vì m='0x1'm+=0? Tiết kiệm 3 byte.
Michael M.

1

Con trăn - 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])))])

Hầu hết các phiên bản golf là dễ đọc và dễ hiểu. Dòng cuối cùng là vô danh dưới đây:

# 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: đơn giản hóa số học mô-đun của tôi.

EDIT # 2: tái cấu trúc công thức BBP.


0

Haskell - 265 267 byte (không có 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

plà một phiên bản golf của thuật toán có thể được tìm thấy tại http://rosettacode.org/wiki/Pi#Haskell

e là chức năng mã hóa:

λ> e 2 "house"
"isvxn"

Nó không lặp xung quanh nếu một chỉ mục nằm ngoài bảng chữ cái chữ thường. Điều này có nghĩa là một số ký tự khác có thể trượt trong chuỗi được mã hóa:

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

Thật không may, phải mất vài giây với độ lệch lớn hơn 10 000để tính toán đầu ra. May mắn thay, khi sử dụng cùng một độ lệch nhiều lần, các chữ số chỉ phải được tính lần đầu tiên.

Tiền thưởng - Giải mã

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

Một lần nữa nếu chúng tôi kiểm tra với isvxn:

λ> d 2 "isvxn"
"house"

Tạo một lỗi đánh máy trong phần thưởng của bạn. d 2 "isvsn"nên làd 2 "isvxn"
Spedwards

Đã sửa. Cảm ơn đã chú ý.
gxtaillon

0

CoffeeScript - 148 Chars / Byte

Code Golf đầu tiên của tôi

Thật không may, nó không hỗ trợ gói (Vì vậy, az cuối cùng sẽ bị chấm câu)

e = (m, k) -> (m.split (''). map (v, i) -> String.fromCharCode v.charCodeAt () + parseInt Math.PI.toString (). thay thế ('.', '') .slice (k-1, m.length + k-1) [i]). tham gia ('')

Bản trình diễn trên CSSDeck

Được gọi với:

cảnh báo e 'house', 2

isvxn


Bạn đã đọc toàn bộ câu hỏi chưa, vì nó nói rõ rằng bạn không được phép "sử dụng bất kỳ hằng số nhúng nào trong mã của mình"?
core1024
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.