pengantar
Misalkan Anda diberikan permutasi nobjek secara acak . Permutasi disegel dalam sebuah kotak, jadi Anda tidak tahu yang mana dari n!kemungkinan itu. Jika Anda berhasil menerapkan permutasi ke nobjek yang berbeda, Anda dapat langsung menyimpulkan identitasnya. Namun, Anda hanya diizinkan untuk menerapkan permutasi ke nvektor biner panjang, yang berarti Anda harus menerapkannya beberapa kali untuk mengenalinya. Jelas, menerapkannya ke nvektor dengan hanya satu yang 1melakukan pekerjaan, tetapi jika Anda pintar, Anda dapat melakukannya dengan log(n)aplikasi. Kode untuk metode itu akan lebih panjang, meskipun ...
Ini adalah tantangan eksperimental di mana skor Anda merupakan kombinasi dari panjang kode dan kompleksitas kueri , yang berarti jumlah panggilan ke prosedur bantu. Speknya agak panjang, jadi tahan dengan saya.
Tugas
Tugas Anda adalah menulis fungsi bernama (atau setara terdekat) f yang mengambil input bilangan bulat positif n, dan permutasi bilangan bulat ppertama n, menggunakan pengindeksan berbasis 0 atau 1 berbasis. Outputnya adalah permutasi p. Namun, Anda tidak diizinkan mengakses permutasi psecara langsung . Satu-satunya hal yang dapat Anda lakukan dengannya adalah menerapkannya pada vektor nbit apa pun . Untuk tujuan ini, Anda harus menggunakan fungsi bantu Pyang mengambil permutasi pdan vektor bit v, dan mengembalikan vektor permutasi yang p[i]koordinatnya berisi bit v[i]. Sebagai contoh:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
Anda dapat mengganti "bit" dengan dua nilai berbeda, seperti 3dan -4, atau 'a'dan 'b', dan mereka tidak perlu diperbaiki, sehingga Anda dapat memanggil Pkeduanya [-4,3,3,-4]dan [2,2,2,1]panggilan yang sama f. Definisi Ptidak dihitung terhadap skor Anda.
Mencetak gol
The kompleksitas permintaan dari solusi Anda pada masukan yang diberikan adalah jumlah panggilan itu membuat untuk fungsi tambahan P. Agar ukuran ini tidak ambigu, solusi Anda harus deterministik. Anda dapat menggunakan angka pseudo-acak, tetapi kemudian Anda juga harus memperbaiki seed awal untuk generator.
Dalam repositori ini Anda akan menemukan file bernama permutations.txtyang berisi 505 permutasi, 5 masing-masing panjang antara 50 dan 150 inklusif, menggunakan pengindeksan berbasis 0 (menambah setiap angka dalam kasus berbasis 1). Setiap permutasi berada pada barisnya sendiri, dan jumlahnya dipisahkan oleh spasi. Skor Anda adalah jumlah byte f+ kompleksitas kueri rata-rata pada input ini . Skor terendah menang.
Aturan Ekstra
Kode dengan penjelasan lebih disukai, dan celah standar tidak diizinkan. Secara khusus, bit individual tidak dapat dibedakan (sehingga Anda tidak dapat memberikan vektor Integerobjek ke Pdan membandingkan identitas mereka), dan fungsi Pselalu mengembalikan vektor baru alih-alih mengatur inputnya. Anda dapat dengan bebas mengubah nama fdan P, dan urutan pengambilan argumen mereka.
Jika Anda adalah orang pertama yang menjawab dalam bahasa pemrograman Anda, Anda sangat dianjurkan untuk memasukkan test harness, termasuk implementasi fungsi Pyang juga menghitung berapa kali dipanggil. Sebagai contoh, inilah harness untuk 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()
Dalam beberapa bahasa, tidak mungkin menulis harness seperti itu. Terutama, Haskell tidak mengizinkan fungsi murni Puntuk mencatat berapa kali dipanggil. Karena alasan ini, Anda diizinkan untuk mengimplementasikan kembali solusi Anda sedemikian rupa sehingga ia juga menghitung kompleksitas kuerinya, dan menggunakannya dalam harness.
abaaabababaadan-4 3 3 3 -4 3akan menjadi vektor bit.