Ідея тут полягає у створенні майже повторюваного шаблону. Тобто, послідовність, що будується, змінюється в останній момент, щоб уникнути повторення деякої послідовності. Необхідно уникати наслідків типу AA та ABA (де B не більше A).
Приклади:
Я продовжу з початку, перерахувавши всі невеликі приклади, щоб зробити свій опис яснішим. Почнемо з 0.
Дійсно: 0 Недійсний: 00 (візерунок AA) Дійсно: 01 Недійсний: 010 (візерунок ABA) Недійсний: 011 (шаблон АА) Дійсно: 012 Дійсна: 0120 Недійсний: 0121 (шаблон ABA) Недійсний: 0122 (візерунок AA) Недійсний: 01200 (візерунок AA) Недійсний: 01201 (візерунок ABA; 01-2-01) Недійсний: 01202 (візерунок ABA) Дійсна: 01203
Тепер я твердо вірю, що 4ніколи не потрібно, хоча я не маю доказів, тому що я легко знайшов послідовності сотень символів довгими, які використовують лише 0123. (Це, мабуть, тісно пов’язано з тим, як потрібні лише три символи, щоб мати нескінченні рядки, що не мають жодного шаблону AA. На цьому є сторінка Вікіпедії .)
Введення-виведення
Введення - це єдине, додатне, ненульове ціле число n. Ви можете припустити, що n <= 1000.
Вихід - nпослідовність -характер без підзакон, що відповідають забороненому шаблону (AA або ABA).
Зразкові входи та виходи
>>> 1 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
Правила
- Допускаються лише символи
0123. - Чи не Б не довше ніж , ніж А. Це дозволяє уникнути ситуації , при якій
012345повинен бути слідують ,6тому що0123451є це:1-2345-1. Іншими словами, послідовність була б тривіальною і нецікавою. nможе бути введено будь-яким потрібним методом, крім жорсткого кодування.- Вихід може бути списком або рядком, залежно від того, що простіше.
- Без грубої сили ; час роботи повинен бути на порядку хвилин, не більше години на дійсно повільній машині, протягом
n=1000. (Це покликане дискваліфікувати рішення, які просто проходять цикл черезnвселінійні перестановки{0,1,2,3}, так що трюк та подібні трюки заборонені.) - Стандартні лазівки заборонено, як зазвичай.
- Оцінка балів у байтах. Це єкод-гольф, тому виграє найкоротший запис (можливо - див. бонус).
- Бонус: виберіть найнижчу дозволену цифру на кожному кроці. Якщо
1і3можливі варіанти для наступної цифри в послідовності, виберіть1. Відніміть 5 байт від вашої оцінки. Однак візьміть на замітку нижче.
Примітка!
Можливі тупики. Ваша програма чи функція повинні уникати цього. Ось приклад:
Пень: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102303302303302303302303302303303302303 Пень: 012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203103302303303303302303303302303303302303 Пень: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031230210320123102130120310330230330330230330230330230330230 Пень: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031230210320123102130120310330230330230330230330230330230330230330230330230
Кожну з цих послідовностей не можна більше продовжувати (без використання a 4). Але також зауважте, що між першими та другими двома є вирішальна різниця. Я заміню спільну початкову підданість на, Xщоб зробити це більш зрозумілим.
Пень: X2130120 Пень: X2130123 Пень: X320 Пень: X321301203102130
Останні дві цифри Xє 10, тому єдиним можливим вибором для наступної цифри є 2і 3. Вибір 2призводить до ситуації, коли послідовність повинна припинятися. Тут не спрацює жадібний алгоритм . (Все одно не без зворотних трекінгу.)
n, але враховуючи, що пні, які моя програма знаходить, як правило, збільшуються в середньому на 10 цифр щоразу, я дуже впевнений, що існує нескінченна послідовність. Я не впевнений, як напівжадний алгоритм можна перевірити на довільно великі послідовності. Я можу обмежити вимогу до n= 1000 і просто не турбуватися про вище n.
AAце справді тип, ABAде Bпорожньо. Це, можливо, може допомогти впорядкувати деякі рішення.
n? Якщо хтось дає евристичний напівжадливий алгоритм, як ви переконаєтесь, що він не стикається з проблемами дуже великої довжини? Загальна проблема є цікавою, і мені не вдалося знайти нічого щодо уникнення шаблону, де ми обмежуємо довжину частини шаблону. Якщо хтось може підготувати загальний рецепт, я очікую, що це найкращий підхід.