Introducción
Después de un día de beber y ver la copa del mundo, te sientas a jugar un juego amistoso de boggle. Los ánimos aumentan cuando se le acusa de perder el tiempo de todos con palabras sin sentido que ni siquiera están en el tablero. Es posible que esté viendo el doble, pero seguramente está pensando lo suficiente como para escribir un programa que verifique que sus palabras estén en la pizarra.
Tu tarea
Escriba un programa, secuencia de comandos o función que tome una pizarra y una palabra como entrada, y devuelva True si la palabra está en la pizarra y False si la palabra no lo está.
La entrada tendrá la forma de seis \n
líneas delimitadas. Las primeras cinco líneas comprenderán el tablero de boggle 5x5 y cada una contendrá cinco letras mayúsculas. La sexta línea contendrá la palabra en cuestión, también en mayúsculas.
Entrada de muestra:
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
La salida puede ser cualquier cosa que signifique inequívocamente Verdadero o Falso en el lenguaje de programación de su elección y se adhiera a las convenciones estándar de cero, nulo y vacío que significa Falso.
Salida de muestra para la entrada anterior:
1
Pautas de E / S
- La entrada puede leerse desde stdin, y responder la salida a stdout.
O
- La entrada puede ser un argumento de cadena única para una función, y la respuesta será el valor de retorno de esa función.
Reglas de Boggle
- Una palabra está 'en el tablero' si puede construir la palabra a través de una ruta de mosaicos consecutivos, adyacentes y no repetitivos en el tablero.
- Un mosaico se considera adyacente a los ocho mosaicos que lo rodean (se permiten caminos diagonales). Las fichas en el borde del tablero son adyacentes a solo cinco fichas. Los azulejos en la esquina son adyacentes a solo tres.
- Las letras consecutivas en la palabra deben ser adyacentes, la
i
letra th en la palabra debe ser adyacente a lai-1
th yi+1
th. - Una letra puede aparecer en una palabra más de una vez, pero no puede usar el mismo cuadrado en el tablero de boggle más de una vez por palabra.
- El sitio en línea de boggle wordsplay.net puede ser útil si nunca antes ha jugado a boggle, pero quiere tener una idea de estas reglas.
A diferencia del boggle regular:
- NO tiene que preocuparse de que la palabra sea una palabra válida en inglés.
- No habrá un
Qu
solo mosaico. - La palabra en cuestión puede tener cualquier longitud> 0
Ejemplo
En el tablero de
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
Estas palabras deben devolver True: FATE, DATING, STANDS, LIFTS.
Estas palabras deberían devolver False: SADDEN, SULTANS, EXIST, SUEDE, QUEST
Este es un desafío de código de golf, por lo que gana el código más corto.
Respuestas:
GolfScript, 74 caracteres
La entrada debe darse en STDIN. Imprime el número de rutas válidas en el tablero, es decir,
0
ninguna y un número positivo (verdadero) más.Puedes probar el ejemplo en línea .
Código con algunos comentarios:
fuente
Javascript (E6) 137
160 175 190Menos de 2 * Golfscript. Victoria moral ...
Edite la reorganización del código Golfed. Una y otra vez
Ungolfed Última versión, un poco difícil de seguir
Primera versión de Ungolfed , debería ser más clara
Uso
Prueba
Salida:
fuente
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) ow = b.pop()
(sin golf, línea 2)? (probablemente el último, creo)a=a.pop()
lugar deb=a.pop()
...Python,
207 204203Reemplazar
... (b[i]==w[0])*any ...
con... b[i]==w[0]and any ...
ofrece un rendimiento mucho mejor a costa de 2 caracteres.fuente
0<=i<25and
J - 75 char
Eugh, este se ve desagradable. ¡Y ni siquiera empatando con Golfscript! Esta es una función que toma una cadena como único argumento. Puede usar cualquier delimitador de un carácter siempre que se encuentre al final de cada línea, incluida la última.
Sigue una explicación. Tenga en cuenta que la función se puede dividir en 5 partes distintas de nivel superior, cada una separada por
@
, por lo que trataremos cada una de esas partes por separado, de derecha a izquierda.(<;._2)
- Esto divide las líneas en las líneas nuevas / caracteres separadores. Utiliza el carácter al final de la cadena como el carácter en el que se divide. Ponemos todo en cajas (<
) porque si no lo hacemos, tenemos algunos problemas de relleno cuando J nos devuelve el resultado.(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)
- Para cada letra de la palabra a verificar, cree una lista de índices en el tablero de Boggle donde pueda encontrar esa letra.{:
es la última pieza dividida (la palabra para verificar) y}:
es todo menos la última (el tablero de Boggle).&:>
abre las cajas que hicimos anteriormente, con el subproducto útil de convertirse}:
en una matriz 2D de personajes.=/
luego hace una copia de este tablero de Boggle para cada letra de la palabra y convierte las posiciones en booleanos dependiendo de si la letra del tablero coincide con esa letra en la palabra.((<@#:i.)5 5)
es una forma corta de expresar una matriz de índices 5x5.x#:y
se conviertey
en una matriz de lax
representación base . (Bueno, casi. La verdad es más compleja, pero esto funciona para nuestros propósitos).<@#~&,"2
- Para cada matriz booleana resultante de cada letra, recopile todos los índices verdaderos correspondientes."2
hace que todo funcione con los resultados correctos,#~&,
realiza la selección y<@
recopila cada resultado en un cuadro para prepararse para el siguiente paso.{
- Este verbo, usado monádicamente, se llama Catálogo, y toma una lista de cuadros como argumento. Combina el interior de cada caja de todas las formas posibles. Entonces, por ejemplo, un catálogo en algunas cajas que contienen las cadenas "AB" y "abc" daría los resultados "Aa", "Ab", "Ac", "Ba", "Bb", "Bc".Ejecutar esto en nuestra lista en caja de listas de índices hace todas las combinaciones posibles de índices. Este puede ser un conjunto grande si la palabra es larga y hay muchas letras repetidas, pero también está vacía si alguna letra no está en el tablero. También notamos que reutilizamos mosaicos en algunas de estas rutas: explicaremos esto más adelante.
([:*/"1^:2(2(=*)@-/\>@~.)S:1)
- Aquí verificamos cada ruta para ver si es válida.(...)S:1
aplica el(...)
a cada ruta y recopila los resultados en una lista plana. Esto es crucial porque el resultado{
es una matriz multidimensional, y no nos importa la estructura de esa matriz, solo su contenido en cada cuadro.2(=*)@-/\>
da un 1 si cada coordenada de cada índice está como máximo a una distancia de la siguiente, y 0 en caso contrario. El2
y el/\
son responsables de hacer esto en parejas.*/"1^:2
lógico-ANDs todos juntos al final. La[:
parte es algo estructural en J, no te preocupes por eso.Agregar
@~.
a esto>
es en realidad una forma inteligente de excluir rutas con entradas repetidas.~.
toma los elementos únicos de una lista, por lo que la lista se acorta si se cruza automáticamente, y las listas más cortas se rellenan automáticamente con 0 cuando se juntan, como la forma en que se combinan los resultados a medida que salenS:
. Esto es, en última instancia, más corto que excluir explícitamente las rutas auto intersectantes.+/
- Finalmente, simplemente sumamos todo al final. El resultado es el número de rutas válidas que hacen que la palabra en el tablero, con 0 significa que no hay rutas, es decir, esta palabra no está en el tablero. Por el costo de un carácter, podemos escribir+./
(OR-lógico todo junto) en su lugar, lo que dará explícitamente un booleano 1 o 0.Aquí hay algunos ejemplos de carreras. Usted puede obtener el intérprete J en jsoftware.com o probarlo en línea en tryj.tk .
fuente
Prólogo - 315
Pensé que Prolog podría ser un buen lenguaje para este, con el soporte de retroceso incorporado, pero supongo que es más perjudicado al necesitar una variable para casi todos los valores calculados.
Probado con GNU Prolog; debe cumplir con ISO Prolog.
Sin golf:
fuente