Вступ
Припустимо, вам передають випадкову перестановку 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
був би вектором бітів.