Considérez la liste de mots triée alphabétiquement suivante:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Tous les mots commencent par b
et les 5 premiers commencent par bal
. Si nous regardons simplement les 2 premiers mots:
balderdash
ballet
on pourrait plutôt écrire:
balderdash
+let
où le ' '
est utilisé lorsqu'un mot partage un préfixe avec le mot précédent; sauf pour le '+'
caractère qui indique le DERNIER caractère où le deuxième mot partage un préfixe avec le mot précédent.
Il s'agit d'une sorte de visualisation «trie» : le parent est « bal
», et a 2 descendants: 'derdash'
et 'let'
.
Avec une liste plus longue, comme:
balderdash
ballet
brooding
nous pouvons en outre utiliser le caractère pipe '|'
pour préciser où se termine le préfixe partagé, comme suit:
balderdash
| +let
+rooding
et l'arbre équivalent aurait une racine d' 'b'
avoir deux enfants: le sous-arbre ayant racine 'al'
et et ses deux enfants 'derdash'
et 'let'
; et 'rooding'
.
Si nous appliquons cette stratégie à notre liste d'origine,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
nous obtenons une sortie qui ressemble à:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Si deux mots consécutifs de la liste n'ont pas de préfixe partagé, aucun caractère spécial n'est substitué; par exemple pour la liste:
broom
brood
crude
crumb
nous voulons la sortie:
broom
+d
crude
+mb
Contribution
Les mots dans l'entrée ne seront composés que de caractères alphanumériques (pas d'espaces ni de ponctuation); cela peut prendre la forme d'une liste de chaînes, d'une seule chaîne ou de toute autre approche raisonnable, tant que vous spécifiez le format choisi. Deux mots consécutifs ne seront pas identiques. La liste sera triée par ordre alphabétique.
Sortie
Votre sortie peut contenir des espaces de fin par ligne ou au total, mais aucun espace de début. Une liste de chaînes ou similaires serait également acceptable.
C'est du code-golf ; le code le plus court dans chaque langue conserve des droits de vantardise. Les interdictions habituelles contre les échappatoires s'appliquent.
Cas de test
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
aprèsballoon
. À quelle sortie devrions-nous nous attendre?+
sous le premiero
, mais je n'ai pas écrit le défi donc je ne suis pas certain.Réponses:
Retina 0.8.2 ,
5857 octetsEssayez-le en ligne! Le lien comprend un cas de test. Edit: sauvé 1 octet grâce à @FryAmTheEggman soulignant que j'ai négligé un passage de
\b
à^
rendu possible par lem)
. Explication:Activez par ligne
^
pour l'ensemble du programme.Pour chaque mot, essayez de faire correspondre autant que possible le début du mot précédent. Remplacez la correspondance par des espaces, sauf le dernier caractère, qui devient a
+
.Remplacez à plusieurs reprises tous les espaces immédiatement au-dessus de
+
s ou|
s par|
s.la source
m)
spécifiquement pour pouvoir le faire, donc je suis ennuyé d'avoir raté une instance.JavaScript (ES6), 128 octets
Attend et renvoie une liste de listes de personnages.
Essayez-le en ligne!
Comment?
Les espaces et
+
les inscriptions peuvent être insérés en parcourant le premier au dernier mot dans l'ordre, mais|
les inscriptions ne peuvent être insérées a posteriori qu'une fois+
a identifié. Cela pourrait être réalisé en faisant deux passes distinctes, mais à la place, nous enregistrons un pointeur sur chaque entrée modifiéea[~y]
afin de pouvoir la mettre à jour plus tard dans la mêmemap()
boucle.En théorie, une solution de contournement plus simple consisterait à parcourir les mots dans l'ordre inverse et à inverser également la sortie à la fin du processus. Mais c'est un peu cher dans JS et je n'ai pas trouvé de moyen d'obtenir une version plus courte avec cette méthode.
la source
JavaScript (Node.js) ,
125122118117 octetsEssayez-le en ligne!
la source
Python,
263260octets- 3 octets grâce à Jonathan Frech
Code:
Essayez-le en ligne!
Explication:
Cette solution crée un trie à partir des mots d'entrée et les analyse récursivement dans la sortie requise. La fonction a prend un tri t et une chaîne s et ajoute x à t. Les essais sont implémentés en tant que dictionnaires imbriqués. Chaque dictionnaire représente un nœud dans le trie. Par exemple, le dictionnaire représentant le trie généré par le premier cas de test ressemble à ceci:
La fonction p revient dans cette structure et génère la représentation sous forme de chaîne du trie attendue par le défi. La fonction f prend un tas de chaînes comme arguments, les ajoute toutes à un trie avec a, puis retourne le résultat de l'appel de p sur le trie.
la source
C (gcc) ,
165155octetsPrend trois arguments:
char** a
: un tableau de mots se terminant par nullchar* m
: un tableau de la longueur de chaque motint n
: le nombre de mots du tableauEssayez-le en ligne!
la source
++i<n&j<m[i]&a[i--]
un comportement indéfini? Puis-je compter sur gcc pour l'évaluer de gauche à droite?Perl 6 ,
149 144 144142 octetsEssayez-le en ligne!
Je suis sûr que cela peut être joué un peu plus, d'autant plus que je ne suis pas un expert des regexes. Cela utilise à peu près le même processus que la réponse de Neil sur la rétine .
la source
Python 2 , 191 octets
Essayez-le en ligne!
la source
Rubis , 118 octets
Essayez-le en ligne!
Accepte un tableau de chaînes, sorties en modifiant le tableau d'entrée d'origine sur place.
Explication
La transformation de chaîne de base n'est pas trop complexe, mais pour insérer correctement les tuyaux verticaux, nous devons itérer dans l'ordre inverse, et puisque la
reverse
méthode est assez verbeuse, nous le ferons d'une manière plus délicate. Ici, nous utilisonsmap
juste pour exécuter la boucle, laisser le premier mot seul, puis itérer à partir de la fin en utilisant des indices négatifs:la source