Це унікально поєднується?


10

У цьому виклику щодо коду префікса ми дізналися, що коди префіксу однозначно поєднуються.

Це означає, що їх можна з'єднати без роздільника і без неоднозначності.

Наприклад, оскільки [1,2,45] є кодом префікса, я можу з'єднати їх разом без роздільника як такого: 1245245112145, і двозначності не буде.

Однак зворотне не завжди відповідає дійсності.

Наприклад, [3,34] не є кодом префікса. Однак я можу зробити те ж саме: 3333434334333, і двозначності не буде. Вам просто знадобиться розумніший аналізатор.

Однак [1,11] не є однозначно сполучуваним, оскільки 1111 можна інтерпретувати 5 способами.

Мета

Ваше завдання полягає в тому, щоб написати програму / функцію, яка приймає список рядків (ASCII) як вхідний, і визначити, чи вони однозначно сполучуються.

Деталі

Дублікат вважається помилковим.

Оцінка балів

Це . Найкоротше рішення в байтах виграє.

Тестові шафи

Правда:

[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]

Помилковий:

[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]

Просто для того, щоб переконатися, що я правильно розумію виклик, це не є однозначно сполучувальним, якщо одна з рядків складається з будь-якої комбінації інших? Ви повинні зробити ці дані більш зрозумілими.
— Джеймс

Ви впевнені, що це не рівнозначно проблемі зупинки?
— feersum

Чи можете ви продемонструвати, чому це рівнозначно проблемі зупинки?
— Лина монашка

Я не казав, що це було, але дивувався, що це може бути. Після ще однієї думки я вважаю, що це не так.
— feersum

@feersum Ось полі-алгоритм часу для цієї проблеми: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
— isaacg

Відповіді:


5

05AB1E , 15 байт

По телефону, тому пояснення доведеться піти пізніше. Код:

gF¹N>ã})€`€JDÚQ

Використовує кодування CP-1252 . Спробуйте в Інтернеті! .

Займає занадто багато пам'яті для останнього тестового випадку, щоб це не спрацювало ...


3
Надзвичайно вражає те, що ви можете набрати це на своєму телефоні.
— Джеймс

3
@DrGreenEggsandHamDJ Минуло близько 40 хвилин ...
— Аднан

2
@Adnan Цікаво, що думає передбачувач тексту клавіатури вашого телефону про всі ці символи сміття :-)
— Луїс Мендо

1
@LuisMendo Ха-ха, це трапилося випадково, коли я надіслав другові випадкову програму 05AB1E.
— Аднан

Я здогадуюсь, що це працює, розміщуючи верхню межу по довжині найкоротшого зіткнення. Чи правий я?
— Пітер Тейлор

4

CJam (54 байти)

q_N/:A\,{_Am*:${~1$,<=},{~\,>}%La:L-}*A,A_&,-A*](\M*&!

Вводить вхід на stdin як список, розділений за новими рядками.

Демонстрація в Інтернеті

Якщо б нам не довелося обробляти дублюючі кодові слова, це може бути скорочено до 44:

q_N/\,{_W$m*:${~1$,<=},{~\,>}%La:L-}*](\M*&!

Або якщо CJam мав віднімання масиву, який видаляв лише один елемент із першого списку для кожного елемента у другому, це може бути 48 ...

Розсічення

Це алгоритм Сардінас-Паттерсона, але не оптимізований. Оскільки кожен звисаючий суфікс з’являється лише максимум одного разу, виконання основного циклу стільки разів, скільки є символів на вході (включаючи роздільники), гарантує достатню кількість.

Зауважте, що мені довелося обійти те, що, можливо, помилка в інтерпретаторі CJam:

"abc" "a" #   e# gives 0 as the index at which "a" is found
"abc" "d" #   e# gives -1 as the index at which "d" is found
"abc" ""  #   e# gives an error

Тож перевірка префікса є складною 1$,<=замість\#!

e# Take input, split, loop once per char
q_N/\,{
  e# Build the suffixes corresponding to top-of-stack and bottom-of-stack
  _W$m*
  e# Map each pair of Cartesian product to the suffix if one is the prefix of the other;
  e# otherwise remove from the array
  :${~1$,<=},{~\,>}%
  e# Filter out empty suffixes iff it's the first time round the loop
  La:L-
}*
e# If we generated an empty suffix then we've also looped enough times to generate all
e# of the keywords as suffixes corresponding to the empty fix, so do a set intersection
e# to test this condition.
](\M*&!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.