Étant donné une chaîne de lettres et un ensemble de mots, affichez un ordre des mots afin qu'ils puissent être trouvés dans la chaîne en supprimant les lettres inutiles. Les mots peuvent apparaître plusieurs fois dans l'ensemble de mots. La chaîne d'entrée et tous les mots comprendront de 1 à 1 000 lettres minuscules chacune. Les lettres à supprimer peuvent apparaître à l'intérieur des mots ou entre les mots.
Votre programme ou fonction peut accepter la chaîne de lettres et les mots sous forme de listes, une chaîne ou à partir de STDIN et doit générer tous les mots dans un ordre correct en tant que sortie de liste ou de chaîne. S'il existe plusieurs solutions correctes, n'en éditez qu'une seule. S'il n'y a pas de solution correcte possible, affichez une liste vide ou une chaîne vide.
Exemples:
dogcatfrog cat frog dog
-> dog cat frog
xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd
flea antelope
->
(no solution)
C'est le golf de code. Le plus petit nombre d'octets gagne.
Edit: Expliqué que des caractères supplémentaires peuvent être à l'intérieur des mots.
cc
avantbb
mais les sousbb
-cc
chaînes et n'apparaissent qu'une seule fois et labb
sous - chaîne apparaît en premier.ccbcb
partie de la chaîne, nous sortons la sortiecc
puisbb
après avoir laissé tomber le milieuc
.Réponses:
Pyth,
2024 octetsMa première tentative sur Pyth :)
Comment ça fonctionne:
Remarques: cela prend beaucoup de temps dans le troisième exemple (
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
).la source
Pyth, 10 octets
Manifestation
Ce programme est très brutal. Il construit d'abord chaque sous-ensemble de l'entrée, puis chaque partition des sous-ensembles, puis vérifie la première qui est une réorganisation de la liste de mots. Aucune possibilité n'est gérée via des erreurs sans sortie vers stdout, ce qui est autorisé par le méta consensus. L'erreur peut être supprimée pour 2 octets supplémentaires.
Notez que pour de nombreux cas de test donnés, le programme ne se terminera pas dans un délai raisonnable.
la source
JavaScript (ES6), 119 octets
Accepte une chaîne et un tableau de mots et renvoie un tableau de mots ou
undefined
en cas d'échec. Ajoutez 2 octets si elle doit renvoyer la chaîne vide en cas d'échec (?q:``
), auquel cas cette version alternative ne fait que 120 octets et renvoie la chaîne vide en cas d'échec, et peut même enregistrer 2 octets si elle est autorisée à retourner 0 en cas d'échec:(Après avoir écrit ceci, j'ai remarqué que l'algorithme est fondamentalement le même que la réponse Pyth de @ KennyLau.)
Édition éditée: mise à jour après clarification de la question, mais est maintenant très lente sur le troisième cas de test; Je l'ai déclenché la veille au soir et ce matin, je viens de remarquer qu'il a trouvé la solution, entre 30 et 40 heures plus tard. J'étais vraiment méchant cependant et je lui ai fourni la solution (cela fonctionne mieux avec la solution inversée, qu'elle vérifiera instantanément).
la source
Java 7, 256 octets
Il devrait certainement être possible de jouer au golf plus en utilisant une approche différente, mais cela fera pour l'instant ..
Code non testé et testé:
Essayez-le ici.
Production:
la source
Groovy (44 octets)
Je ne peux pas croire que personne d'autre n'ait utilisé d'expressions rationnelles pour cela ...
Explication
/${b.join('|')}/
- Créez une expression régulière pour trouver l'un des mots d'une chaîne..findAll(...)
- Recherchez et collectez toutes les occurrences de la chaîne dans un tableau..join(" ")
- Joignez le tableau avec des espaces.Fondamentalement, s'il n'y a aucune occurrence, le tableau est vide et renvoie implicitement une chaîne vide. S'il trouve des occurrences, il renvoie un objet tableau avec les occurrences, puis l'aplatit en une chaîne.
la source