À partir d'une liste de chaînes, recherchez la plus petite matrice carrée qui contient chacune des chaînes initiales. Les chaînes peuvent apparaître horizontalement, verticalement ou en diagonale et en avant ou en arrière comme dans cette question Puzzle de recherche de mots .
Les mots doivent être placés dans le carré, avec au moins un mot dans chaque direction (horizontal, vertical et diagonal). Les mots ne doivent apparaître qu'une seule fois.
Ainsi, l'entrée n'est qu'une liste de mots. Par exemple: CAT, TRAIN, CUBE, BICYCLE
. Une solution possible est:
B N * * * * *
* I * * C A T
* A C * * * *
* R * Y * * C
* T * * C * U
* * * * * L B
* * * * * * E
J'ai remplacé les lettres de remplissage par des astérisques juste pour plus de clarté. La sortie souhaitée doit inclure des lettres de remplissage aléatoires.
AC
dans votre exemple en ferait une autreCAT
si elle l'estT
.A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
n'a pas de solution.Réponses:
JavaScript (ES6), 595
628 680Modifier certains nettoyage et fusion:
- fonction P fusionnée à l'intérieur de la fonction R
- calc x et z dans le même .map
- lorsque la solution est trouvée, définissez x sur 0 pour quitter la boucle externe
- fusion définie et appel de W
Modifier2 plus de golf, remplissage aléatoire raccourci, boucle externe révisée ... voir l'historique pour quelque chose de plus lisible
Contrairement à la réponse acceptée,cela devrait fonctionner pour la plupart des entrées. Évitez simplement les mots d'une seule lettre. Si une sortie est trouvée, elle est optimale et utilise les 3 directions.La contrainte d'éviter de répéter des mots est très difficile. J'ai dû chercher un mot répétitif à chaque étape en ajoutant un mot à la grille et à chaque caractère de remplissage aléatoire.
Sous-fonctions principales:
P (w) vrai si mot palindrome. Un mot palindrom sera trouvé deux fois lors de la vérification des mots répétés.
R (s) vérifier les mots qui se répètent sur la grille s
Q (s) remplit la grille s avec des caractères aléatoires - c'est récursif et retour arrière en cas de répétition de mot - et peut échouer.
W () récursif, essayez de remplir une grille de taille donnée, si possible.
La fonction principale utilise W () pour trouver une grille de sortie, en essayant de la taille du mot le plus long en entrée jusqu'à la somme de la longueur de tous les mots.
Non golfé et expliqué (incomplet, désolé les gars c'est beaucoup de travail)
Test dans la console Firefox / FireBug
F ([«TRAIN», «CUBE», «BOX», «BICYCLE»])
non-rempli
F (['TRAIN', 'ARTS', 'RAT', 'CUBE', 'BOX', 'BICYCLE', 'STORM', 'BRAIN', 'DEPTH', 'MOUTH', 'SLAB'])
F ([«AA», «AB», «AC», «AD», «AE», «AF», «AG»])
F ([«AA», «AB», «AC», «AD», «AE», «AF»])
sortie non remplie - @nathan: maintenant vous ne pouvez pas ajouter un autre A x sans répétitions. Vous aurez besoin d'une plus grande grille.
la source
C #
Voici une implémentation simple avec encore du travail à faire. Il existe de très nombreuses combinaisons pour obtenir la plus petite taille. Donc, juste utilisé l'algorithme le plus simple pourrait penser.
Tester
la source
at least one word in each direction (horizontal, vertical and diagonal)
. Exécution du programme de test, pas de mot horizontal (3 verticaux, 1 diag)