Dado un texto rectangular como un rompecabezas de búsqueda de palabras y una cadena de búsqueda, determine si el texto contiene la cadena de búsqueda. La cadena de búsqueda puede aparecer:
- horizontal, vertical o diagonal
- hacia adelante o hacia atrás
Puede escribir una función o un programa y tomar dos cadenas como entrada a través del argumento de la función, ARGV o STDIN. La salida debe ser un resultado verdadero o falso que puede ser devuelto desde la función o escrito en STDOUT.
Suponga que el texto contendrá caracteres ASCII imprimibles arbitrarios (códigos hexadecimales 20 a 7E) y caracteres de salto de línea. Las letras distinguen entre mayúsculas y minúsculas. Puede suponer que el texto de entrada es rectangular, es decir, todas las líneas tienen la misma longitud. Puede saber si la entrada termina con una nueva línea final o no (si es importante para su envío).
Este es el código de golf, gana la respuesta más corta (en bytes).
Ejemplos
Usando esta cuadrícula del artículo de Wikipedia sobre búsquedas de palabras como la primera entrada:
WVERTICALL
ROOAFFLSAB
ACRILIATOA
NDODKONWDC
DRKESOODDK
OEEPZEGLIW
MSIIHOAERA
ALRKRRIRER
KODIDEDRCD
HELWSLEUTH
las siguientes cadenas de búsqueda deberían arrojar resultados verdaderos o falsos, respectivamente:
Truthy: RANDOM, VERTICAL, HORIZONTAL, WORDSEARCH, WIKIPEDIA, TAIL
Falsy: WordSearch, CODEGOLF, UNICORN
Alternativamente, usando este texto de entrada
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.
Obtenemos los siguientes resultados de búsqueda (usando comillas ahora, porque hay espacios en algunas cadenas de búsqueda):
Truthy: "Lorem", "mine", "uma bop", "tuetdod", "snol,a", "texas", "pii.d v", "vexta"
Falsy: "lorem", "wordsearch", "pii.d v", "mute"
fuente
Respuestas:
CJam,
4637 bytesLee la cuadrícula de STDIN y la palabra como argumento de línea de comandos. Imprime enteros positivos para coincidencias y 0 para no coincidencias.
A costa de dos bytes adicionales, ambas cadenas (palabra, salto de línea, cuadrícula) se pueden leer desde STDIN:
Puede probar esta versión en línea con el intérprete de CJam .
Ejecución de ejemplo
Fondo
Suponga que la entrada fue la siguiente cuadrícula:
Partiendo en saltos de línea, obtenemos la siguiente matriz:
Eso cubre las palabras del este (palabras que van de izquierda a derecha).
Ahora, unimos los elementos del
A
uso de una cadena delen(A)
avances de línea como separador:Luego, cortamos la cadena resultante en trozos de longitud
len(A) + len(A[0]) + 1
:Si "comprimimos" la matriz (transponemos filas y columnas), obtenemos:
Eso cubre las palabras del sudeste.
Si comprimimos A e invertimos el orden de las filas del resultado, obtenemos:
Eso cubre el Sur y, después de repetir el proceso para las diagonales, las palabras del Sudoeste.
Comprimiendo e invirtiendo de nuevo, obtenemos:
Eso cubre el oeste y, después de repetir el proceso para las diagonales, las palabras del noroeste.
Comprimiendo y retrocediendo una vez más, obtenemos:
Eso cubre el norte y, después de repetir el proceso para las diagonales, las palabras del noreste.
Cómo funciona
El código hace lo explicado en la sección anterior, con dos diferencias menores:
len(A) + len(A[0])
comolen(A + zip(A))
.Finalmente, une todas las filas de todas las matrices generadas utilizando avances de línea como separadores y busca la palabra en la cadena resultante.
fuente
Java: 183
211321Una fuerza bruta básica. No hay mucho más que decir, supongo. La entrada es la aguja primero y el pajar segundo. Asume que la grilla está terminada en nueva línea .
Una versión ligeramente más legible con el caso de prueba que se muestra:
fuente
if(e<1)return 1>0;
podría ser ¿return e<1;
no?i=a*9,
yfor(;i-->0;)
a continuación,z=i/9;
yi%a!=4&
etcétera?JavaScript (E6)
111116Búsqueda de fuerza bruta para cada personaje en todas las direcciones, tan golfizado como pueda
Prueba en la consola FireFox / Firebug
Salida
fuente
Python, 175
No muy inspirado, pero aquí va:
El primer argumento es el pajar, el segundo es la aguja.
fuente
h,n=input()
yprint
. Además, ¿funciona esto con entradas no cuadradas? (? m = len (n) Admito que no comprender plenamente lo que está haciendo, por lo que podría estar completamente equivocado!)while i>0
towhile i:
(yai
que nunca puede volverse negativo),if m<1:i=-1
toi-=m<1
.if m<1:i=-1
yaif m<1:i-=1
que ninguno de los dos funcionará porque se está poniendoi
negativo.Bash + coreutils,
214169 bytesUtiliza 3 funciones de transformación
r
,t
yd
para invertir, transponer y desplazamiento diagonal, en todas las combinaciones necesarias.Actualización: la
r
función ahora produce resultados invertidos y no invertidos para una mayor capacidad de golfEntrada a través de argumentos de línea de comandos: cadena de búsqueda, seguida de un bloque de búsqueda de palabras rectangular (separado por línea nueva).
La salida es un código de estado de salida de shell idiomáticamente correcto: 0 significa VERDADERO y 1 significa FALSO.
Salida:
fuente
T()(tee >(r) $@)
, pero eso es aún mejor. 2. No creo haber visto esa sintaxis de funciones antes. 3. Considerando que las cadenas no vacías son verdaderas y las cadenas vacías falsas, creo que puedes omitirlas-q
.r()(tee >(rev) $@)
,r<<<"$2"|r >(d) >(r|t) >(r|d)|r|grep "$1"
debería funcionar también.-q
que se quede.C, 163
Sin reorganización de la cuadrícula, simplemente intento cada letra de inicio en todas las direcciones, y camino hasta que salgo de la cuadrícula o encuentro una falta de coincidencia.
Aprovecho el hecho de que una cadena C termina en un byte cero. Como no hay cero bytes en la cuadrícula, SIEMPRE habrá una falta de coincidencia. Pero si la falta de coincidencia se produce en el byte cero, sabemos que hemos encontrado el final de la cadena a buscar y lo registramos como una coincidencia.
Sin golf en un programa de prueba
Salida
Tenga en cuenta que la función devolverá el número total de incidencias de la cadena buscada en la cuadrícula. Por
OD
lo tanto , devuelve 6. Si no se encuentran incidencias, devuelve 0, que es el único valor falso en C. Cambiar ay|=d*!n[j]
guardaría un carácter pero perdería esta funcionalidad.fuente
C # -
218197186 bytesFunción C # que toma 2 cadenas, la primera es la palabra a buscar, más tarde la cuadrícula con saltos de línea (
\n
) entre líneas. Las cosas se están poniendo desesperadas ahora ... de hecho, tan desesperado que mi edición anterior no funcionó.Código de golf:
Menos golf con código de prueba:
fuente
Haskell - 173
En lugar de buscar directamente en la cuadrícula, transformo la cuadrícula de diferentes maneras y relaciono la palabra con cada fila de la nueva cuadrícula.
Por ejemplo,
Busque la palabra en cada fila de G1, G2, G4 y G5, y listo. Tenga en cuenta que G3 no se usa, lo publico aquí solo para ilustración.
Se aplica una idea similar para buscar hacia adelante y hacia atrás: solo busca la palabra original y la palabra invertida.
Así que ahora hemos buscado 8 direcciones. Aquí está el código, cuya corrección fue verificada por otro script .
La función
f
es lo que queremos y su argumentor
es la cadena rectangular,w
es la palabra a buscar.fuente
Python 2 - 246
259275308298297294313322Gracias a Will por su ayuda con la impresión y la definición de la unión.
Gracias al ferrocarril subterráneo por recordarme a los espacios de golf correctamente; p
Se corrigió por malas coincidencias gracias al uso de ',' como delimitador.
Aparentemente, la mejor manera de jugar al golf es agregar toneladas de desplazamiento horizontal.
Ingrese como
espacioenblancobanglíneas delimitadas de nueva línea entre comillas: "WVERTICALL \ nROOAFFLSAB \ nACRILIATOA \ nNDODKONWDC \ nDRKESOODDK \ nOEEPZEGLIW \ nMSIIHOAERA \ nALRKRRIRER \ nKODIDEDRCD \ nHELWSLE", "RHANDWAND" n "."fuente
L=len;J=''.join
etc yprint any(s in(v,d,w,r...))
? Iba en la misma línea cuando te vi publicado :))
o]
seguido por un espacio, puede sacar el espacio.APL (Dyalog Classic) , 44 bytes
Pruébalo en línea!
fuente
\n
separada (es decir, tenerla⎕TC[2]
como separador).J ,
6053 bytesPruébalo en línea!
Requiere que la primera entrada no contenga nuevas líneas.
Explicación:
Pruébalo en línea!
Los ganchos son útiles.
fuente
Jalea , 16 bytes
Resuelto un desafío relacionado (posiblemente un duplicado) con 15 de estos 16 bytes como núcleo del código ...
Un enlace diádico que acepta una lista de caracteres a la izquierda y una lista de caracteres a la derecha que devuelve 1 si se encuentra y 0 si no.
Pruébalo en línea!
¿Cómo?
fuente