एक सूत्र का अनुरोध किया है। दुर्भाग्य से, स्थिति इतनी जटिल है कि ऐसा लगता है कि कोई भी सूत्र सभी संभावनाओं को मानने का एक गोल चक्कर होगा। इसके बजाय, यह उत्तर एक एल्गोरिथ्म प्रदान करता है जो द्विपदीय गुणांक के उत्पादों की रकम से युक्त सूत्र के लिए (ए) एक फार्मूला है और (बी) को कई प्लेटफार्मों पर पोर्ट किया जा सकता है।
इस तरह के एक सूत्र प्राप्त करने के लिए पारस्परिक रूप से संबंध तोड़ना समूहों में संभावनाओं को तोड़ने को दो तरह से: कितने पत्र के अनुसार नहीं शब्द में रैक में चयन किया जाता है (इस रहने दो m ) और कितने वाइल्डकार्ड (रिक्त स्थान) का चयन किया जाता के अनुसार ( इस रहने दो w )। देखते हैं जब r=7 रैक में टाइल्स, N उपलब्ध टाइल्स, M शब्द में नहीं पत्र के साथ उपलब्ध टाइल्स, और W=2 उपलब्ध रिक्त स्थान, द्वारा दिए गए संभव विकल्पों की संख्या है(m,w)
(Mm)(Ww)(N−M−Wr−m−w)
क्योंकि गैर-शब्द अक्षर, ब्लैंक और शब्द अक्षर की पसंद पर स्वतंत्र सशर्त हैं(m,w,r).
यह किसी शब्द को वर्तनी देने के तरीकों की संख्या को खोजने के लिए समस्या को कम करता है जब केवल शब्द के अक्षरों का प्रतिनिधित्व करने वाले टाइल्स से चयन किया जाता है , यह देखते हुए कि उपलब्ध हैं और टाइल्स का चयन किया जाएगा। स्थिति गड़बड़ है और कोई बंद सूत्र उपलब्ध नहीं लगता है। उदाहरण के लिए, ब्लैंक और आउट-ऑफ-शब्द अक्षर खींचे जाते हैं, "b", "o" और "t" टाइल्स से खींचे गए "बूट" को बाक़ी रखने के लिए ठीक चार अक्षर होंगे। । यह देखते हुए कि "बी" के, "ओ" के, औरwr−m−ww=0m=3286स्क्रैबल टाइल सेट में "t" की ड्राइंग (मल्टीसेट्स) "bboo", "bbot", "bbtt", "booo", "boot", "बोतल", "btt", "oooo की सकारात्मक संभावनाएँ हैं। "," ओट "," यूट "," ओट्ट ", और" टीटीटी ", लेकिन इनमें से केवल एक ही" बूट "है। और यह आसान मामला था! उदाहरण के लिए, रैक को दबाने पर "ओ", "बी" और "टी" टाइल्स से यादृच्छिक रूप से चुनी गई पांच टाइलें होती हैं, दोनों कंबलों के साथ, "बूट" वर्तनी के कई और तरीके हैं - और इसे जादू नहीं करना। उदाहरण के लिए, "बूट" को "__boott" और "__bbtt" से लिखा जा सकता है, लेकिन "__ttttt" से नहीं।
इस गिनती - समस्या का दिल - पुनरावर्ती रूप से नियंत्रित किया जा सकता है। मैं एक उदाहरण के साथ इसका वर्णन करूंगा। मान लें कि हम "बी", "ओ", और "टी" टाइल्स के संग्रह से एक रिक्त और चार और टाइलों के साथ "बूट" वर्तनी के तरीकों को गिनना चाहते हैं (शेष दो टाइलें गैर-रिक्त अक्षरों को दिखाती हैं {नहीं "बी", "ओ", "टी"})। पहले अक्षर पर विचार करें, "बी":
उपलब्ध "दो" टाइलों में से "बी" को " तरीके से खींचा जा सकता है। यह दोनों ओक्स और "टी" टाइलों के संग्रह से केवल तीन और टाइलों का उपयोग करके प्रत्यय "यूट" को वर्तनी के तरीकों की संख्या को गिनने की समस्या को कम करता है।(21)
एक रिक्त को "बी" के रूप में नामित किया जा सकता है। यह शेष रिक्त "ओ" और "टी" टाइलों के संग्रह से केवल तीन और टाइलों का उपयोग करके "oot" के तरीकों की संख्या गिनने की समस्या को कम करता है।
सामान्य तौर पर, चरण (1) और (2) - जो कि असम्बद्ध होते हैं और इसलिए संभाव्य गणनाओं के लिए योज्य रूप से योगदान करते हैं - को पहले अक्षर के लिए उपयोग किए जा सकने वाले रिक्त स्थान की संभावित संख्या पर लूप के रूप में लागू किया जा सकता है। कम हुई समस्या को पुनरावर्ती रूप से हल किया जाता है। आधार मामला तब होता है जब एक अक्षर शेष होता है, उस पत्र के साथ निश्चित संख्या में टाइलें उपलब्ध होती हैं, और रैक में कुछ रिक्त स्थान भी हो सकते हैं। हमें केवल यह सुनिश्चित करना होगा कि रैक में रिक्त स्थान की संख्या और उपलब्ध टाइल की संख्या उस पत्र की वांछित मात्रा प्राप्त करने के लिए पर्याप्त होगी।
यहाँ R
पुनरावर्ती चरण के लिए कोड है। rack
आम तौर पर बराबर होता है , अक्षरों की गिनती का एक सरणी है (जैसे कि ), एक समान संरचना है जो उन पत्रों के साथ उपलब्ध टाइलों की संख्या दे रही है, और रैक में होने वाले रिक्त स्थान की संख्या है।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))
}
इस फ़ंक्शन के लिए एक इंटरफ़ेस मानक स्क्रैबल टाइल्स को निर्दिष्ट करता है, किसी दिए गए शब्द को अपनी मल्टीसेट डेटा संरचना में परिवर्तित करता है, और और पर डबल योग करता है । यहाँ वह जगह है जहाँ द्विपद गुणांक और की गणना और गुणा की जाती है।mw(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)))
}
आइए हम इस समाधान को आजमाएं और इसे समय पर जाएं। निम्न परीक्षण @Rasmus Bååth द्वारा सिमुलेशन में नियोजित समान इनपुट का उपयोग करता है :
system.time(x <- sapply(c("boot", "red", "axe", "zoology"), scrabble))
यह मशीन सेकंड कुल बीता समय की रिपोर्ट करती है : यथोचित त्वरित। परिणाम?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
"बूट" की संभावना मेरे अन्य उत्तर में प्राप्त के मूल्य के बराबर है (जो एक समान विधि का उपयोग करता है लेकिन एक प्रतीकात्मक बीजगणित कंप्यूटिंग प्लेटफॉर्म की आवश्यकता वाले अधिक शक्तिशाली ढांचे में इसे couches करता है)। सभी चार शब्दों के लिए संभावनाएं बथुए के सिमुलेशन के करीब हैं (जो कि 11840/16007560800 की कम संभावना के कारण "जूलॉजी" के लिए एक सटीक मूल्य देने की उम्मीद नहीं की जा सकती है जो एक मिलियन में एक से कम है)।2381831 / 333490850 11840 / 16007560800 ,114327888/160075608002381831/33349085011840/16007560800,