পিআই উইন্ডো এনক্রিপশন


13

এটি একটি সাধারণ এনক্রিপশন পদ্ধতি যা কোনও বার্তা এনকোড করার জন্য পিআই অঙ্কগুলি ব্যবহার করে, পদ্ধতিটি সহজ:

কীটি হ'ল একটি ইতিবাচক পূর্ণসংখ্যা যা ইঙ্গিত দেয় যে উইন্ডোটি তারপরে কোথায় শুরু হয়:

এনক্রিপ্ট করার জন্য একটি স্ট্রিং দেওয়া হয়েছে, কেবল ছোট হাতের অক্ষর রয়েছে, কোনও ফাঁকা জায়গা নেই, আপনি দৈর্ঘ্যটি নিয়ে যান, তারপরে আপনি পিআইয়ের নবম সংখ্যাটি খুঁজে পাবেন এবং তারপরে অঙ্ক দ্বারা নির্দেশিত পরিমাণের জন্য প্রতিটি অক্ষর ডানদিকে স্থানান্তরিত হবে।

উদাহরণস্বরূপ, যদি কীটি থাকে 2এবং আমি এনকোড করতে চাই তবে houseআমি দ্বিতীয়টি থেকে 5 অঙ্কের একটি উইন্ডো নিয়ে যাই: 14159এবং তারপরে এটি হয়ে যায়:

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

এ .- আপনার প্রোগ্রাম / ফাংশন / অ্যালগরিদম দুটি প্যারামিটার গ্রহণ করবে, একটি স্ট্রিং কেবল ছোট হাতের অক্ষর এবং ফাঁকাবিহীন কী দ্বারা রচিত, যা 1 (1 বোঝায় 3) এবং 1000 এর মধ্যে কেবল ধনাত্মক পূর্ণসংখ্যা হবে, যা আরও বেশি হতে পারে বা তার চেয়ে কম হিসাবে আমি নিশ্চিত নির্ভুলতার সাথে পিআই গণনা করতে কতক্ষণ সময় নেয় তা নিশ্চিত না কারণ:

খ .- আপনাকে অবশ্যই নিজের কোডটিতে পিআই গুনতে হবে, এখানে তুলনা করার জন্য একটি ঝরঝরে ওয়েবপৃষ্ঠা রয়েছে: পাই ডে । ইনপুটটিতে আপনার কখনই 1000 অঙ্কের বাইরে পিআই গণনা করা উচিত নয়, যার অর্থ দৈর্ঘ্য (বার্তা) + কী <= 1000।

পাই গণনা করার অর্থ, আমি এটিকে আপনার কোডে হার্ডকোড করব না (কোনও কোড গল্ফের জন্য মূর্খ) বা আপনার কোডে কোনও এম্বেড থাকা ধ্রুবক বা কোনও ত্রিকোণমিত্রিক পরিচয় (২ * আকোস (0)) বা কোনও ওয়েব রেফারেন্স ব্যবহার করবেন না।

c.- আউটপুটটি কেবল এনক্রিপ্ট করা স্ট্রিং হবে।

এটি একটি কোড গল্ফ প্রশ্ন, সংক্ষিপ্ত কোড জয়!

আমি 14 জুলাই, 2014 এ বিজয়ী উত্তরটি গ্রহণ করব।


1
বর্ণমালার শেষের পরে অক্ষর স্থানান্তরিত হলে কী হবে? বর্ণমালার শুরুতে মোড়কের চারপাশে কি অন্য কিছু ঘটে?
ডিজিটাল ট্রমা

1
হ্যাঁ, আপনি ঠিক শুরু থেকে শুরু।
ব্রুনোজে

6
"নিজেকে গণনা করুন" বলে কী গণনা করা হয়? ArcCos(-1)?
মার্টিন ইন্ডার

1
আমি নিজেই এটি গণনা করে যা বলতে চেয়েছিলাম তা আরও ভাল করে ব্যাখ্যা করেছি এবং নির্দেশ করেছি যে 3টি প্রথম সংখ্যা।
ব্রুনোজে

1
এটি প্রকৃতপক্ষে একটি স্মার্ট এনক্রিপশন অ্যালগরিদমের মতো মনে হচ্ছে, কেন এটি ব্যাপকভাবে ব্যবহৃত হয় না (ই-পিআই এর মতো জটিল ধ্রুবক বা কম স্বীকৃত কিছু বাদে) কেন?
ASKASK

উত্তর:


3

সিজেম - 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 লিঙ্ক 1 এবং লিঙ্ক 2 ধন্যবাদ দিয়ে কাজ করে ।

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-তম সংখ্যা পর্যন্ত পিআই গণনা করতে পারে।

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

সম্পাদনা # 1: আমার মডিউল পাটিগণিত সরল।

সম্পাদনা # 2: বিবিপি সূত্রটি রিফেক্টর করেছে।


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"
স্পিডওয়ার্ডস

সংশোধন করা হয়েছে। লক্ষ্য করার জন্য ধন্যবাদ।
gxtaillon

0

কফিস্ক্রিপ্ট - 148 চর / বাইট

আমার প্রথম কোড গল্ফ

দুর্ভাগ্যক্রমে এটি মোড়ানো সমর্থন করে না (সুতরাং এজ বিরামচিহ্ন হতে পারে)

e = (মি, কে) -> (এম। স্প্লিট ('')। মানচিত্র (v, i) -> স্ট্রিং.ফর্মচারড ভি.সি.আর.কোডএট () + পার্সেন্ট ম্যাথ.পি.আই.টো স্ট্রিং ()। প্রতিস্থাপন ('।', '') .slice (K-1, m.length + K-1) [আমি])। যোগদানের ( '')

সিএসএসডেকের ডেমো

এর সাথে কল করা:

সতর্কতা ই 'বাড়ি', ২

isvxn


আপনি কি পুরো প্রশ্নটি পড়েছেন, কারণ এটি পরিষ্কারভাবে জানিয়েছে যে আপনাকে "আপনার কোডে কোনও এমবেড থাকা ধ্রুবক ব্যবহার করার অনুমতি নেই"?
কোর 1024
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.