ভূমিকা
মনে করুন যে আপনাকে n
অবজেক্টের একটি এলোমেলো অনুগমন দেওয়া হয়েছে । ক্রমটিশনটি একটি বাক্সে সিল করা হয়েছে, সুতরাং এটি n!
সম্ভাব্য কোনটি তা আপনার কোনও ধারণা নেই । আপনি যদি n
পৃথক বস্তুগুলিতে অনুমতিটি প্রয়োগ করতে পরিচালিত হন , আপনি তাত্ক্ষণিকভাবে তার পরিচয়টি কমিয়ে আনতে পারেন। তবে, আপনাকে কেবল দৈর্ঘ্য- n
বাইনারি ভেক্টরগুলিতেই অনুমতি প্রয়োগ করতে দেওয়া হয় , যার অর্থ এটি সনাক্ত করতে আপনাকে বেশ কয়েকবার প্রয়োগ করতে হবে। স্পষ্টতই, এটি n
কেবলমাত্র একজনের সাথে ভেক্টরগুলিতে প্রয়োগ করা 1
কাজ করে তবে আপনি যদি চালাক হন তবে আপনি log(n)
অ্যাপ্লিকেশন দিয়ে এটি করতে পারেন। এই পদ্ধতির কোডটি দীর্ঘতর হবে, যদিও ...
এটি একটি পরীক্ষামূলক চ্যালেঞ্জ যেখানে আপনার স্কোরটি কোড দৈর্ঘ্যের এবং ক্যোয়ারী জটিলতার সংমিশ্রণ , যার অর্থ সহায়ক পদ্ধতির কলগুলির সংখ্যা। অনুমানটি কিছুটা দীর্ঘ, তাই আমাকে সহ্য করুন।
কাজটি
আপনার কাজটি হল একটি নামযুক্ত ফাংশন (বা নিকটতম সমতুল্য) লিখুন f
যা 0-ভিত্তিক বা 1-ভিত্তিক সূচক ব্যবহার করে কোনও ধনাত্মক পূর্ণসংখ্যার n
এবং p
প্রথম n
পূর্ণসংখ্যার ক্রমবিন্যাস গ্রহণ করে । তার আউটপুট বিন্যাস হয় p
। তবে আপনাকে p
সরাসরি অনুমতিটি অ্যাক্সেস করার অনুমতি নেই । এটির সাথে কেবলমাত্র আপনি যা করতে পারেন তা হ'ল এটি কোনও n
বিটের ভেক্টরকে প্রয়োগ করা । এই উদ্দেশ্যে, আপনি একটি সহায়ক ক্রিয়াকলাপ ব্যবহার করতে পারেন P
যা একটি ক্রম p
এবং বিটগুলির একটি ভেক্টর গ্রহণ করে v
এবং অনুমতিযুক্ত ভেক্টরকে ফিরিয়ে দেয় যার p[i]
তম স্থানাঙ্কটিতে বিট রয়েছে v[i]
। উদাহরণ স্বরূপ:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
আপনি যেমন কোন দুটি স্বতন্ত্র মূল্যবোধ, সঙ্গে "বিট" প্রতিস্থাপন করতে পারেন 3
এবং -4
, বা 'a'
এবং 'b'
যাতে আপনি কল করতে পারেন, এবং তারা সংশোধন করা প্রয়োজন নেই, P
উভয় সঙ্গে [-4,3,3,-4]
এবং [2,2,2,1]
এ একই কলে f
। সংজ্ঞাটি P
আপনার স্কোরের দিকে গণনা করা হয় না।
স্কোরিং
ক্যোয়ারী জটিলতা একটি প্রদত্ত ইনপুট আপনার সমাধান কলের সংখ্যা এটা অক্জিলিয়ারী ফাংশন করে তোলে P
। এই পরিমাপটিকে দ্ব্যর্থহীন করার জন্য, আপনার সমাধানটি অবশ্যই নির্বিচারক হওয়া উচিত। আপনি ছদ্ম-এলোমেলোভাবে উত্পন্ন সংখ্যাগুলি ব্যবহার করতে পারেন তবে তার পরে আপনাকে জেনারেটরের জন্য একটি প্রাথমিক বীজও ঠিক করতে হবে।
ইন এই সংগ্রহস্থলের আপনি একটি ফাইল নামক পাবেন permutations.txt
যে 505 একাধিক বিন্যাসন, 50 এবং 150 সমেত মধ্যে প্রতিটি দৈর্ঘ্য 5, 0-ভিত্তিক ইন্ডেক্স (1 ভিত্তিক ক্ষেত্রে প্রতিটি সংখ্যা বাড়ায়) ব্যবহার করে থাকে। প্রতিটি অনুক্রমটি তার নিজস্ব লাইনে থাকে এবং এর সংখ্যা ফাঁক দিয়ে আলাদা হয়। আপনার স্কোরটি এই ইনপুটগুলিতে + গড় ক্যোয়ারী জটিলতার বাইট গণনাf
। সর্বনিম্ন স্কোর জয়।
অতিরিক্ত বিধি
ব্যাখ্যা সহ কোডটি অগ্রাধিকার দেওয়া হয় এবং মানক লুফোলগুলি অনুমোদিত নয়। বিশেষত, পৃথক বিটগুলি পৃথক বিভেদযুক্ত (যাতে আপনি তাদের পরিচয়গুলির সাথে কোনও Integer
বস্তুর ভেক্টর দিতে P
এবং তুলনা করতে পারবেন না ), এবং ফাংশনটি P
সর্বদা তার ইনপুটটিকে নতুন করে সাজানোর পরিবর্তে একটি নতুন ভেক্টর ফেরত দেয়। আপনি এবং এর নাম f
এবং যেভাবে P
তারা তাদের যুক্তি গ্রহণ করে সেগুলি অবাধে পরিবর্তন করতে পারেন change
আপনি যদি আপনার প্রোগ্রামিং ভাষায় উত্তর দেওয়ার ক্ষেত্রে প্রথম ব্যক্তি হন তবে আপনাকে কোনও পরীক্ষার জোতা অন্তর্ভুক্ত করার জন্য উত্সাহিত করা হবে, এতে ফাংশনটির একটি বাস্তবায়ন যা P
এটি ডাকা হয়েছে তার সংখ্যা গণনাও করে। উদাহরণস্বরূপ, পাইথন 3 এর জোতা এখানে।
def f(n,p):
pass # Your submission goes here
num_calls = 0
def P(permutation, bit_vector):
global num_calls
num_calls += 1
permuted_vector = [0]*len(bit_vector)
for i in range(len(bit_vector)):
permuted_vector[permutation[i]] = bit_vector[i]
return permuted_vector
num_lines = 0
file_stream = open("permutations.txt")
for line in file_stream:
num_lines += 1
perm = [int(n) for n in line.split()]
guess = f(len(perm), perm)
if guess != perm:
print("Wrong output\n %s\n given for input\n %s"%(str(guess), str(perm)))
break
else:
print("Done. Average query complexity: %g"%(num_calls/num_lines,))
file_stream.close()
কিছু ভাষায়, এই জাতীয় জোতা লেখা অসম্ভব। সবচেয়ে উল্লেখযোগ্যভাবে, হাস্কেল খাঁটি ফাংশনটিকে P
যতবার ডাকা হয় তার রেকর্ড করতে দেয় না । এই কারণে, আপনার সমাধানটিকে এমনভাবে পুনরায় বাস্তবায়নের অনুমতি দেওয়া হয়েছে যাতে এটি এর প্রশ্নের জরুরীতাও গণনা করে এবং জোড় করে ব্যবহার করে।
abaaabababaa
এবং-4 3 3 3 -4 3
বিট একটি ভেক্টর হবে।