Вступление
Предположим, вы и ваш друг играете в игру. Ваш друг думает о какой-то определенной последовательности 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, или что-то в этом роде ...