Giriş
Farz edelim ki, nnesnelerin rastgele bir permütasyonu verildi . Permütasyon bir kutu içinde mühürlenmiştir, bu yüzden n!olası olanlardan hangisi olduğu hakkında hiçbir fikriniz yoktur . Permütasyonu nfarklı nesnelere uygulamayı başarırsanız, hemen kimliğini çıkarabilirsiniz. Bununla birlikte, permütasyonu sadece uzunlamasına nvektörlere uygulamanıza izin verilir , yani onu tanımak için birkaç kez uygulamanız gerekir. Açıkça, bunu nsadece biriyle vektörlere uygulamak 1işi yapar, ancak zekiyseniz log(n)uygulamalarla yapabilirsiniz. Yine de bu yöntemin kodu daha uzun olacak ...
Bu, puanınızın kod uzunluğu ve sorgu karmaşıklığının bir kombinasyonu olduğu , yardımcı bir prosedüre yapılan çağrıların sayısı olduğu deneysel bir sorundur . Spesifikasyon biraz uzun, bu yüzden bana katlan.
Görev
Göreviniz girdi olarak pozitif bir tamsayı ve ilk tamsayıların permütasyonunu 0 tabanlı veya 1 tabanlı indeksleme kullanarak alan adlandırılmış bir işlev (veya en yakın eşdeğeri) yazmaktır . Çıktısı permütasyon . Ancak, permütasyona doğrudan erişmenize izin verilmez . Bununla yapabileceğiniz tek şey, onu herhangi bir bit vektörüne uygulamaktır . Bu amaçla, bir permütasyon ve bir bit vektörü alan ve koordinatı biti içeren izin verilen vektörü döndüren yardımcı bir fonksiyon kullanmalısınız . Örneğin:fnpnppnPpvp[i]v[i]
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
Aşağıdaki gibi herhangi iki ayrı değerlere sahip "bit" yerine 3ve -4ya 'a've 'b'çağrı böylece onlar sabit gerekmez ve Pher ikisi ile [-4,3,3,-4]ve [2,2,2,1]aynı çağrısında f. Tanımı, Ppuanınıza dahil edilmez.
puanlama
Sorgu karmaşıklığı Belirli bir girdi üzerinde çözümün bu yardımcı işlevine yapar aramaların sayısıdır P. Bu tedbiri açık hale getirmek için çözümünüz deterministik olmalıdır. Yalancı rasgele oluşturulmuş sayılar kullanabilirsiniz, ancak daha sonra jeneratör için bir başlangıç tohumunu da düzeltmelisiniz.
Olarak , bu depo adlı bir dosya bulacaksınız permutations.txt0 tabanlı dizin (1 tabanlı bir durumda her numarası artırmak) kullanılarak 505 permütasyon, 50 ve 150 dahil bunlar arasında her uzunlukta 5 ihtiva etmektedir. Her permütasyon kendi satırındadır ve sayıları boşluklarla ayrılmıştır. Puanınız, bu girdilerdeki + ortalama sorgu karmaşıklığının bayt sayısıdırf . En düşük puan kazanır.
Ek Kurallar
Açıklamalı kod tercih edilir ve standart boşluklara izin verilmez. Özellikle, ayrı bitler ayırt edilemez (bu nedenle Integernesnelerin bir vektörünü veremez Pve kimliklerini karşılaştıramazsınız) ve işlev P, girişini yeniden düzenlemek yerine her zaman yeni bir vektör döndürür. Ve öğelerinin adlarını fve Pargümanlarını alma sırasını serbestçe değiştirebilirsiniz .
Programlama dilinizde ilk cevap veren kişi sizseniz, işlevinin Pçağrılma sayısını da sayan bir uygulama da dahil olmak üzere bir test takımı eklemeniz önemle tavsiye edilir . Örnek olarak, Python 3'ün koşum takımı.
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()
Bazı dillerde, böyle bir koşum takımı yazmak imkansızdır. En önemlisi, Haskell saf işlevin Pkaç kez çağrıldığını kaydetmesine izin vermez . Bu nedenle, çözümünüzü sorgu karmaşıklığını da hesaplayacak şekilde yeniden uygulamanıza ve bunu kablo demetinde kullanmanıza izin verilir.
abaaabababaave-4 3 3 3 -4 3bir bit vektörü olur.