Відстань Хеммінга між двома струнами однакової довжини - це кількість позицій, на яких відповідні символи різні.
Дозвольте P
бути двійковим рядком довжини n
і T
бути двійковим рядком довжини 2n-1
. Ми можемо обчислити n
відстані Хеммінга між підрядками P
і n
довжиною кожної довжини, T
щоб перейти зліва направо і скласти їх у масив (або список).
Приклад послідовності дистанції Хеммінга
Нехай P = 101
і T = 01100
. Послідовність відстаней Хеммінга, яку ви отримуєте від цієї пари, становить 2,2,1
.
Визначення близькості
Тепер розглянемо дві такі послідовності відстаней Хеммінга. Скажіть x = (0, 2, 2, 3, 0)
і y = (2, 1, 4, 4, 2)
як приклади. Ми це кажемо x
і y
є, close
якщо y <= x <= 2*y
чи якщо x <= y <= 2*x
. Тут скалярне множення та нерівність взяті елементарно. Тобто для двох послідовностей A
і B
, A <= B iff A[i] <= B[i]
за всіма показниками i
.
Зауважимо, що послідовності відстаней Хеммінга утворюють частковий порядок при такому способі їх порівняння. Іншими словами, багато пар послідовностей не є ні більшими, ні рівними, ні меншими або рівними один одному. Наприклад (1,2)
і (2,1)
.
Отже, використовуючи приклад вище, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
але (0, 2, 2, 3, 0)
не більший за (2, 1, 4, 4, 2)
. Також (2, 1, 4, 4, 2)
не менше або дорівнює 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. В результаті x
і y
не наближаються один до одного.
Завдання
Для збільшення n
починаючи з початку n=1
, розглянемо всі можливі пари двійкових рядків P
довжини n
та T
довжини 2n-1
. Є 2^(n+2n-1)
такі пари і, отже, багато послідовностей дистанцій Хеммінга. Однак багато з цих послідовностей будуть ідентичними. Завдання полягає в тому, щоб знайти розмір найбільшого набору послідовностей дистанцій Хеммінга, щоб жодна дві послідовності не були близькими одна до одної.
Ваш код повинен виводити одне число на значення n
.
Оцінка
Ваш результат загалом відповідає найвищому n
коду, який ви досягаєте на моїй машині за 5 хвилин (але читайте далі). Час призначений для загального часу роботи, а не часу лише для цього n
.
Для того, щоб дати бали за неоптимальні відповіді, оскільки знайти оптимальні відповіді, ймовірно, буде важко, нам знадобиться трохи тонка система балів. Ваш бал - це найвище значення, n
за яке ніхто більше не опублікував більш правильну відповідь будь-якого розміру, меншого, ніж рівний цьому. Наприклад, якщо ви виходите, 2, 4, 21
а хтось інший виходить, 2, 5, 15
ви б набрали результат лише тоді, 1
коли хтось має кращу відповідь n = 2
. Якщо ви виходите з 2, 5, 21
цього результату, ви б оцінювали 3
незалежно від того, що хтось ще виводить, тому що всі відповіді оптимальні. Зрозуміло, що якщо у вас є всі оптимальні відповіді, ви отримаєте бал за найвищу n
посаду. Однак, навіть якщо ваша відповідь не є оптимальною, ви все одно можете отримати бал, якщо ніхто більше не може його перемогти.
Приклад відповідей та відпрацьований приклад
(Ця відповідь поки не перевірена. Незалежна перевірка буде вдячна.)
Завдяки ETHproductions:
- n = 1 дає 2.
- n = 2 дає 5.
- n = 3 дає 21.
Розглянемо n = 2
докладніше. У цьому випадку повний перелік послідовностей дистанцій Хеммінга (представлений тут кортежами):
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Ми можемо бачити, що (0,0)
це не близько до жодного іншого кортежу. Справді , якщо ми візьмемо (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
то жоден з цих кортежів не близькі до якої - небудь з інших. Це дає бал 5
за n = 2
.
Для n = 3
отримання повного списку різних послідовностей відстані Хеммінга є:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
З цих 48
послідовностей ми можемо вибрати набір розмірів, 21
щоб жодна пара в цьому наборі не була близько одна до одної.
Мови та бібліотеки
Ви можете використовувати будь-яку доступну мову та бібліотеки, які вам подобаються. Там, де це можливо, було б добре запустити свій код, тому, будь-ласка, включіть повне пояснення, як запустити / скомпілювати свій код в Linux, якщо це можливо.
Моя машина Часи синхронізації будуть працювати на моїй 64-розрядної машини. Це стандартна установка ubuntu з 8 ГБ оперативної пам’яті, AMD FX-8350 восьмиядерний процесор та Radeon HD 4250. Це також означає, що мені потрібно мати можливість запускати ваш код.
Провідна відповідь
- Оцінка 4 для 2, 5, 21, 83, 361 Крістіан Сіверс. C ++
- Оцінка 5 за 2, 5, 21, 83, 372 від fəˈnɛtɪk. Javascript