Se solicita una fórmula . Desafortunadamente, la situación es tan complicada que parece que cualquier fórmula será simplemente una forma indirecta de enumerar todas las posibilidades. En cambio, esta respuesta ofrece un algoritmo que es (a) equivalente a una fórmula que involucra sumas de productos de coeficientes binomiales y (b) puede ser portado a muchas plataformas.
Para obtener dicha fórmula, divida las posibilidades en grupos mutuamente disjuntos de dos maneras: de acuerdo con la cantidad de letras que no están en la palabra seleccionadas en el estante (deje que esto sea ) y de acuerdo con la cantidad de comodines (espacios en blanco) seleccionados ( deja que esto sea w ). Cuando hay r = 7 mosaicos en el estante, N mosaicos disponibles, M mosaicos disponibles con letras que no están en la palabra y W = 2 espacios en blanco disponibles, el número de opciones posibles dadas por ( m , w ) esmwr=7NMW=2(m,w)
(Mm)(Ww)(N−M−Wr−m−w)
porque las opciones de letras que no son palabras, espacios en blanco y letras de palabras son independientes condicional en(m,w,r).
Esto reduce el problema de encontrar la cantidad de formas de deletrear una palabra cuando se selecciona solo de los mosaicos que representan las letras de la palabra, dado que espacios en blanco están disponibles y se mosaicos . La situación es desordenada y no hay una fórmula cerrada disponible. Por ejemplo, con espacios en blanco y letras extrañas se dibujan exactamente cuatro letras restantes para deletrear "boot" que se extrajeron de los mosaicos "b", "o" y "t" . Dado que hay "b" 's, "o"' s, yr - m - w w = 0 m = 3 2 8 6wr−m−ww=0m=3286"t" en el conjunto de mosaicos Scrabble, hay probabilidades positivas de dibujar (bisetos) "bboo", "bbot", "bbtt", "booo", "boot", "bott", "bttt", "oooo "," ooot "," oott "," ottt "y" tttt ", pero solo uno de estos hechizos" boot ". ¡Y ese fue el caso fácil! Por ejemplo, suponiendo que el estante contenga cinco fichas elegidas al azar de las fichas "o", "b" y "t", junto con ambos espacios en blanco, hay muchas más formas de deletrear "arranque" y no deletrearlo. Por ejemplo, "boot" se puede escribir desde "__boott" y "__bbttt", pero no desde "__ttttt".
Este conteo, el corazón del problema, se puede manejar de manera recursiva. Lo describiré con un ejemplo. Supongamos que deseamos contar las formas de deletrear "boot" con un espacio en blanco y cuatro mosaicos más de la colección de mosaicos "b", "o" y "t" (de donde los dos mosaicos restantes muestran letras no en blanco que no están en { "b", "o", "t"}). Considere la primera letra, "b":
Se puede dibujar una "b" en formas de los dos mosaicos "b" disponibles. Esto reduce el problema a contar la cantidad de formas de deletrear el sufijo "oot" usando ambos espacios en blanco y solo tres fichas más de la colección de fichas "o" y "t".(21)
Un espacio en blanco puede designarse como una "b". Esto reduce el problema a contar la cantidad de formas de deletrear "oot" usando el espacio en blanco restante y solo tres mosaicos más de la colección de mosaicos "o" y "t".
En general, los pasos (1) y (2), que son disjuntos y, por lo tanto, contribuyen de manera aditiva a los cálculos de probabilidad, pueden implementarse como un bucle sobre el posible número de espacios en blanco que podrían usarse para la primera letra. El problema reducido se resuelve de forma recursiva. El caso base ocurre cuando queda una letra, hay una cierta cantidad de mosaicos con esa letra disponible, y también puede haber algunos espacios en blanco en el estante. Solo tenemos que asegurarnos de que el número de espacios en blanco en el estante más el número de mosaicos disponibles será suficiente para obtener la cantidad deseada de esa última letra.
Aquí hay un R
código para el paso recursivo. rack
generalmente es igual a , es un conjunto de recuentos de las letras (como ), es una estructura similar que da el número de mosaicos disponibles con esas letras, y es el número de espacios en blanco que se supone que ocurren en el bastidor.7word
c(b=1, o=2, t=1)
alphabet
wild
f <- function(rack, word, alphabet, wild) {
if (length(word) == 1) {
return(ifelse(word > rack+wild, 0, choose(alphabet, rack)))
}
n <- word[1]
if (n <= 0) return(0)
m <- alphabet[1]
x <- sapply(max(0, n-wild):min(m, rack),
function(i) {
choose(m, i) * f(rack-i, word[-1], alphabet[-1], wild-max(0, n-i))
})
return(sum(x))
}
Una interfaz para esta función especifica los mosaicos estándar de Scrabble, convierte una palabra dada en su estructura de datos de múltiples conjuntos y realiza la suma doble sobre y . Aquí es donde se calculan y multiplican los coeficientes binomiales y .w ( Mmw( W(Mm)(Ww)
scrabble <- function(sword, n.wild=2, rack=7,
alphabet=c(a=9,b=2,c=2,d=4,e=12,f=2,g=3,h=2,i=9,j=1,k=1,l=4,m=2,
n=6,o=8,p=2,q=1,r=6,s=4,t=6,u=4,v=2,w=2,x=1,y=2,z=1),
N=sum(alphabet)+n.wild) {
word = sort(table(strsplit(sword, NULL))) # Sorting speeds things a little
a <- sapply(names(word), function(s) alphabet[s])
names(a) <- names(word)
x <- sapply(0:n.wild, function(w) {
sapply(sum(word):rack-w,
function(i) {
f(i, word, a, wild=w) *
choose(n.wild, w) * choose(N-n.wild-sum(a), rack-w-i)
})
})
return(list(numerator = sum(x), denominator = choose(N, rack),
value=sum(x) / choose(N, rack)))
}
Probemos esta solución y cronometremos a medida que avanzamos. La siguiente prueba utiliza las mismas entradas empleadas en las simulaciones de @Rasmus Bååth :
system.time(x <- sapply(c("boot", "red", "axe", "zoology"), scrabble))
Esta máquina reporta segundos de tiempo total transcurrido: razonablemente rápido. ¿Los resultados?0.05
> x
boot red axe zoology
numerator 114327888 1249373480 823897928 11840
denominator 16007560800 16007560800 16007560800 16007560800
value 0.007142118 0.07804896 0.0514693 7.396505e-07
La probabilidad de "arranque" de es exactamente igual al valor obtenido en mi otra respuesta (que utiliza un método similar pero lo formula en un marco más potente que requiere una plataforma de computación de álgebra simbólica). Las probabilidades para las cuatro palabras son razonablemente cercanas a las simulaciones de Bååth (que no podría esperarse que proporcione un valor exacto para "zoología" debido a su baja probabilidad de que es menos de uno en un millón).2381831 / 333490850 11840 / 16007560800 ,114327888/160075608002381831/33349085011840/16007560800,