Étant donné un texte rectangulaire comme puzzle de recherche de mots et une chaîne de recherche, déterminez si le texte contient la chaîne de recherche. La chaîne de recherche peut apparaître:
- horizontalement, verticalement ou en diagonale
- en avant ou en arrière
Vous pouvez écrire une fonction ou un programme et prendre deux chaînes en entrée via l'argument de fonction, ARGV ou STDIN. La sortie doit être un résultat véridique ou falsifié qui peut être renvoyé par la fonction ou écrit dans STDOUT.
Supposons que le texte contienne des caractères ASCII imprimables arbitraires (codes hexadécimaux 20 à 7E) et des caractères de saut de ligne. Les lettres sont sensibles à la casse. Vous pouvez supposer que le texte saisi est rectangulaire, c'est-à-dire que toutes les lignes ont la même longueur. Vous pouvez décider si l'entrée se termine par une nouvelle ligne de fin ou non (si cela est important pour votre soumission).
C'est le golf de code, la réponse la plus courte (en octets) l'emporte.
Exemples
En utilisant cette grille de l'article de Wikipedia sur les recherches de mots comme première entrée:
WVERTICALL
ROOAFFLSAB
ACRILIATOA
NDODKONWDC
DRKESOODDK
OEEPZEGLIW
MSIIHOAERA
ALRKRRIRER
KODIDEDRCD
HELWSLEUTH
les chaînes de recherche suivantes devraient respectivement donner des résultats vrais ou faux:
Truthy: RANDOM, VERTICAL, HORIZONTAL, WORDSEARCH, WIKIPEDIA, TAIL
Falsy: WordSearch, CODEGOLF, UNICORN
Alternativement, en utilisant ce texte d'entrée
Lorem ipsum dolor sit amet consectetu
r adipisicing elit sed do eiusmod tem
por incididunt ut labore et dolore ma
gna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco lab
oris nisi ut aliquip ex ea commodo co
nsequat. Duis aute irure dolor in rep
rehenderit in voluptate velit esse ci
llum dolore eu fugiat nulla pariatur.
Nous obtenons les résultats de recherche suivants (en utilisant des guillemets maintenant, car il y a des espaces dans certaines chaînes de recherche):
Truthy: "Lorem", "mine", "uma bop", "tuetdod", "snol,a", "texas", "pii.d v", "vexta"
Falsy: "lorem", "wordsearch", "pii.d v", "mute"
la source
Réponses:
CJam,
4637 octetsLit la grille depuis STDIN et le mot comme argument de ligne de commande. Imprime des entiers positifs pour les correspondances et 0 pour les non-correspondances.
Au prix de deux octets supplémentaires, les deux chaînes (mot, saut de ligne, grille) peuvent être lues depuis STDIN:
Vous pouvez essayer cette version en ligne avec l' interprète CJam .
Exemple d'exécution
Contexte
Supposons que l'entrée était la grille suivante:
En séparant les sauts de ligne, nous obtenons le tableau suivant:
Cela couvre les mots orientaux (mots allant de gauche à droite).
Maintenant, nous joignons les éléments de l'
A
utilisation d'une chaîne delen(A)
sauts de ligne comme séparateur:Ensuite, nous coupons la chaîne résultante en morceaux de longueur
len(A) + len(A[0]) + 1
:Si on "zip" le tableau (transpose des lignes et des colonnes), on obtient:
Cela couvre les mots du Sud-Est.
Si nous compressons A et inversons l'ordre des lignes du résultat, nous obtenons:
Cela couvre le Sud et - après avoir répété le processus pour les diagonales - les mots du Sud-Ouest.
En zippant et en inversant à nouveau, on obtient:
Cela couvre l'Ouest et - après avoir répété le processus pour les diagonales - les mots du Nord-Ouest.
En zippant et en inversant une fois de plus, nous obtenons:
Cela couvre le Nord et - après avoir répété le processus pour les diagonales - les mots du Nord-Est.
Comment ça marche
Le code fait comme expliqué dans la section précédente, avec deux différences mineures:
len(A) + len(A[0])
commelen(A + zip(A))
.Enfin, il joint toutes les lignes de tous les tableaux générés en utilisant des sauts de ligne comme séparateurs et recherche le mot dans la chaîne résultante.
la source
Java: 183
211321Une force brute de base. Il n'y a pas grand-chose d'autre à dire, je suppose. L'entrée est l'aiguille en premier et la botte de foin en second. Suppose que la grille se termine par une nouvelle ligne .
Une version légèrement plus lisible avec un cas de test illustré:
la source
if(e<1)return 1>0;
pourraitreturn e<1;
ne pas l'être?i=a*9,
etfor(;i-->0;)
puisz=i/9;
eti%a!=4&
et ainsi de suite?JavaScript (E6) 111
116Recherche de force brute pour chaque personnage dans toutes les directions - aussi golfé que possible
Test dans la console FireFox / Firebug
Sortie
la source
Python, 175
Pas très inspiré, mais voici:
Le premier argument est la botte de foin, le deuxième est l'aiguille.
la source
h,n=input()
etprint
. Cela fonctionne-t-il également avec des entrées non carrées? (m = len (n)? J'avoue ne pas bien comprendre ce que vous faites, donc je peux me tromper complètement!)while i>0
towhile i:
(cari
ne peut jamais devenir négatif),if m<1:i=-1
toi-=m<1
.if m<1:i=-1
carif m<1:i-=1
ni l'un ni l'autre ne fonctionnera car il est sur le pointi
d'être négatif.Bash + coreutils,
214169 octetsUtilise 3 fonctions de transformation
r
,t
etd
pour inverser, transposer et décalage diagonal, dans toutes les combinaisons nécessaires.Mise à jour - la
r
fonction produit désormais une sortie inversée et non inversée pour plus de golfSaisie via des arguments de ligne de commande - chaîne de recherche, suivie d'un bloc de recherche de mots rectangulaire (séparé par une nouvelle ligne).
La sortie est un code d'état de sortie de shell idiomatiquement correct - 0 signifiant VRAI et 1 signifiant FAUX.
Sortie:
la source
T()(tee >(r) $@)
, mais c'est encore mieux. 2. Je ne pense pas avoir déjà vu cette syntaxe de fonction auparavant. 3. Considérant que les chaînes non vides sont véridiques et les chaînes vides fausses, je pense que vous pouvez les omettre-q
.r()(tee >(rev) $@)
,r<<<"$2"|r >(d) >(r|t) >(r|d)|r|grep "$1"
devrait également fonctionner.-q
reste.C, 163
Pas de réarrangement de la grille, j'essaie simplement chaque lettre de départ dans toutes les directions, et je marche jusqu'à ce que je sors de la grille ou que je trouve un décalage.
Je profite du fait qu'une chaîne C se termine par un octet zéro. Comme il n'y a pas zéro octet dans la grille, il y aura TOUJOURS un décalage. Mais si la non-concordance se produit à l'octet zéro, nous savons que nous avons trouvé la fin de la chaîne à rechercher et l'enregistrons en tant que correspondance.
Non golfé dans un programme de test
Sortie
Notez que la fonction renverra le nombre total d'incidences de la chaîne recherchée dans la grille. Ainsi,
OD
il renvoie 6. Si aucune incidence n'est trouvée, il renvoie 0, ce qui est la seule valeur de fausse en C. Changer poury|=d*!n[j]
sauverait un caractère mais perdrait cette fonctionnalité.la source
C # -
218197186 octetsFonction C # qui prend 2 chaînes, le premier mot à rechercher, plus tard la grille avec des sauts de ligne (
\n
) entre les lignes. Les choses deviennent désespérées maintenant ... si désespérées en fait que ma précédente édition n'a pas fonctionné!Code golf:
Moins joué avec le code de test:
la source
Haskell - 173
Au lieu de chercher directement sur la grille, je transforme la grille de différentes manières et fais correspondre le mot avec chaque ligne de la nouvelle grille.
Par exemple,
Recherchez le mot dans chaque ligne de G1, G2, G4 et G5, puis nous avons terminé. Notez que G3 n'est pas utilisé, je le poste ici juste à titre d'illustration.
Une idée similaire est appliquée pour rechercher en avant et en arrière: il suffit de rechercher le mot d'origine et le mot inversé.
Alors maintenant, nous avons cherché 8 directions. Voici le code, dont l'exactitude a été vérifiée par un autre script .
La fonction
f
est ce que nous voulons et son argumentr
est la chaîne rectangulaire,w
c'est le mot à rechercher.la source
Python 2 - 246
259275308298297294313322Merci à Will pour son aide dans le traitement de l'impression et la définition de la jointure.
Merci au chemin de fer souterrain de m'avoir rappelé correctement les espaces de golf; p
Correction des mauvaises correspondances grâce à l'utilisation de "," comme délimiteur.
Apparemment, la meilleure façon de jouer au golf est d'ajouter des tonnes de défilement horizontal.
Entrée en
espacescoupde saut de ligne délimité lignes entre guillemets: "WVERTICALL \ nROOAFFLSAB \ nACRILIATOA \ nNDODKONWDC \ nDRKESOODDK \ nOEEPZEGLIW \ nMSIIHOAERA \ nALRKRRIRER \ nKODIDEDRCD \ nHELWSLEUTH", "ALEATOIRE"la source
L=len;J=''.join
etc etprint any(s in(v,d,w,r...))
? J'allais dans le même sens quand je vous ai vu posté :))
ou]
suivi d'un espace, vous pouvez supprimer l'espace.APL (Dyalog Classic) , 44 octets
Essayez-le en ligne!
la source
\n
séparée (c'est-à-dire avoir⎕TC[2]
comme séparateur).J ,
6053 octetsEssayez-le en ligne!
Nécessite que la première entrée ne contienne aucune nouvelle ligne.
Explication:
Essayez-le en ligne!
Les crochets sont utiles.
la source
Gelée , 16 octets
Résolution d'un problème connexe (éventuellement un doublon) avec 15 de ces 16 octets au cœur du code ...
Un lien dyadique acceptant une liste de caractères à gauche et une liste de caractères à droite qui renvoie 1 si trouvé et 0 sinon.
Essayez-le en ligne!
Comment?
la source