Este é um comentário (longo!) Sobre o bom trabalho que o @vqv postou neste tópico. O objetivo é obter uma resposta definitiva. Ele fez o trabalho duro de simplificar o dicionário. Tudo o que resta é explorá-lo ao máximo. Seus resultados sugerem que uma solução de força bruta é viável . Afinal, incluindo um curinga, existem no máximo palavras que se pode fazer com 7 caracteres e parece que menos de 1/10000 deles - digamos, cerca de um milhão - não incluirão algumas informações válidas. palavra. 277=10,460,353,203
A primeira etapa é aumentar o dicionário mínimo com um caractere curinga, "?". 22 das letras aparecem em palavras de duas letras (todas, exceto c, q, v, z). Coloque um curinga nas 22 letras e adicione-o ao dicionário: {a ?, b ?, d ?, ..., y?} Estão agora. Da mesma forma, podemos inspecionar as palavras mínimas de três letras, causando algumas palavras adicionais para aparecer no dicionário. Por fim, adicionamos "??" para o dicionário. Após remover as repetições resultantes, ele contém 342 palavras mínimas.
Uma maneira elegante de proceder - uma que realmente use uma quantidade muito pequena de codificação - é ver esse problema como um problema algébrico . Uma palavra, considerada como um conjunto não ordenado de letras, é apenas um monômio. Por exemplo, "spats" é o monomial . O dicionário, portanto, é uma coleção de monômios. Pareceaps2t
{a2,ab,ad,...,ozψ,wxψ,ψ2}
(onde, para evitar confusão, escrevi para o caractere curinga).ψ
Um rack contém uma palavra válida se e somente se essa palavra divide o rack.
Uma maneira mais abstrata, mas extremamente poderosa, de dizer isso é que o dicionário gera um ideal no anel polinomial e que os racks possuem valores válidos. as palavras se tornam zero no anel de quociente , enquanto racks sem palavras válidas permanecem diferentes de zero no quociente. Se formarmos a soma de todos os racks em e computá-lo nesse anel de quociente, o número de racks sem palavras será igual ao número de monômios distintos no quociente.R = Z [ a , b , … , z , ψ ] R / I RIR=Z[a,b,…,z,ψ]R/IR
Além disso, a soma de todos os racks em é fácil de expressar. Seja a soma de todas as letras do alfabeto. contém um monomial para cada rack. (Como um bônus adicional, seus coeficientes contam o número de maneiras que cada rack pode ser formado, permitindo calcular sua probabilidade, se quisermos.)α = a + b + ⋯ + z + ψ α 7Rα=a+b+⋯+z+ψα7
Como um exemplo simples (para ver como isso funciona), suponha que (a) não usamos caracteres curinga e (b) todas as letras de "a" a "x" sejam consideradas palavras. Então, os únicos racks possíveis dos quais as palavras não podem ser formadas devem consistir inteiramente de y e z. Calculamos módulo o ideal gerado por um passo de cada vez, assim: { a , b , c , … , x }α=(a+b+c+⋯+x+y+z)7{a,b,c,…,x}
α0α1α2⋯α7=1=a+b+c+⋯+x+y+z≡y+zmodI≡(y+z)(a+b+⋯+y+z)≡(y+z)2modI≡(y+z)6(a+b+⋯+y+z)≡(y+z)7modI.
Podemos ler a chance de obter um rack que não seja uma palavra da resposta final, : cada coeficiente conta as maneiras pelas quais o rack correspondente pode ser desenhado. Por exemplo, existem 21 (de 26 ^ 7 possíveis) maneiras de desenhar 2 y e 5 z porque o coeficiente de é igual a 21.y7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7y2z5
A partir de cálculos elementares, é óbvio que esta é a resposta correta. O ponto principal é que esse procedimento funciona independentemente do conteúdo do dicionário.
Observe como reduzir o módulo de potência o ideal em cada estágio reduz o cálculo: esse é o atalho revelado por essa abordagem. (Fim do exemplo.)
Os sistemas de álgebra polinomial implementam esses cálculos . Por exemplo, aqui está o código do 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]
(O dicionário pode ser construído de maneira direta a partir do min.dict de @ vqv; coloquei uma linha aqui mostrando que é curto o suficiente para ser especificado diretamente, se você preferir.)
A saída - que leva dez minutos de computação - é 577958. ( NB Em uma versão anterior desta mensagem, cometi um pequeno erro na preparação do dicionário e obtive 577940. Editei o texto para refletir o que espero que esteja agora os resultados corretos!) Um pouco menos do que o milhão que eu esperava, mas da mesma ordem de magnitude.
Para calcular a chance de obter esse rack, precisamos levar em consideração o número de maneiras pelas quais o rack pode ser desenhado. Como vimos no exemplo, isso é igual ao seu coeficiente em . A chance de desenhar algum rack é a soma de todos esses coeficientes, facilmente encontrados ao definir todas as letras iguais a 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
A resposta é igual a 1066056120, dando uma chance de 10,1914% de desenhar um rack do qual nenhuma palavra válida pode ser formada (se todas as letras forem igualmente prováveis).
Quando as probabilidades das letras variarem, substitua cada letra pela chance de ser sorteada:
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)
O resultado é 1.079877553303%, a resposta exata (embora usando um modelo aproximado, desenhando com substituição). Olhando para trás, foram necessárias quatro linhas para inserir os dados (alfabeto, dicionário e frequências do alfabeto) e apenas três linhas para executar o trabalho: descrever como obter a próxima potência de modulo , tomar a 7ª potência recursivamente e substituir as probabilidades para as letras.αI