pengantar
Misalkan Anda diberikan permutasi n
objek secara acak . Permutasi disegel dalam sebuah kotak, jadi Anda tidak tahu yang mana dari n!
kemungkinan itu. Jika Anda berhasil menerapkan permutasi ke n
objek yang berbeda, Anda dapat langsung menyimpulkan identitasnya. Namun, Anda hanya diizinkan untuk menerapkan permutasi ke n
vektor biner panjang, yang berarti Anda harus menerapkannya beberapa kali untuk mengenalinya. Jelas, menerapkannya ke n
vektor dengan hanya satu yang 1
melakukan 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 p
pertama n
, menggunakan pengindeksan berbasis 0 atau 1 berbasis. Outputnya adalah permutasi p
. Namun, Anda tidak diizinkan mengakses permutasi p
secara langsung . Satu-satunya hal yang dapat Anda lakukan dengannya adalah menerapkannya pada vektor n
bit apa pun . Untuk tujuan ini, Anda harus menggunakan fungsi bantu P
yang mengambil permutasi p
dan 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 3
dan -4
, atau 'a'
dan 'b'
, dan mereka tidak perlu diperbaiki, sehingga Anda dapat memanggil P
keduanya [-4,3,3,-4]
dan [2,2,2,1]
panggilan yang sama f
. Definisi P
tidak 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.txt
yang 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 Integer
objek ke P
dan membandingkan identitas mereka), dan fungsi P
selalu mengembalikan vektor baru alih-alih mengatur inputnya. Anda dapat dengan bebas mengubah nama f
dan 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 P
yang 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 P
untuk 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.
abaaabababaa
dan-4 3 3 3 -4 3
akan menjadi vektor bit.