Étant donné un fichier de dictionnaire (un fichier texte contenant un mot ou une phrase sur chaque ligne, avec une ponctuation possible mais pas de chiffres; les lignes sont alphabétisées), vous devez sortir chaque combinaison de mots où une lettre peut être supprimée d'un mot pour en faire une autre; la lettre supprimée doit être placée entre parenthèses.
Par exemple, l'entrée
cat
cart
code
golf
ode
verify
versify
devrait donner une sortie de
ca(r)t
(c)ode
ver(s)ify
Plusieurs façons d'obtenir la même paire ne doivent être affichées qu'une seule fois. Vous pouvez sortir scra(p)ped
ou scrap(p)ed
, mais pas les deux.
La sortie doit être classée par ordre alphabétique par l'entrée la plus longue;
mart
mar
mat
ma
devrait avoir une sortie de
ma(r)
ma(t)
ma(r)t
mar(t)
et les deux derniers pourraient être dans l'un ou l'autre ordre.
Le fichier de dictionnaire peut inclure des majuscules, des espaces, des tirets ou des apostrophes; ceux-ci doivent être ignorés. Par exemple,
inlay
in-play
devrait produire in(p)lay
. Votre sortie doit être dans le même cas. Des espaces supplémentaires sont autorisés.
L'entrée peut être STDIN ou à partir d'un fichier; il est séparé par des retours à la ligne. La sortie peut être la valeur de retour d'une fonction ou STDOUT (ou écrite dans un fichier si vous le souhaitez).
Il s'agit de code-golf , donc le code le plus court en octets l'emporte.
(C'est mon premier défi sur PPCG - faites-moi savoir si j'ai fait quelque chose de mal et je le corrigerai.)
mart mar mat ma
? Serait-cemar(t) ma(r)t ma(r) ma(t)
?Réponses:
Perl -an0, 101 + 3 octets
où
@F
est le dictionnaire, stocké dans un tableau, fourni par la magie du drapeau d'exécution. (b-oost, BoO # @% @ # $% $ # @ T)map{s/\W//g;lc}@F
supprime tous les symboles des mots et transforme tout en minuscules. (boost, boot)sort{length$b<=>length$a}
trie sur la longueur. (démarrage, boost)map{ (...) while/(.)(?!\1)/g}@F
correspond à tous les caractères qui ne sont pas suivis par le même caractère ([b] oot, bo [o] t, boo [t], ...)print"$`($1)$'\n"
imprime les parties qui précèdent, mettent entre parenthèses et réussissent une correspondance ... (boo (s) t)if $`.$'~~@F
... si la concaténation de tout avant et après le match est dans le dictionnaire. ([renforcer])la source
JavaScript (ES6), 225
Une fonction avec un paramètre de chaîne, aucune entrée du fichier. J'ai demandé à OP si cela pouvait être valable.
Testez l'exécution de l'extrait dans un navigateur compatible EcmaScript 6 (implémentation des fonctions fléchées, chaîne de modèle, opérateur de propagation - Firefox, peut-être Safari ou MS Edge, pas Chrome)
la source
Rubis, 173
Testez-le ici: http://ideone.com/86avbe
Version lisible ici: http://ideone.com/ynFItB
la source
['jacklantern','jackslantern','jack-o-lantern']
dict.The output should be ordered by the longer entry;
...and the latter two could be in either order.
Rubis, 211
J'ai décidé d'adopter une approche différente pour résoudre ce problème, en utilisant l'expression régulière.
la source
Perl 5, 210
Le code charge l'entrée dans un tableau trié et vérifie chaque valeur par rapport à toutes les valeurs du tableau qui ont 1 octet de plus.
Tester
la source
Haskell, 201 octets
Je ne sais pas quel format d'entrée est autorisé.
f
prend une liste de chaînes. Si une seule chaîne (avec nl mots séparés) est autorisée, ajoutez.lines
àf
(+6 octets).Exemple d'utilisation:
Comment ça marche: mettez chaque mot en minuscule et ne gardez que les lettres. Divisez chaque mot
x
en deux parties à chaque position possible et faites des triplets(i,j,k)
où sei
trouve la première partie,j
le premier caractère de la deuxième partie etk
la queue de la deuxième partie. Gardez les triplets oùi++k
apparaît également dans la liste de mots. Si cette liste n'est pas vide, prenez le premier élément, appelez-le(l,m,n)
. Transformez toutes ces têtes de liste dans le format de sortie requis en entourantm
avec()
et en le plaçant entrel
etn
.la source