บทนำ
สมมติว่าคุณได้รับการเปลี่ยนรูปแบบสุ่มของ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