Вступ
Припустимо, ви і ваш друг граєте в гру. Ваш друг думає про певну послідовність 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. Вони були згенеровані, взявши три випадкові поплавці між 0 і 1, взявши їх середнє значення a
, а потім перевернувши a
нахилену кількість монет n
. Ви набираєте середню кількість дзвінків уlen_lcs
цих послідовностях, нижчий бал - кращий. У вашому записі має бути записана кількість дзвінків Немає часових обмежень, за винятком того, що перед запуском програми слід запустити програму у файлі.
Ваше подання має бути детермінованим. PRNG дозволені, але вони повинні використовувати сьогоднішню дату 200116
(або найближчий еквівалент) як випадкове насіння. Вам не дозволяється оптимізувати ваші подання стосовно цих конкретних тестових випадків. Якщо я підозрюю, що це відбувається, я генерую нову партію.
Це не код гольфу, тому вам рекомендується писати читабельний код. Код Розетта має сторінку про найдовшу загальну послідовність ; ви можете використовувати це для втілення len_lcs
вашою мовою.
lcs
замість нього len_lcs
.
lcs(R, "01"*2*n)
повертається R
. ;) Але це може спрацювати, якщо дзвінок lcs(R, S)
збільшить бал len(S)
замість 1, або щось подібне ...