Questo è un (lungo!) Commento sul bel lavoro che @vqv ha pubblicato in questa discussione. Ha lo scopo di ottenere una risposta definitiva. Ha fatto il duro lavoro di semplificare il dizionario. Non resta che sfruttarlo al massimo. I suoi risultati suggeriscono che una soluzione a forza bruta è fattibile . Dopotutto, incluso un carattere jolly, ci sono al massimo parole che si possono fare con 7 caratteri, e ne sembrano meno di 1/10000 - diciamo, circa un milione - non riesco a includere alcune parole valide. 277= 10 , 460 , 353 , 203
Il primo passo è aumentare il dizionario minimo con un carattere jolly "?". 22 delle lettere compaiono in parole di due lettere (tutte tranne c, q, v, z). Aggiungete un jolly a quelle 22 lettere e aggiungetele al dizionario: {a ?, b ?, d ?, ..., y?} Sono ora presenti. Allo stesso modo possiamo ispezionare le parole minime di tre lettere, causando alcune parole aggiuntive apparire nel dizionario. Infine, aggiungiamo "??" al dizionario. Dopo aver rimosso le ripetizioni che ne risultano, contiene 342 parole minime.
Un modo elegante di procedere - uno che utilizza davvero una piccolissima quantità di codifica - è vedere questo problema come algebrico . Una parola, considerata come un insieme di lettere non ordinate, è solo un monomio. Ad esempio, "spats" è il monomiale . Il dizionario è quindi una raccolta di monomi. Sembraa p s2t
{ a2, a b , a d, ...,ozψ , w x ψ,ψ2}
(dove, per evitare confusione, ho scritto per il carattere jolly).ψ
Un rack contiene una parola valida se e solo se quella parola divide il rack.
Un modo più astratto, ma estremamente potente, per dirlo è che il dizionario genera un ideale nell'anello polinomiale R = Z [ a , b , … , z , ψ ] e che i rack con parole valide diventano zero nel quoziente ring R / I , mentre i rack senza parole valide rimangono diversi da zero nel quoziente. Se formiamo la somma di tutti i rack in R e la calcoliamo in questo anello di quoziente, allora il numero di rack senza parole è uguale al numero di monomi distinti nel quoziente.ioR = Z [ a , b , … ,z,ψ]R/IR
Inoltre, la somma di tutti i rack in è semplice da esprimere. Sia α = a + b + ⋯ + z + ψ la somma di tutte le lettere dell'alfabeto. α 7 contiene un monomio per ciascun rack. (Come bonus aggiuntivo, i suoi coefficienti contano il numero di modi in cui ogni rack può essere formato, permettendoci di calcolare la sua probabilità se vogliamo.)Rα=a+b+⋯+z+ψα7
Come semplice esempio (per vedere come funziona), supponiamo che (a) non usiamo i caratteri jolly e (b) tutte le lettere da "a" a "x" siano considerate parole. Quindi le uniche possibili cremagliere dalle quali non è possibile formare le parole devono consistere interamente in y e z. Calcoliamo modulo l'ideale generato da { a , b , c , ... , x } un passo alla volta, quindi:α=(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.
Possiamo leggere la possibilità di ottenere un rack senza parole dalla risposta finale, : ciascun coefficiente conta i modi in cui è possibile disegnare il rack corrispondente. Ad esempio, ci sono 21 (su 26 ^ 7 possibili) modi per disegnare 2 y e 5 z perché il coefficiente di yy7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7 uguale a 21.y2z5
Dai calcoli elementari, è ovvio che questa è la risposta corretta. Il punto è che questa procedura funziona indipendentemente dal contenuto del dizionario.
Nota come ridurre la potenza del modulo l'ideale in ogni fase riduce il calcolo: questa è la scorciatoia rivelata da questo approccio. (Fine dell'esempio.)
I sistemi di algebra polinomiale implementano questi calcoli . Ad esempio, ecco il codice 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]
(Il dizionario può essere costruito in modo semplice dal min. Min di @ vqv; ho inserito qui una riga che mostra che è abbastanza corto da essere specificato direttamente se lo desideri.)
L'output - che richiede dieci minuti di calcolo - è 577958. ( NB In una versione precedente di questo messaggio avevo fatto un piccolo errore nella preparazione del dizionario e ottenuto 577940. Ho modificato il testo per riflettere ciò che spero siano ora i risultati corretti!) Poco meno del milione o così mi aspettavo, ma dello stesso ordine di grandezza.
Per calcolare la possibilità di ottenere un tale rack, dobbiamo tenere conto del numero di modi in cui il rack può essere disegnato. Come abbiamo visto nell'esempio, questo equivale al suo coefficiente in . La possibilità di disegnare alcuni di questi rack è la somma di tutti questi coefficienti, facilmente reperibile impostando tutte le lettere uguali a 1:α7
nonwords /. (# -> 1) & /@ (List @@ alphabet)
La risposta equivale a 1066056120, dando una probabilità del 10,1914% di estrarre un rack da cui non è possibile formare una parola valida (se tutte le lettere sono ugualmente probabili).
Quando le probabilità delle lettere variano, basta sostituire ogni lettera con la possibilità di essere disegnata:
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)
L'output è 1,079877553303%, la risposta esatta (anche se usando un modello approssimativo, disegnando con la sostituzione). Guardando indietro, ci sono volute quattro righe per inserire i dati (alfabeto, dizionario e frequenze alfabetiche) e solo tre righe per eseguire il lavoro: descrivere come prendere la potenza successiva di modulo I , prendere la 7a potenza in modo ricorsivo e sostituire la probabilità per le lettere.αI