บทนำ
สมมติว่าคุณได้รับการเปลี่ยนรูปแบบสุ่มของnวัตถุ การเรียงสับเปลี่ยนถูกผนึกไว้ในกล่องดังนั้นคุณจึงไม่รู้ว่าเป็นn!ไปได้ใด หากคุณพยายามที่จะใช้การเรียงสับเปลี่ยนกับnวัตถุที่แตกต่างคุณสามารถอนุมานตัวตนได้ทันที อย่างไรก็ตามคุณได้รับอนุญาตให้ใช้การเปลี่ยนแปลงกับnเวกเตอร์ไบนารี่แบบยาวซึ่งหมายความว่าคุณจะต้องใช้มันหลายครั้งเพื่อที่จะจดจำมัน เห็นได้ชัดว่านำไปใช้กับnเวกเตอร์ที่มีเพียง1งานเดียว แต่ถ้าคุณฉลาดคุณสามารถทำได้ด้วยlog(n)แอปพลิเคชัน รหัสสำหรับวิธีการนั้นจะยาวกว่า ...
นี่เป็นความท้าทายทดสอบที่คะแนนของคุณเป็นการรวมกันของความยาวของรหัสและความซับซ้อนของแบบสอบถามซึ่งหมายถึงจำนวนการโทรไปยังกระบวนการเสริม สเป็คค่อนข้างยาวดังนั้นทนกับฉัน
งาน
งานของคุณคือการเขียนฟังก์ชั่นที่ มีชื่อ (หรือเทียบเท่าที่ใกล้เคียงที่สุด)fที่ใช้เป็นอินพุตจำนวนเต็มบวกnและการเปลี่ยนแปลงpของnจำนวนเต็มแรกโดยใช้การทำดัชนีตาม 0 หรือ 1 pการส่งออกของมันคือการเปลี่ยนลําดับ แต่คุณจะไม่ได้รับอนุญาตให้เข้าถึงการเปลี่ยนลําดับpโดยตรง สิ่งเดียวที่คุณทำได้คือใช้มันกับเวกเตอร์ใด ๆ ของnบิต เพื่อจุดประสงค์นี้คุณจะต้องใช้ฟังก์ชั่นเสริมPที่ใช้เวลาในการเปลี่ยนแปลงpและเวกเตอร์ของบิตvและผลตอบแทนเวกเตอร์ permuted ซึ่งp[i]TH 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 permutations, 5 ของแต่ละความยาวระหว่าง 50 และ 150 รวมโดยใช้การทำดัชนีแบบ 0 (เพิ่มแต่ละหมายเลขในกรณีที่ใช้ 1) การเรียงสับเปลี่ยนแต่ละครั้งจะอยู่ในบรรทัดของตัวเองและตัวเลขจะถูกคั่นด้วยช่องว่าง คะแนนของคุณคือการนับ byte ของfความซับซ้อนแบบสอบถามเฉลี่ย + ปัจจัยเหล่านี้ คะแนนต่ำสุดชนะ
กฎพิเศษ
ต้องการรหัสที่มีคำอธิบายและไม่อนุญาตให้มีช่องโหว่มาตรฐาน โดยเฉพาะอย่างยิ่งแต่ละบิตแยกไม่ออก (ดังนั้นคุณไม่สามารถให้เวกเตอร์ของIntegerวัตถุPและเปรียบเทียบตัวตนของพวกเขา) และฟังก์ชั่นPจะส่งกลับเวกเตอร์ใหม่เสมอแทนที่จะจัดเรียงอินพุตใหม่ คุณสามารถเปลี่ยนชื่อfและPและลำดับในการโต้แย้ง
หากคุณเป็นคนแรกที่ตอบคำถามในการเขียนโปรแกรมภาษาของคุณขอแนะนำให้คุณรวมชุดทดสอบรวมถึงการใช้งานฟังก์ชั่นPที่นับจำนวนครั้งที่มีการเรียกใช้ ตัวอย่างเช่นนี่คือสายรัดสำหรับ Python 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()
ในบางภาษามันเป็นไปไม่ได้ที่จะเขียนสายรัดแบบนี้ ที่สะดุดตาที่สุด Haskell ไม่อนุญาตให้ฟังก์ชันบริสุทธิ์Pบันทึกจำนวนครั้งที่ถูกเรียก ด้วยเหตุนี้คุณจึงได้รับอนุญาตให้นำโซลูชันของคุณกลับมาใช้ใหม่ในลักษณะที่จะคำนวณความซับซ้อนของการสืบค้นและใช้ในการควบคุม
abaaabababaaและ-4 3 3 3 -4 3จะเป็น vector ของ bits