PI विंडो एन्क्रिप्शन


13

यह एक सरल एन्क्रिप्शन विधि है जो किसी संदेश को एनकोड करने के लिए PI अंकों का उपयोग करती है, यह विधि सरल है:

कुंजी सिर्फ एक धनात्मक पूर्णांक है जो इंगित करता है कि विंडो कहाँ से शुरू होती है:

एन्क्रिप्ट करने के लिए एक स्ट्रिंग को देखते हुए, केवल लोअरकेस अक्षर होते हैं, कोई रिक्त स्थान नहीं, आप इसकी लंबाई लेते हैं, फिर आप पीआई का एनटी अंक पाते हैं और फिर अंक द्वारा इंगित राशि के लिए हर अक्षर को दाईं ओर स्थानांतरित करने के लिए आगे बढ़ते हैं।

उदाहरण के लिए, यदि कुंजी है 2और मैं एनकोड करना चाहता हूं house, तो मैं दूसरे से 5 अंकों की एक विंडो लेता हूं: 14159और फिर यह है:

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

a.- आपके प्रोग्राम / फंक्शन / एल्गोरिथ्म में दो पैरामीटर प्राप्त होंगे, एक स्ट्रिंग जो केवल लोअरकेस अक्षरों से बना होता है जिसमें कोई रिक्त स्थान और कुंजी नहीं होती है, जो कि 1 (1 से 3 और 1000) के बीच एक सकारात्मक पूर्णांक होगा, जो अधिक हो सकता है या कम के रूप में मुझे यकीन नहीं है कि पीआई की गणना करने में कितना समय लगता है क्योंकि कहा सटीकता के साथ:

b.- आपको अपने कोड में पीआई की गणना करनी चाहिए, यहाँ की तुलना करने के लिए एक साफ-सुथरा वेबपेज है: Pi Day । इनपुट में आपके पास कभी भी 1000 अंकों से परे पीआई की गणना नहीं होनी चाहिए, जिसका अर्थ है कि लंबाई (संदेश) + कुंजी <= 1000।

पाई की गणना करके, मेरा मतलब है कि इसे आपके कोड में (कोड गोल्फ के लिए मूर्खतापूर्ण) न तो और न ही आपके कोड में कोई एम्बेडेड स्थिरांक का उपयोग करें और न ही किसी त्रिकोणमितीय पहचान (2 * acos (0)) का और न ही किसी वेब सन्दर्भ का।

c.- आउटपुट सिर्फ एन्क्रिप्टेड स्ट्रिंग होगा।

यह एक कोड गोल्फ प्रश्न है, कम कोड जीतता है!

मैं 14 जुलाई 2014 को विजेता उत्तर स्वीकार करूंगा।


1
जब वर्णमाला के अंत में अक्षरों को स्थानांतरित किया जाता है तो क्या होता है? क्या चारों ओर लपेटने से वर्णमाला की शुरुआत होती है या कुछ और?
डिजिटल ट्रॉमा

1
हां, आप शुरुआत से ही शुरुआत करते हैं।
ब्रूनोज

6
"अपने आप को गणना" के रूप में क्या मायने रखता है? ArcCos(-1)?
मार्टिन एंडर

1
मैंने बेहतर तरीके से समझाया कि मैं खुद को अभिकलन करके क्या कहना चाहता था और कहा कि 3 पहला अंक है।
ब्रूनो

1
यह वास्तव में एक वास्तव में स्मार्ट एन्क्रिप्शन एल्गोरिथ्म की तरह लगता है, क्यों यह व्यापक रूप से उपयोग नहीं किया जाता है (ई ^ पी या कुछ कम अनुकूलन योग्य जैसे अधिक जटिल निरंतर को छोड़कर)?
ASKASK

जवाबों:


3

CJam - 51

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

उदाहरण इनपुट:

zebra
20

आउटपुट:

dkdxe

यह (स्ट्रिंग लंबाई) + कुंजी <= 2000 के लिए काम करता है, लेकिन ऑनलाइन दुभाषिया के लिए काफी धीमा है (अभी भी जावा दुभाषिया के साथ तेजी से)।

यहां एक संस्करण है जो 200 तक काम करता है और आप http://cjam.aditsu.net/ पर बहुत लंबे समय तक प्रतीक्षा किए बिना प्रयास कर सकते हैं:

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

5

अजगर - 370

ठीक है, एक अच्छा, अंत में लिंक 1 और 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   

>>> च ('यह एक बहुत ही गुप्त संदेश था', 1)


1

जावास्क्रिप्ट - 167 173 176

माइकल को 16 की शक्तियों के चतुर प्रतिनिधित्व के लिए धन्यवाद ।

यह 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=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 बाइट्स (कोई आईओ)

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

कॉफीस्क्रिप्ट - 148 चार्ट / बाइट्स

मेरी पहली बार कोड गोल्फ

दुर्भाग्य से यह रैपिंग का समर्थन नहीं करता है (ताकि az अंत में विराम चिह्न होगा)

e = (m, k) -> (m.split ('')। map (v, i) -> String.fromCharCode v.charCodeAt () + parseInt Math.PI.to.ring () '') .slice (k-1, m.length + K-1) [i])। में शामिल होने के ( '')

CSSDeck पर डेमो

इसके साथ कॉल किया गया:

सतर्क ई 'घर', २

isvxn


क्या आपने पूरा प्रश्न पढ़ा है, क्योंकि यह स्पष्ट रूप से बताता है कि आपको "अपने कोड में किसी भी एम्बेडेड स्थिरांक का उपयोग करने की अनुमति नहीं है"?
Core1024
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.