Eine Formel wird angefordert. Leider ist die Situation so kompliziert, dass es den Anschein hat, dass jede Formel nur ein Umweg ist, um alle Möglichkeiten aufzuzählen. Stattdessen bietet diese Antwort einen Algorithmus, der (a) einer Formel entspricht, die Produktsummen von Binomialkoeffizienten enthält, und (b) auf viele Plattformen portiert werden kann.
Um eine solche Formel zu erhalten, teilen Sie die Möglichkeiten auf zwei Arten in voneinander getrennte Gruppen auf: Je nachdem, wie viele Buchstaben nicht im Wort im Rack ausgewählt sind (sei dies ) und wie viele Platzhalter (Leerzeichen) ausgewählt sind ( lass das sein w ). Wenn sie r = 7 Kacheln in dem Gestell, N verfügbar Fliesen, M verfügbar Fliesen mit Buchstaben nicht in dem Wort, und W = 2 Zuschnitten verfügbar, da die Anzahl der möglichen Auswahl von ( m , w ) ist ,mwr=7NMW=2(m,w)
(Mm)(Ww)(N−M−Wr−m−w)
weil die Auswahl von Nicht-Wort-Buchstaben, Leerzeichen und Wort-Buchstaben unabhängig von (m,w,r).
Dies verringert das Problem, die Anzahl der Möglichkeiten zu finden, ein Wort zu buchstabieren, wenn nur aus den Kacheln ausgewählt wird, die die Buchstaben des Wortes darstellen, vorausgesetzt , Leerzeichen sind verfügbar und r - m - w Kacheln werden ausgewählt. Die Situation ist chaotisch und es scheint keine geschlossene Formel verfügbar zu sein. Zum Beispiel werden mit w = 0 Leerzeichen und m = 3 ausstehenden Buchstaben genau vier Buchstaben übrig bleiben, um "boot" zu buchstabieren, die aus den Kacheln "b", "o" und "t" gezogen wurden . Vorausgesetzt, es gibt 2 "b" 's, 8 "o"' s und 6wr−m−ww=0m=3286"t" im Scrabble-Kachelsatz gibt es positive Wahrscheinlichkeiten für das Zeichnen (Multisets) "bboo", "bbot", "bbtt", "booo", "boot", "bott", "bttt", "oooo" "," ooot "," oott "," ottt "und" tttt ", aber nur einer dieser Zauber" booten ". Und das war der einfache Fall! Angenommen, das Rack enthält fünf Kacheln, die nach dem Zufallsprinzip aus den Kacheln "o", "b" und "t" ausgewählt wurden. Zusammen mit beiden Leerzeichen gibt es viele weitere Möglichkeiten, "boot" zu buchstabieren - und nicht, es zu buchstabieren. Zum Beispiel kann "boot" von "__boott" und "__bbttt" geschrieben werden, aber nicht von "__ttttt".
Diese Zählung - das Herzstück des Problems - kann rekursiv behandelt werden. Ich werde es mit einem Beispiel beschreiben. Angenommen, wir möchten die Schreibweisen für "boot" mit einem Leerzeichen und vier weiteren Kacheln aus der Sammlung der Kacheln "b", "o" und "t" zählen (daher werden auf den verbleibenden beiden Kacheln nicht leere Buchstaben angezeigt, die nicht in {enthalten sind. "b", "o", "t"}). Betrachten Sie den ersten Buchstaben "b":
A "b" kann eingezogen werden Wege von den beiden verfügbaren "b" -Kacheln. Dies reduziert das Problem, die Anzahl der Schreibweisen für das Suffix "oot" unter Verwendung beider Leerzeichen und nur drei weiterer Kacheln aus der Sammlung von "o" - und "t" -Kacheln zu zählen.(21)
Ein Leerzeichen kann als "b" bezeichnet werden. Dies reduziert das Problem, die Anzahl der Schreibweisen "oot" unter Verwendung des verbleibenden Leerzeichens und nur drei weiterer Kacheln aus der Sammlung von "o" - und "t" -Kacheln zu zählen.
Im Allgemeinen können die Schritte (1) und (2) - die disjunkt sind und daher zusätzlich zu den Wahrscheinlichkeitsberechnungen beitragen - als Schleife über die mögliche Anzahl von Leerzeichen implementiert werden, die für den ersten Buchstaben verwendet werden können. Das reduzierte Problem wird rekursiv gelöst. Der Basisfall tritt auf, wenn nur noch ein Buchstabe übrig ist, eine bestimmte Anzahl von Kacheln mit diesem Buchstaben verfügbar ist und möglicherweise auch einige Leerzeichen im Rack vorhanden sind. Wir müssen nur sicherstellen, dass die Anzahl der Rohlinge im Rack plus die Anzahl der verfügbaren Kacheln ausreicht, um die gewünschte Menge des letzten Buchstabens zu erhalten.
Hier ist R
Code für den rekursiven Schritt. rack
in der Regel gleich , ist eine Reihe von Anzahlen der Buchstaben (wie z. B. ), ist eine ähnliche Struktur, die die Anzahl der verfügbaren Kacheln mit diesen Buchstaben angibt, und ist die Anzahl der Leerzeichen, von denen angenommen wird, dass sie im Rack vorkommen.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))
}
Eine Schnittstelle zu dieser Funktion spezifiziert die Standard-Scrabble-Kacheln, konvertiert ein gegebenes Wort in seine Multiset-Datenstruktur und führt die Doppelsumme über und w aus . Hier sind die Binomialkoeffizienten ( Mmw und ( W(Mm) werden berechnet und multipliziert.(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)))
}
Probieren wir diese Lösung aus und nehmen uns die Zeit dafür. Der folgende Test verwendet dieselben Eingaben, die in den Simulationen von @Rasmus Bååth verwendet wurden :
system.time(x <- sapply(c("boot", "red", "axe", "zoology"), scrabble))
Dieses Gerät meldet eine Gesamtzeit von Sekunden: ziemlich schnell. Die Ergebnisse?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
Die Wahrscheinlichkeit für „boot“ von entspricht genau den Wert 2381831 / 333490850 in erhielt meine andere Antwort (die ein ähnliches Verfahren verwendet , aber die Liegen sie in einem leistungsfähigeren Rahmen eine symbolische Algebra Computing - Plattform erfordert). Die Wahrscheinlichkeiten für alle vier Worte sind ziemlich nahe an Bååth der Simulationen (was erwartet werden konnte keine genauen Wert für „Zoologie“ wegen seiner geringen Wahrscheinlichkeit geben 11840 / 16007560800 , das weniger als eins zu einer Million).114327888/160075608002381831/33349085011840/16007560800,