В этой задаче о префиксном коде мы узнали, что префиксные коды уникально конкатенируемы.
Это означает, что они могут быть объединены без разделителя и без двусмысленности.
Например, поскольку [1,2,45] является префиксным кодом, я могу объединить их без разделителя как такового: 1245245112145, и двусмысленности не будет.
Однако обратное не всегда верно.
Например, [3,34] не является префиксным кодом. Однако я могу сделать то же самое: 3333434334333, и двусмысленности не будет. Вам просто нужен более умный парсер.
Однако [1,11] не является однозначно конкатенируемой, потому что 1111 можно интерпретировать 5 способами.
Цель
Ваша задача - написать программу / функцию, которая принимает список строк (ASCII) в качестве входных данных и определяет, являются ли они уникально конкатенируемыми.
подробности
Дубликат считается ложным.
счет
Это код-гольф . Самое короткое решение в байтах побеждает.
Testcases
Правда:
[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]
Ответы:
05AB1E , 15 байтов
По телефону, поэтому объяснение придется последовать позже. Код:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
Занимает слишком много памяти для последнего контрольного примера, чтобы он не работал ...
источник
CJam (54 байта)
Принимает ввод в stdin как список, разделенный символом новой строки.
Онлайн демо
Если бы нам не приходилось обрабатывать дублирующиеся кодовые слова, это можно было бы сократить до 44:
Или, если у CJam есть вычитание массива, которое удаляет только один элемент из первого списка для каждого элемента во втором, это может быть 48 ...
рассечение
Это алгоритм Сардинаса-Паттерсона, но не оптимизированный. Поскольку каждый свисающий суффикс встречается не более одного раза, выполнение основного цикла столько раз, сколько символов на входе (включая разделители) гарантирует достаточность.
Обратите внимание, что мне пришлось обойти то, что, возможно, является ошибкой в интерпретаторе CJam:
Таким образом, проверка префикса сложна
1$,<=
вместо\#!
источник