Dada una lista de cadenas, encuentre la matriz cuadrada más pequeña que contiene cada una de las cadenas iniciales. Las cadenas pueden aparecer horizontal, vertical o diagonal y hacia adelante o hacia atrás como en esta pregunta Word Search Puzzle .
Las palabras deben colocarse en el cuadrado, con al menos una palabra en cada dirección (horizontal, vertical y diagonal). Las palabras deberían aparecer solo una vez.
Entonces, la entrada es solo una lista de palabras. Por ejemplo: CAT, TRAIN, CUBE, BICYCLE
. Una posible solución es:
B N * * * * *
* I * * C A T
* A C * * * *
* R * Y * * C
* T * * C * U
* * * * * L B
* * * * * * E
Reemplacé las letras de relleno con asteriscos solo por claridad. El resultado deseado debe incluir letras de relleno al azar.
AC
en su ejemplo sería otraCAT
si es asíT
.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
no tiene solución.Respuestas:
JavaScript (ES6),
595628680Editar algo de limpieza y de combinación de:
- función P fusionó función dentro de R
- calc x y z en la misma .map
- cuando la solución se encontró, juego de x a 0 para salir de bucle exterior
- definiton fusionada y llamada de W
Edit2 más golf, relleno aleatorio acortado, bucle externo revisado ... vea el historial para algo más legible
A diferencia de la respuesta aceptada,esto debería funcionar para la mayoría de las entradas. Solo evita las palabras de una letra. Si se encuentra una salida, es óptima y utiliza las 3 direcciones.La restricción de evitar repetir palabras es muy difícil. Tuve que buscar palabras repetidas en cada paso agregando palabras a la cuadrícula y en cada carácter de relleno aleatorio.
Subfunciones principales:
P (w) verdadero si la palabra palíndromo. Una palabra palindrom se encontrará dos veces cuando se verifican las palabras repetidas.
R (s) verifica las palabras que se repiten en la cuadrícula s
Las Q llenan la cuadrícula con caracteres aleatorios (es recursivo y retrocede en caso de que se repita la palabra) y puede fallar.
W () recursivo, intente llenar una cuadrícula de tamaño dado, si es posible.
La función principal usa W () para encontrar una cuadrícula de salida, intentando desde el tamaño de la palabra más larga en la entrada hasta la suma de la longitud de todas las palabras.
Desengañado y explicado (incompleto, lo siento muchachos, es mucho trabajo)
Prueba en la consola Firefox / FireBug
F (['TREN', 'CUBO', 'CAJA', 'BICICLETA'])
no llenado
F (['TREN', 'ARTES', 'RATA', 'CUBO', 'CAJA', 'BICICLETA', 'TORMENTA', 'CEREBRO', 'PROFUNDIDAD', 'BOCA', 'PESTAÑA']]
F (['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG'])
F (['AA', 'AB', 'AC', 'AD', 'AE', 'AF'])
salida no llena - @nathan: ahora no puede agregar otra A x sin repeticiones. Necesitarás una cuadrícula más grande.
fuente
C#
Aquí hay una implementación simple con trabajo por hacer. Hay muchas combinaciones para obtener el tamaño más pequeño. Así que solo utilicé el algoritmo más simple que se me ocurrió.
Prueba
fuente
at least one word in each direction (horizontal, vertical and diagonal)
. Ejecutando el programa de prueba, no hay palabras horizontales (3 verticales, 1 diag)