introduction
Après une journée de beuverie et de regarder la coupe du monde, vous vous asseyez pour jouer à un jeu amical de boggle. Les esprits augmentent parce que vous êtes accusé de perdre tout le temps de tout le monde avec des mots absurdes qui ne figurent même pas sur le tableau! Vous voyez peut-être double, mais vous pensez sûrement assez pour écrire un programme qui permettra de vérifier que vos mots sont bien au tableau.
Ta tâche
Ecrivez un programme, un script ou une fonction qui utilise un tableau erroné et un mot en entrée et renvoie Vrai si le mot est sur le tableau et Faux si le mot ne l’est pas.
L'entrée se présentera sous la forme de six \n
lignes délimitées. Les cinq premières lignes comprendront le tableau 5x5 et contiendront chacune cinq lettres majuscules. La sixième ligne contiendra le mot en question, également en toutes lettres majuscules.
Exemple de saisie:
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
La sortie peut être tout ce qui signifie sans ambiguïté Vrai ou Faux dans le langage de programmation de votre choix et qui respecte les conventions standard zéro, null et vide qui signifie Faux.
Exemple de sortie pour l'entrée ci-dessus:
1
Directives I / O
- L'entrée peut être lue à partir de stdin et la réponse à stdout.
Ou
- L'entrée peut être un argument de chaîne unique à une fonction et answer à la valeur de retour de cette fonction.
Règles Boggle
- Un mot est «sur le tableau» si vous pouvez le construire via un chemin composé de tuiles consécutives, adjacentes et non répétitives.
- Une tuile est considérée comme adjacente aux huit tuiles qui l’entourent (les chemins diagonaux sont autorisés). Les tuiles sur le bord du plateau sont adjacentes à seulement cinq tuiles. Les tuiles dans le coin sont adjacentes à seulement trois.
- Les lettres consécutives du mot doivent être adjacentes, la
i
th lettre du mot doit être adjacentes auxi-1
th eti+1
th. - Une lettre peut apparaître dans un mot plus d'une fois, mais vous ne pouvez pas utiliser le même carré sur le tableau d'affichage plus d'une fois par mot.
- Le site boggle en ligne wordsplay.net peut être utile si vous n'avez jamais joué au boggle auparavant, mais souhaitez avoir une idée de ces règles.
Contrairement à l'étranglement normal:
- Vous n'avez PAS à vous inquiéter du fait que le mot soit un mot anglais valide.
- Il n'y aura pas de
Qu
tuile simple. - Le mot en question peut avoir n'importe quelle longueur> 0
Exemple
Au conseil de
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
Ces mots doivent renvoyer True: FATE, DATING, STANDS, LIFTS.
Ces mots doivent renvoyer False: SADDEN, SULTANS, EXIST, SUEDE, QUEST
Ceci est un défi de code-golf, donc le code le plus court gagne!
Réponses:
GolfScript, 74 caractères
L'entrée doit être donnée sur STDIN. Imprime le nombre de chemins valides sur le tableau, c.-à-d.
0
à- pour aucun et un nombre positif (vrai) sinon.Vous pouvez tester l'exemple en ligne .
Code avec quelques commentaires:
la source
Javascript (E6) 137
160 175 190Moins de 2 * Golfscript. Victoire morale ...
Modifier la réorganisation du code golfé. Encore et encore
Ungolfed Dernière version, un peu difficile à suivre
Ungolfed Première version, devrait être plus clair
Usage
Tester
Sortie:
la source
F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
w = a.pop()
(golfé) ouw = b.pop()
(non-golfé, ligne 2)? (probablement celui - ci, je pense)a=a.pop()
lieu deb=a.pop()
...Python,
207 204203Remplacer
... (b[i]==w[0])*any ...
par... b[i]==w[0]and any ...
donne une bien meilleure performance au prix de 2 caractères.la source
0<=i<25and
J - 75 caractères
Euh, celui-ci a l'air méchant. Et même pas lié avec Golfscript! Ceci est une fonction prenant une chaîne comme unique argument. Vous pouvez utiliser n'importe quel séparateur à un caractère à condition qu'il se trouve à la fin de chaque ligne, y compris la dernière.
Une explication suit. Notez que la fonction peut être scindée en 5 parties de niveau supérieur distinctes, chacune étant séparée par
@
, nous traiterons donc chacune de ces parties séparément, de droite à gauche.(<;._2)
- Cela divise les lignes sur les caractères de nouvelle ligne / séparateur. Il utilise le caractère à la fin de la chaîne comme caractère à scinder. Nous mettons tout dans des boîtes (<
) car sinon, nous avons des problèmes de bourrage lorsque J nous renvoie le résultat.(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)
- Pour chaque lettre du mot à vérifier, créez une liste d’index dans le tableau Boggle où l’on peut trouver cette lettre.{:
est la dernière pièce fendue (le mot à vérifier) et}:
est tout sauf la dernière (le tableau Boggle).&:>
ouvre les boîtes que nous avons faites précédemment, avec le sous-produit utile de transformer}:
en un tableau 2D de caractères.=/
fait ensuite une copie de ce tableau Boggle pour chaque lettre du mot et transforme les positions en booléens selon que la lettre du tableau correspond ou non à cette lettre.((<@#:i.)5 5)
est un moyen court d'exprimer un tableau d'indices 5x5.x#:y
est convertiy
en un tableau de lax
représentation de base . (Eh bien, presque. La vérité est plus complexe, mais cela fonctionne pour nos besoins.)<@#~&,"2
- Pour la matrice booléenne résultante de chaque lettre, rassemblez tous les indices vrais correspondants."2
fait en sorte que tout fonctionne avec les bons résultats,#~&,
effectue la sélection et<@
rassemble chaque résultat dans une boîte pour préparer l'étape suivante.{
- Ce verbe, utilisé de façon monadique, s'appelle Catalogue et prend une liste de cases en argument. Il combine l'intérieur de chaque boîte de toutes les manières possibles. Ainsi, par exemple, un catalogue sur certaines boîtes contenant les chaînes "AB" et "abc" donnerait les résultats "Aa", "Ab", "Ac", "Ba", "Bb", "Bc".En exécutant ceci sur notre liste encadrée de listes d’indexes, chaque combinaison d’index est possible. Cela peut être un gros jeu si le mot est long et qu'il y a beaucoup de lettres répétées, mais aussi vide si aucune lettre ne figure au tableau. Nous notons également que nous réutilisons les carreaux dans certains de ces chemins: nous en rendrons compte plus tard.
([:*/"1^:2(2(=*)@-/\>@~.)S:1)
- Ici, nous vérifions chaque chemin pour voir s'il est valide.(...)S:1
applique le(...)
à chaque chemin et rassemble les résultats dans une liste simple. Ceci est crucial car le résultat{
est un tableau multi-dimensionnel, et nous ne nous soucions pas de la structure de ce tableau, mais de son contenu à chaque case.2(=*)@-/\>
donne un 1 si chaque coordonnée de chaque index est au plus éloignée de celle qui le suit, et 0 sinon. Le2
et le/\
sont responsables de le faire par paire.*/"1^:2
ET-logiques ceux-ci tous ensemble à la fin. La[:
partie est structurelle en J, ne vous inquiétez pas.Ajouter
@~.
à>
est un moyen astucieux d’exclure des chemins avec des entrées répétées.~.
prend les éléments uniques d'une liste, de sorte que la liste est raccourcie si elle se croise automatiquement et que les listes plus courtes sont automatiquement complétées par des 0 lorsqu'elles sont assemblées, comme la façon dont les résultats sont combinés au fur et à mesure qu'ils sortentS:
. Cela est finalement plus court que d’exclure explicitement les chemins qui se croisent.+/
- Enfin, nous ajoutons simplement tout à la fin. Le résultat est le nombre de chemins valides qui composent le mot sur le tableau, 0 signifiant aucun chemin, c'est-à-dire que ce mot n'est pas sur le tableau. Pour le coût d'un caractère, nous pouvons+./
plutôt écrire (tout mettre ensemble), ce qui donnera explicitement un booléen 1 ou 0.Voici quelques exemples de pistes. Vous pouvez obtenir l'interprète J à jsoftware.com ou essayer en ligne à tryj.tk .
la source
Prolog - 315
Je pensais que Prolog pourrait être un bon langage pour celui-ci, avec le support de retour arrière intégré, mais je suppose qu'il est plus handicapé par le besoin d'une variable pour presque chaque valeur calculée.
Testé avec GNU Prolog; devrait être conforme à ISO Prolog.
Ungolfed:
la source