Dans ce défi sur le code préfixe , nous avons appris que les codes de préfixe sont uniquement concaténables.
Cela signifie qu'ils peuvent être réunis sans séparateur et sans ambiguïté.
Par exemple, puisque [1,2,45] est un code préfixe, je peux les joindre ensemble sans séparateur en tant que tel: 1245245112145, et il n'y aura aucune ambiguïté.
Cependant, l'inverse n'est pas toujours vrai.
Par exemple, [3,34] n'est pas un code de préfixe. Cependant, je peux faire la même chose: 3333434334333, et il n'y aura aucune ambiguïté. Vous auriez juste besoin d'un analyseur plus intelligent.
Cependant, [1,11] n'est pas uniquement concaténable, car 1111 peut être interprété de 5 manières.
Objectif
Votre tâche consiste à écrire un programme / une fonction qui prend en entrée une liste de chaînes (ASCII) et à déterminer si elles sont uniquement concaténables.
Détails
Le double compte comme faux.
Notation
C'est du code-golf . La solution la plus courte en octets gagne.
Cas de test
Vrai:
[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]
Faux:
[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]
Réponses:
05AB1E , 15 octets
Au téléphone, l'explication devra suivre plus tard. Code:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
Prend trop de mémoire pour le dernier cas de test, donc cela pourrait ne pas fonctionner ...
la source
CJam (54 octets)
Prend l'entrée sur stdin en tant que liste séparée par des sauts de ligne.
Démo en ligne
Si nous n'avions pas à gérer les mots de code en double, cela pourrait être raccourci à 44:
Ou si CJam avait une soustraction de tableau qui ne supprimait qu'un seul élément de la première liste pour chaque élément de la seconde, ce pourrait être 48 ...
Dissection
Il s'agit de l' algorithme Sardinas-Patterson mais désoptimisé. Étant donné que chaque suffixe pendant ne s'affiche qu'une seule fois, l'exécution de la boucle principale autant de fois qu'il y a de caractères dans l'entrée (y compris les séparateurs) garantit qu'elle est suffisante.
Notez que j'ai dû contourner ce qui est sans doute un bogue dans l'interpréteur CJam:
La vérification du préfixe est donc compliquée au
1$,<=
lieu de\#!
la source