Este es un comentario (¡largo!) Sobre el buen trabajo que @vqv ha publicado en este hilo. Su objetivo es obtener una respuesta definitiva. Ha hecho el trabajo duro de simplificar el diccionario. Todo lo que queda es explotarlo al máximo. Sus resultados sugieren que una solución de fuerza bruta es factible . Después de todo, incluido un comodín, hay como máximo 277=10,460,353,203 palabras que se pueden formar con 7 caracteres, y parece que menos de 1/10000 de ellos, digamos, alrededor de un millón, serán no incluye alguna palabra válida.
El primer paso es aumentar el diccionario mínimo con un carácter comodín, "?". 22 de las letras aparecen en palabras de dos letras (todas menos c, q, v, z). Adjunte un comodín a esas 22 letras y agréguelas al diccionario: {a ?, b ?, d ?, ..., y?} Ahora están dentro. De manera similar, podemos inspeccionar las palabras mínimas de tres letras, causando algunas palabras adicionales para aparecer en el diccionario. Finalmente, agregamos "??" al diccionario Después de eliminar las repeticiones que resultan, contiene 342 palabras mínimas.
Una forma elegante de proceder, una que utiliza una cantidad muy pequeña de codificación, es ver este problema como algebraico . Una palabra, considerada como un conjunto desordenado de letras, es solo un monomio. Por ejemplo, "spats" es el monomio . El diccionario, por lo tanto, es una colección de monomios. Parece queaps2t
{ a2, a b , a d, . . . , o zψ , w x ψ , ψ2}
(donde, para evitar confusiones, he escrito ψ para el carácter comodín).
Un bastidor contiene una palabra válida si y solo si esa palabra divide el bastidor.
Una forma más abstracta, pero extremadamente poderosa, de decir esto es que el diccionario genera un ideal en el anillo polinomial R = Z [ a , b , ... , z , ψ ] y que los bastidores con palabras válidas se convierten en cero en el cociente suena R / I , mientras que los bastidores sin palabras válidas permanecen distintos de cero en el cociente. Si formamos la suma de todos los bastidores en R y la calculamos en este anillo de cociente, entonces el número de bastidores sin palabras es igual al número de monomios distintos en el cociente.yoR=Z[a,b,…,z,ψ]R/IR
Además, la suma de todos los bastidores en es fácil de expresar. Sea α = a + b + ⋯ + z + ψ ser la suma de todas las letras del alfabeto. α 7 contiene un monomio para cada rack. (Como una ventaja adicional, sus coeficientes cuentan la cantidad de formas en que se puede formar cada estante, lo que nos permite calcular su probabilidad si lo deseamos).Rα=a+b+⋯+z+ψα7
Como un ejemplo simple (para ver cómo funciona esto), suponga que (a) no usamos comodines y (b) todas las letras desde "a" hasta "x" se consideran palabras. Entonces, los únicos bastidores posibles a partir de los cuales no se pueden formar palabras deben consistir enteramente en y's y z's. Calculamos módulo el ideal generado por { a , b , c , ... , x } un paso a la vez, por lo tanto:α = ( a + b + c + ⋯ + x + y+ z)7 7{ a , b , c , ... , x }
α0 0α1α2⋯α7 7= 1= a + b + c + ⋯ + x + y+ z≡ y+ zmodyo≡ ( y+ z) ( a + b + ⋯ + y+ z) ≡ ( y+ z)2modyo≡ ( y+ z)6 6(a+b+⋯+y+z)≡(y+z)7modI.
Podemos leer la posibilidad de obtener un rack que no sea de palabras de la respuesta final, : cada coeficiente cuenta las formas en que se puede dibujar el rack correspondiente. Por ejemplo, hay 21 (de 26 ^ 7 posibles) formas de dibujar 2 y's y 5 z's porque el coeficiente de 2y7+7y6z+21y5z2+ 35y4 4z3+ 35y3z4 4+ 21y2z5 5+ 7yz6 6+z7 7y2z5 5 es igual a 21.
De los cálculos elementales, es obvio que esta es la respuesta correcta. El punto es que este procedimiento funciona independientemente del contenido del diccionario.
Observe cómo reducir el módulo de potencia, el ideal en cada etapa, reduce el cálculo: ese es el atajo revelado por este enfoque. (Fin del ejemplo).
Los sistemas de álgebra polinómica implementan estos cálculos . Por ejemplo, aquí está el código de Mathematica :
alphabet = 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 + \[Psi];
dictionary = {a^2, a b, a d, a e, ..., w z \[Psi], \[Psi]^2};
next[pp_] := PolynomialMod[pp alphabet, dictionary];
nonwords = Nest[next, 1, 7];
Length[nonwords]
(El diccionario se puede construir de una manera directa a partir de min.dict de @ vqv; pongo una línea aquí que muestra que es lo suficientemente corto como para especificarlo directamente si lo desea).
La salida, que lleva diez minutos de cálculo, es 577958. ( NB en una versión anterior de este mensaje, cometí un pequeño error al preparar el diccionario y obtuve 577940. He editado el texto para reflejar lo que espero ahora) ¡los resultados correctos!) Un poco menos del millón que esperaba, pero del mismo orden de magnitud.
Para calcular la posibilidad de obtener dicho bastidor, debemos tener en cuenta la cantidad de formas en que se puede dibujar el bastidor. Como vimos en el ejemplo, esto es igual a su coeficiente en . La posibilidad de dibujar algunos de estos bastidores es la suma de todos estos coeficientes, que se encuentran fácilmente al establecer todas las letras iguales a 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
La respuesta es igual a 1066056120, dando una posibilidad del 10.1914% de dibujar un estante desde el cual no se puede formar una palabra válida (si todas las letras son igualmente probables).
Cuando las probabilidades de las letras varían, simplemente reemplace cada letra con su posibilidad de ser dibujada:
tiles = {9, 2, 2, 4, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6,
4, 2, 2, 1, 2, 1, 2};
chances = tiles / (Plus @@ tiles);
nonwords /. (Transpose[{List @@ alphabet, chances}] /. {a_, b_} -> a -> b)
El resultado es 1.079877553303%, la respuesta exacta (aunque utilizando un modelo aproximado, dibujo con reemplazo). Mirando hacia atrás, se necesitaron cuatro líneas para ingresar los datos (alfabeto, diccionario y frecuencias del alfabeto) y solo tres líneas para hacer el trabajo: describa cómo tomar la próxima potencia del módulo I , tomar la séptima potencia de forma recursiva y sustituirla. probabilidades para las letras.αI