Вступ
Припустимо, вам передають випадкову перестановку nоб'єктів. Перестановка запечатана у коробці, тому ви не маєте уявлення, яка з n!можливих. Якщо вам вдалося застосувати перестановку до nрізних об'єктів, ви можете негайно вивести її ідентичність. Однак вам дозволяється застосовувати перестановку лише до nбінарних векторів, а значить, вам доведеться застосувати її кілька разів, щоб розпізнати її. Зрозуміло, що застосувати його до nвекторів лише з одним 1справляється, але якщо ви розумні, ви можете це зробити з log(n)додатками. Код цього методу буде довшим, хоча ...
Це експериментальний виклик, коли ваш бал - це поєднання довжини коду та складності запиту , тобто кількість викликів до допоміжної процедури. Специфікація трохи довга, тому потерпіть зі мною.
Завдання
Ваше завдання - написати іменовану функцію (або найближчий еквівалент), f яка приймає в якості додатного цілого числа nта перестановку pперших nцілих чисел, використовуючи індексацію на основі 0 або 1. Його вихід - перестановка 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]
Ви можете замінити "біти" будь-якими двома різними значеннями, такими як 3і -4, або, 'a'і 'b', і їх не потрібно фіксувати, тому ви можете дзвонити Pяк з тим самим, так [-4,3,3,-4]і [2,2,2,1]з тим самим викликом f. Визначення Pне зараховується до вашої оцінки.
Оцінка балів
Складність запиту вашого рішення на даний вході є числом викликів він робить для допоміжної функції P. Щоб зробити цей захід однозначним, ваше рішення повинно бути детермінованим. Ви можете використовувати псевдовипадкові генеровані числа, але тоді ви також повинні виправити початкове насіння для генератора.
У цьому сховищі ви знайдете файл, який називається, permutations.txtщо містить 505 перестановок, 5 кожної довжини від 50 до 150 включно, використовуючи індексацію на основі 0 (збільшуючи кожне число у випадку, заснованому на 1). Кожна перестановка знаходиться на своєму власному рядку, а її номери розділені пробілами. Ваш бал - це кількість байтів 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був би вектором бітів.