En théorie de l'information, un "code de préfixe" est un dictionnaire dans lequel aucune des clés n'est un préfixe d'un autre. En d'autres termes, cela signifie qu'aucune des chaînes ne commence par aucune des autres.
Par exemple, {"9", "55"}
est un code de préfixe, mais {"5", "9", "55"}
n'est pas.
Le principal avantage de ceci est que le texte encodé peut être écrit sans séparateur entre eux et qu'il sera toujours déchiffrable de manière unique. Cela apparaît dans des algorithmes de compression tels que le codage de Huffman , qui génère toujours le code de préfixe optimal.
Votre tâche est simple: à partir d’une liste de chaînes, déterminez s’il s’agit ou non d’un code de préfixe valide.
Votre contribution:
Sera une liste de chaînes dans un format raisonnable .
Ne contiendra que des chaînes ASCII imprimables.
Ne contiendra aucune chaîne vide.
Votre sortie sera une valeur de vérité / falsey : vérité si c'est un code de préfixe valide, et falsey si ce n'est pas le cas.
Voici quelques cas de test réels:
["Hello", "World"]
["Code", "Golf", "Is", "Cool"]
["1", "2", "3", "4", "5"]
["This", "test", "case", "is", "true"]
["111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011",
"0110", "11001", "00110", "10011", "11000", "00111", "10010"]
Voici quelques cas de test faux:
["4", "42"]
["1", "2", "3", "34"]
["This", "test", "case", "is", "false", "t"]
["He", "said", "Hello"]
["0", "00", "00001"]
["Duplicate", "Duplicate", "Keys", "Keys"]
C'est du code-golf, donc les échappatoires standard s'appliquent, et la réponse la plus courte en octets est gagnante.
la source
001
être uniquement déchiffrable? Ce pourrait être l'un00, 1
ou l' autre0, 11
.0, 00, 1, 11
toutes les clés, il ne s'agit pas d'un préfixe-code, car 0 correspond au préfixe 00 et 1 au préfixe 11. Un code de préfixe indique qu'aucune des clés ne commence par une autre clé. Ainsi, par exemple, si vos clés sont,0, 10, 11
il s’agit d’un code de préfixe et uniquement déchiffrable.001
n'est pas un message valide, mais0011
ou0010
sont uniquement déchiffrable.Réponses:
Pyth, 8 octets
Suite de tests
Prenez les 2 permutations d'éléments de l'entrée, mappez chacune sur l'index d'une chaîne dans l'autre (0 pour un préfixe) et indiquez si tous les résultats sont vrais (non nuls).
la source
Haskell, 37 octets
Chaque élément
x
del
est répété une fois pour chaque élément dont il s'agit d'un préfixe, ce qui correspond exactement à une liste pour une liste sans préfixe, ce qui donne la liste d'origine. La propriété de préfixe est vérifiée en zippant les deux listes avecx
, ce qui coupe les éléments au-delà dex
.la source
Java,
128127126125124121 121 octets(Merci @Kenny Lau, @Maltysen, @Patrick Roberts, @Joba)
Ungolfed
Sortie
la source
&
travaillerait au lieu de&&
?int
et renvoyer0
et1
? Cela permettrait d'économiser plusieurs octets. Aussi j'oublie si cela est valable en Java mais si vous déclarezi
,j
et à l'l
intérieur de l'extérieurfor
boucle qui sauverait un octet d'un moins - virgule.indexOf(a[i])==0
auquel cas il n'y aurait pas d'économies.Python 2, 48
51octetsPour chaque élément
a
del
, la fonctiona.find
trouve l'index de la première occurrence dea
dans la chaîne d'entrée, donnant-1
une absence. Donc,0
indique un préfixe. Dans une liste sans préfixe, le mappage cette fonction retourne une seule0
poura
lui - même. La fonction vérifie que c'est le cas pour tousa
.51 octets:
Remplacez-le
~
par un caractère de code ASCII 128 ou supérieur.Pour chaque élément
a
dansl
une copie est incluse pour chaque élément qui est un préfixe de celui - ci. Pour une liste sans préfixe, le seul élément de ce type esta
lui - même, ce qui donne la liste d'origine.la source
CJam, 14 octets
Suite de tests.
Explication
la source
JavaScript ES6,
654340 octetsMa solution précédente, qui traitait les tableaux de chaînes de tous les caractères UTF-8:
J'ai pu éviter
JSON.stringify
car le défi spécifie uniquement les caractères ASCII imprimables.Tester
la source
Haskell, 49 octets
Cela a deux parties:
Si les deux listes sont égales, un élément n'est que son préfixe et est valide.
la source
Retina , 19 octets
Le nombre d'octets suppose un codage ISO 8859-1.
L'entrée doit être séparée par saut de ligne. La sortie est
0
pour la fausseté et1
pour la vérité.Essayez-le en ligne! (Légèrement modifié pour prendre en charge plusieurs scénarios de test séparés par des espaces.)
Explication
Triez les lignes dans l'entrée. Si un préfixe existe, il se terminera directement devant une chaîne qui le contient.
Essayez de faire correspondre (
M
) une ligne complète qui se trouve également au début de la ligne suivante. Lem
mode multiligne activé^
correspond aux débuts de ligne et1
garantit que nous comptons au plus une correspondance telle que la sortie soit0
ou1
.Pour échanger
0
et1
dans le résultat, nous comptons le nombre de0
s.la source
Java, 97 octets
Utilise la plupart des astuces trouvées dans la réponse de @ Marv , mais utilise également l'égalité de la boucle foreach et de la référence de chaîne.
Non minée:
Notez que, comme je l’ai dit, cela utilise une égalité de référence de chaîne. Cela signifie que le code peut se comporter étrangement en raison de l' internalisation de chaîne . Le code fonctionne lorsque vous utilisez des arguments transmis à partir de la ligne de commande, ainsi que lorsqu’un élément lu à partir de la ligne de commande est utilisé. Si vous souhaitez coder en dur les valeurs à tester, vous devrez cependant appeler manuellement le constructeur String pour que l'internement ne se produise pas:
la source
PostgreSQL,
186, 173 octetsSortie:
Pas de démo en direct cette fois. http://sqlfiddle.com ne prend en charge que la version 9.3 et pour exécuter cette démonstration, la version 9.4 est requise.
Comment ça marche:
y
LEFT OUTER JOIN
vers la même table dérivée basée sur le mêmei
(id), mais avec desoridinal
noms différents commençant par préfixey.z LIKE u.z||'%'
c
(tableau initial) et utiliser laEVERY
fonction de regroupement. Si chaque ligne de la deuxième tableIS NULL
signifie qu’il n’ya pas de préfixe.Entrée si quelqu'un est intéressé:
MODIFIER:
SQL Server 2016+
la mise en oeuvre:LiveDemo
Note: C'est une liste séparée par des virgules, pas un vrai tableau. Mais l’idée principale est la même que dans
PostgreSQL
.EDIT 2:
En fait,
WITH ORDINALITY
pourrait être remplacé:SqlFiddleDemo
la source
Brachylog , 8 octets
Essayez-le en ligne!
Sorties via prédicat succès / échec. Prend plus de 60 secondes sur le dernier cas de test truthy
["111","010","000","1101","1010","1000","0111","0010","1011","0110","11001","00110","10011","11000","00111","10010"]
mais passe rapidement avec un octet supplémentaire qui élimine un grand nombre de possibilités plus tôt que le programme ne les (Ċ
avant de vérifier les permutations plutôt queᵈ
après les permutations de contrôle, afin de limiter la longueur de la sous - liste à deux).Moins trivial 9 octets variantes que
¬(⊇Ċpa₀ᵈ)
qui fonctionnent dans des délais raisonnables sont¬(⊇o₁a₀ᵈ)
,¬(⊇o↔a₀ᵈ)
et¬(⊇oa₀ᵈ¹)
.la source
Perl 6 , 24 octets
Essayez-le en ligne!
Wow, étonnamment court tout en utilisant un long intégré.
Explication
la source
Raquette, 70 octets
la source
Python,
58 à55 octetsla source
a.index(b)==0
est un peu plus court. Alternativement, vous pourriez faire0**sum(a.index(b)for a in l for b in l)
.index
lève une exception quandb
est introuvable. Et parce que ça devrait l'être==
, non>=
. Cependant,find
fonctionne. (Et c'est plus court aussi!)find
. Cerveau endormi est somnolent. La deuxième version devrait également fonctionner avecfind
.len(l)
est que puisque nous parcourons tous lesb
sa
, il y aura toujours au moins un match par matcha
. Nous vérifions donc si le nombre de correspondances est le même que le nombre d'éléments.JavaScript (ES6), 52
54Éditez 2 octets enregistrés thx @Neil
Tester
la source
!w.indexOf(v)
?Mathematica
75 6968 octetsLoquace comme d'habitude. Mais Martin B a pu réduire le code de 7 octets.
Méthode 1: stockage de la sortie dans un
Array
(68 octets)
Méthode 2: stockage de la sortie dans un
List
(69 octets)
la source
a~Drop~{#}~StringStartsQ~a[[#]]
affaire. VousArray
devriez aussi économiser quelques octetsLength
, surtout parce que cela vous permettra d’utiliserJoin@@
plutôt que deFlatten@
(à condition que vous n’utilisiezFlatten
que pour un seul niveau).Array
plus tard.Mathematica, 41 octets
la source
APL (Dyalog Unicode) , SBCS 13 octets
-2 octets:
Essayez-le en ligne!
Explication:
la source
~2∊+\⊃¨∘.⍷⍨⎕
J , 17 octets
Essayez-le en ligne!
Note: En fait, j’ai écrit ceci avant de regarder la réponse de l’APL pour l’aborder sans parti pris. Il s'avère que les approches sont presque identiques, ce qui est intéressant. Je suppose que c’est la solution naturelle de "matrice de tableaux"
Prenez une entrée en boîte car les chaînes sont de longueur inégale.
Créez une table
/~
de fonctions propres de chaque élément associé à chaque élément et voyez s'il y a une correspondance au début{.@E.
. Cela produira une matrice de 1-0 résultats.1#.1#.
Faites la somme deux fois pour obtenir un nombre unique représentant "toutes les unités de la matrice" et voyez si ce nombre est identique à la longueur de l'entrée#=
. Si c'est le cas, les seules correspondances de préfixe sont des correspondances automatiques, c'est-à-dire que nous avons un code de préfixe.solution de tri, 18 octets
Tentative d'approche différente. Cette solution trie et examine les paires adjacentes.
Essayez-le en ligne!
la source
R , 48 octets
Essayez-le en ligne!
Explanation:
outer(s,s,startsWith)
génère une matrice de logiques en vérifiant s'ils[i]
s'agit ou non d'un préfixes[j]
. Sis
est un code de préfixe, alors il y a exactement deslength(s)
éléments VRAI dans le résultat, correspondant aux éléments diagonaux (s[i]
est un préfixe de lui-même).la source
function(s)all(colSums(outer(s,s,startsWith))<2)
mais il reste questartsWith
c'est une fonction que je ne connaissais pas! Belle trouvaille.TRUE
etFALSE
...==
par>
. :-))Pyth -
1312 octetsEssayez-le en ligne ici .
la source
Ruby, 48 octets
Utilise les arguments comme entrée et stdout comme sortie.
la source
Scala, 71 octets
la source
Raquette 130 octets
Ungolfed:
Essai:
Sortie:
la source
C (gcc) , 93 octets
Essayez-le en ligne!
Double simple pour la boucle en utilisant
strstr(a,b)==a
pour vérifier les préfices. Principalement ajouté puisqu'il ne semble pas encore y avoir de réponse en C.la source
05AB1E , 13 octets
Trop long .. Au départ, j’avais une solution de 9 octets, mais elle a échoué pour le scénario de test de clé dupliqué.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Japt , 8 octets
L'essayer
la source
C # (compilateur interactif Visual C #) , 70 octets
Essayez-le en ligne!
la source
Stax , 6 octets
Exécuter et déboguer
Cela produit non-zéro pour la vérité.
L'idée générale est de considérer chaque paire de chaînes de l'entrée. Si l'indice de sous-chaîne de l'un dans l'autre est égal à zéro, il ne s'agit pas d'un code de préfixe valide. En stax, l'index d'une sous-chaîne non existante donne
-1
. De cette façon, tous les index de sous-chaîne par paire peuvent être multipliés ensemble.Il s’agit du même algorithme que la solution pyth d’isaacg, mais je l’ai développé indépendamment.
la source