Giriş
Farz edelim ki, n
nesnelerin 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 n
farklı nesnelere uygulamayı başarırsanız, hemen kimliğini çıkarabilirsiniz. Bununla birlikte, permütasyonu sadece uzunlamasına n
vektörlere uygulamanıza izin verilir , yani onu tanımak için birkaç kez uygulamanız gerekir. Açıkça, bunu n
sadece biriyle vektörlere uygulamak 1
iş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:f
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]
Aşağıdaki gibi herhangi iki ayrı değerlere sahip "bit" yerine 3
ve -4
ya 'a'
ve 'b'
çağrı böylece onlar sabit gerekmez ve P
her ikisi ile [-4,3,3,-4]
ve [2,2,2,1]
aynı çağrısında f
. Tanımı, P
puanı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.txt
0 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 Integer
nesnelerin bir vektörünü veremez P
ve 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ı f
ve P
argü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 P
kaç 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.
abaaabababaa
ve-4 3 3 3 -4 3
bir bit vektörü olur.