Вступление
Предположим, вы и ваш друг играете в игру. Ваш друг думает о какой-то определенной последовательности nбитов, а ваша задача - определить последовательность, задав им вопросы. Тем не менее, единственный тип вопроса, который вам разрешено задавать, это «Какова самая длинная общая подпоследовательность вашей последовательности и S», где S- любая последовательность битов. Чем меньше вопросов вам нужно, тем лучше.
Задание
Ваша задача - написать программу или функцию, которая принимает в качестве входных данных положительное целое число nи двоичную последовательность Rдлины n. Последовательность может быть массивом целых чисел, строкой или другим разумным типом по вашему выбору. Ваша программа должна вывести последовательность R.
Ваша программа не имеет права доступа к последовательности Rнапрямую. Только , что это разрешено сделать , Rэто дать ему в качестве входных данных для функции len_lcsнаряду с другой двоичной последовательностью S. Функция len_lcs(R, S)возвращает длину самой длинной общей подпоследовательности Rи S. Это означает самую длинную последовательность битов, которая встречается как (не обязательно непрерывная) подпоследовательность в обоих Rи S. Входы len_lcsкоторых могут быть разной длины. Программа должна вызывать эту функцию Rи другие последовательности некоторое количество раз, а затем восстанавливать последовательность Rна основе этой информации.
пример
Рассмотрим входы n = 4и R = "1010". Во-первых, мы можем оценить len_lcs(R, "110"), что дает 3, так как "110"это самая длинная общая подпоследовательность "1010"и "110". Тогда мы знаем, что Rполучается "110"путем вставки одного бита в какую-то позицию. Далее мы могли бы попытаться len_lcs(R, "0110"), который возвращает, 3так как самые длинные общие подпоследовательности "110"и "010", следовательно "0110", не верны. Затем мы пытаемся len_lcs(R, "1010"), который возвращается 4. Теперь мы знаем это R == "1010", поэтому мы можем вернуть эту последовательность как правильный вывод. Это потребовало 3 звонка len_lcs.
Правила и оценки
В этом репозитории вы найдете файл, subsequence_data.txtсодержащий 100 случайных двоичных последовательностей длиной от 75 до 124. Они были сгенерированы путем трех случайных операций aс aплавающей запятой в диапазоне от 0 до 1, взяв их среднее значение как , а затем перевернув смещенное nвремя монеты . Вы набираете среднее количество обращений кlen_lcs этим последовательностям, при этом более низкий балл. Ваша заявка должна записать количество звонков. Ограничений по времени нет, за исключением того, что вы должны запустить свою программу в файле перед отправкой.
Ваше представление должно быть детерминированным. ГСЧ разрешены, но они должны использовать текущую дату 200116(или ближайший эквивалент) в качестве случайного начального числа. Вам не разрешено оптимизировать свою работу в соответствии с этими конкретными тестовыми примерами. Если я подозреваю, что это происходит, я создам новую партию.
Это не кодовый гольф, поэтому рекомендуется писать читаемый код. У кода Розетты есть страница с самой длинной общей подпоследовательностью ; Вы можете использовать это для реализации len_lcsна своем языке по вашему выбору.
lcsвместо того, чтобы получить доступ к ней len_lcs.
lcs(R, "01"*2*n)возвращается R. ;) Но это может сработать, если колл lcs(R, S)увеличит счет len(S)вместо 1, или что-то в этом роде ...