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


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.