स्क्रैबल में अक्षरों के एक बैग से एक शब्द नहीं खींचने की संभावना


27

मान लीजिए कि आपके पास टाइल के साथ एक बैग था , प्रत्येक उस पर एक पत्र के साथ। अक्षर 'A' के साथ टाइलें हैं , 'B' के साथ , और इसी तरह, और 'वाइल्डकार्ड' टाइल्स (हमारे पास ) हैं। मान लीजिए कि आपके पास शब्दों की सीमित संख्या के साथ एक शब्दकोश है। आप प्रतिस्थापन के बिना बैग से टाइल उठाते हैं । आप कैसे परिकलित किया जाएगा (या अनुमान) संभावना है कि आप शब्दकोश दिया से शून्य शब्द फार्म कर सकते हैं टाइल्स का चुनाव?nn बी एन * एन = एन + एन बी + ... + एन जेड + n * कश्मीर कश्मीरnAnBnn=nA+nB++nZ+nkk

स्क्रैबल (टीएम) से परिचित नहीं लोगों के लिए, वाइल्डकार्ड वर्ण का उपयोग किसी भी पत्र से मेल खाने के लिए किया जा सकता है। इस प्रकार [ BOOT ] शब्द 'B', '*', 'O', 'T' के साथ 'वर्तनी' हो सकता है।

समस्या के पैमाने का कुछ विचार देने के लिए, छोटा है, जैसे 7, लगभग 100 है, और शब्दकोश में आकार या छोटे के लगभग 100,000 शब्द हैं।एन केknk

संपादित करें: 'एक शब्द का रूप' से मेरा मतलब है कि लंबाई का एक शब्द से बड़ा नहीं है । इस प्रकार, यदि शब्द [ A ] शब्दकोष में है, तो बैग से एक भी 'A' खींचकर, एक ने 'एक शब्द' बनाया है। वाइल्डकार्ड की समस्या आम तौर पर सरल होती है यदि कोई मान सकता है कि शब्दकोश में लंबाई 1 के शब्द हैं। अगर वहाँ हैं, तो वाइल्डकार्ड का कोई भी ड्रॉ स्वचालित रूप से लंबाई 1 शब्द से मेल खा सकता है, और इस प्रकार कोई उस मामले पर ध्यान केंद्रित कर सकता है जहां वाइल्डकार्ड नहीं हैं। इस प्रकार समस्या के अधिक फिसलन रूप में शब्दकोश में कोई 1-अक्षर शब्द नहीं है।k

इसके अलावा, मुझे स्पष्ट रूप से बताना चाहिए कि जिस क्रम में पत्र बैग से खींचे गए हैं वह सारहीन है। किसी को शब्द के 'सही' क्रम में अक्षरों को खींचना नहीं है।


क्या यह ' प्रतिस्थापन के बिना कश्मीर टाइल उठाओ' नहीं होना चाहिए ? बहुत ही रोचक सवाल।

उफ़। वास्तव में यह होना चाहिए।
1

जहां तक ​​मुझे याद है स्क्रैबल एक अक्षर के शब्दों की अनुमति नहीं देता है, इसलिए कम से कम समस्या का वह हिस्सा हल हो जाए;)
निको

1
@ अच्छी बात है, लेकिन मुझे लगता है कि यह केवल मध्य खेल के लिए है। 1 अक्षर शब्दों को या तो एक पत्र खेलने की आवश्यकता नहीं है, या बोर्ड पर कहीं भी एक अक्षर रखने की अनुमति देगा, दोनों स्पष्ट रूप से अस्वीकार्य हैं। हालाँकि, मैं शुरुआती कदम के बारे में सोच रहा था। वास्तव में, प्रश्न को संक्षिप्त रूप से कहा जा सकता है, स्क्रैबल से परिचित लोगों के लिए, "क्या संभावना है कि पहले खिलाड़ी को पास करना होगा?"
shabbychef

@nico उस स्पष्टीकरण के लिए धन्यवाद। सैद्धांतिक रूप से एक समान मुद्दा शब्दों के रूप में सभी संभव दो-अक्षर संयोजन वाले शब्दकोशों में संबंधित है: जब ऐसा होता है, तो 2 या अधिक अक्षरों के किसी भी हाथ में स्वचालित रूप से एक शब्द होता है। मध्य-खेल के बारे में @ shabbychef की टिप्पणी से पता चलता है कि मूल प्रश्न अधिकतर स्क्रैबल के लिए कितना अप्रासंगिक है, क्योंकि मध्य-खेल में आपके पास 7 अक्षरों के अतिरिक्त शब्द भागों (उपसर्ग, प्रत्यय और यहां तक ​​कि मध्य खंड) की एक सरणी उपलब्ध है। हाथ। यह एक शब्द बनाने में सक्षम होने की संभावना को बहुत बढ़ाता है।
whuber

जवाबों:


14

यह एक अच्छा (लंबी!) टिप्पणी है @vqv ने इस सूत्र में पोस्ट किया है। इसका उद्देश्य निश्चित उत्तर प्राप्त करना है। उन्होंने डिक्शनरी को सरल बनाने का कठिन काम किया है। जो कुछ बचता है, उसका पूरा-पूरा फायदा उठाना है। उनके परिणामों से पता चलता है कि एक जानवर बल समाधान संभव है । आखिरकार, वाइल्डकार्ड सहित, ज्यादातर शब्द हैं, जो 7 अक्षरों के साथ बना सकते हैं, और यह 1/10000 से कम की तरह दिखता है - कहते हैं, एक मिलियन के आसपास - कुछ मान्य को शामिल करने में विफल रहेगा शब्द। 277=10,460,353,203

पहला कदम वाइल्डकार्ड वर्ण के साथ न्यूनतम शब्दकोश को बढ़ाना है, "?"। 22 अक्षर दो-अक्षर के शब्दों में प्रकट होते हैं (सभी लेकिन c, q, v, z)। उन 22 अक्षरों में वाइल्डकार्ड को शामिल करें और इन्हें शब्दकोश में जोड़ें: {a;? B ?, d ?, ..., y?} अब अंदर हैं। इसी तरह हम न्यूनतम तीन अक्षरों वाले शब्दों का निरीक्षण कर सकते हैं, जिससे कुछ अतिरिक्त शब्द बन सकते हैं। शब्दकोश में दिखाई देने के लिए। अंत में, हम "??" जोड़ते हैं शब्दकोश में। पुनरावृत्ति को हटाने के परिणामस्वरूप, इसमें 342 न्यूनतम शब्द शामिल हैं।

आगे बढ़ने का एक सुंदर तरीका - वह जो वास्तव में एन्कोडिंग की बहुत कम मात्रा का उपयोग करता है - इस समस्या को बीजगणितीय के रूप में देखना है । अक्षरों के अनियंत्रित सेट के रूप में माना जाने वाला शब्द, केवल एक मोनोमियल है। उदाहरण के लिए, "स्पैट्स" मोनोमियल । शब्दकोश इसलिए मोनोमियल का एक संग्रह है। ऐसा लग रहा हैaps2t

{a2,ab,ad,...,ozψ,wxψ,ψ2}

(जहां, भ्रम से बचने के लिए, मैंने वाइल्डकार्ड वर्ण के लिए लिखा है )।ψ

एक रैक में एक वैध शब्द होता है अगर और केवल अगर वह शब्द रैक को विभाजित करता है।

एक और अधिक सार है, लेकिन अत्यंत शक्तिशाली, जिस तरह से यह कहना है कि शब्दकोश एक आदर्श उत्पन्न करता है बहुपद रिंग में और जो मान्य साथ रैक भागफल रिंग में शब्द शून्य हो जाते हैं , जबकि मान्य शब्दों के बिना रैक भागफल में नॉनजरो बने रहते हैं। यदि हम में सभी रैक का योग बनाते हैं और इस भागफल की अंगूठी में गणना करते हैं, तो शब्दों के बिना रैक की संख्या भागफल में अलग-अलग मोनोमियल की संख्या के बराबर होती है।आर = जेड [ एक , , ... , जेड , ψ ] आर / मैं आरIR=Z[a,b,,z,ψ]R/IR

इसके अलावा, में सभी रैक का योग व्यक्त करने के लिए सीधा है। आज्ञा दें वर्णमाला के सभी अक्षरों का योग हो। में प्रत्येक रैक के लिए एक मोनोमियल है। (एक अतिरिक्त बोनस के रूप में, इसके गुणांक प्रत्येक रैक को बनाने के तरीकों की संख्या की गणना करते हैं, अगर हम चाहें तो इसकी संभावना की गणना करने की अनुमति देते हैं।)अल्फा = एक + + + z + ψ अल्फा 7Rα=a+b++z+ψα7

एक साधारण उदाहरण के रूप में (यह देखने के लिए कि यह कैसे काम करता है), मान लीजिए (ए) हम वाइल्डकार्ड और (बी) का उपयोग नहीं करते हैं "x" के माध्यम से सभी अक्षरों को शब्द माना जाता है। तब केवल संभावित रैक जिसमें से शब्द नहीं बन सकते, पूरी तरह से y और z के होते हैं। हम modulo को आदर्श रूप से द्वारा उत्पन्न करते हैं , एक बार में एक कदम, इस प्रकार: { एक , , , ... , एक्स }α=(a+b+c++x+y+z)7{a,b,c,,x}

α0=1α1=a+b+c++x+y+zy+zmodIα2(y+z)(a+b++y+z)(y+z)2modIα7(y+z)6(a+b++y+z)(y+z)7modI.

हम अंतिम उत्तर से गैर-शब्द रैक होने की संभावना को पढ़ सकते हैं : प्रत्येक गुणांक उन तरीकों को गिनाता है जिसमें संबंधित रैक को खींचा जा सकता है। उदाहरण के लिए, 2 y और 5 z को खींचने के लिए 21 (26 ^ 7 संभावित में से) तरीके हैं क्योंकि का गुणांक 21 के बराबर है।y7+7y6z+21y5z2+35y4z3+35y3z4+21y2z5+7yz6+z7y2z5

प्रारंभिक गणना से, यह स्पष्ट है कि यह सही उत्तर है। पूरे बिंदु यह है कि यह प्रक्रिया शब्दकोश की सामग्री की परवाह किए बिना काम करती है।

ध्यान दें कि प्रत्येक चरण में आदर्श को शक्ति मोड्यूल को कम करने से गणना कम हो जाती है: इस दृष्टिकोण से पता चला शॉर्टकट। (उदाहरण का अंत।)

बहुपद बीजगणित प्रणालियां इन गणनाओं को लागू करती हैं । उदाहरण के लिए, यहाँ गणित कोड है:

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]

(इस शब्दकोष का निर्माण @ vqv के min.dict से सीधे तरीके से किया जा सकता है; मैंने यह दर्शाने के लिए यहां एक पंक्ति लगाई है कि यह सीधे तौर पर निर्दिष्ट करने के लिए पर्याप्त है जो आपको पसंद आए।)

आउटपुट - जो दस मिनट की गणना करता है - 577958 है। ( एनबी इस संदेश के पहले संस्करण में मैंने शब्दकोश तैयार करने में एक छोटी सी गलती की थी और 577940 प्राप्त किया था। मैंने अब जो उम्मीद की है उसे प्रतिबिंबित करने के लिए पाठ संपादित किया है। सही परिणाम!) लाख से थोड़ा कम या तो मुझे उम्मीद थी, लेकिन परिमाण के समान आदेश।

इस तरह के रैक को प्राप्त करने के अवसर की गणना करने के लिए , हमें उन तरीकों की संख्या के बारे में ध्यान देने की आवश्यकता है जिनमें रैक को खींचा जा सकता है। जैसा कि हमने उदाहरण में देखा, यह इसके गुणांक in बराबर है । कुछ ऐसे रैक खींचने का मौका इन सभी गुणांकों का योग है, जो आसानी से सभी अक्षरों को 1 के बराबर सेट करके पाया जाता है:α7

nonwords /. (# -> 1) & /@ (List @@ alphabet)

उत्तर 1066056120 के बराबर होता है, एक रैक खींचने का 10.1914% का मौका देता है जिसमें से कोई वैध शब्द नहीं बनाया जा सकता है (यदि सभी पत्र समान रूप से होने की संभावना है)।

जब अक्षरों की संभावनाएं बदलती हैं, तो प्रत्येक अक्षर को उसके आकर्षित होने की संभावना से बदल दें:

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)

आउटपुट 1.079877553303% है, सटीक उत्तर (एक अनुमानित मॉडल का उपयोग करते हुए, प्रतिस्थापन के साथ ड्राइंग )। पीछे मुड़कर देखें, तो डेटा दर्ज करने के लिए चार लाइनें लगीं (वर्णमाला, शब्दकोश, और वर्णमाला आवृत्तियां) और काम करने के लिए केवल तीन लाइनें: वर्णन करें कि अगली शक्ति of modulo को कैसे लें, 7 वीं शक्ति को पुनरावर्ती और स्थानापन्न करें पत्रों के लिए संभावनाएं।αI


+1 लेक्सिकॉन से जुड़ना और फिर इसे कम से कम करना एक चतुर विचार है। बीजगणित मेरे से परे है, लेकिन ऐसा लगता है कि आप हाइपरोमेट्रिक के बजाय एक बहुराष्ट्रीय संभावना की गणना कर रहे हैं। तो संभावना प्रतिस्थापन के साथ नमूने के लिए है । मुझे लगता है कि यह बताता है कि 1.08% का आपका उत्तर 0.4% के मेरे अनुमान से इतना बड़ा क्यों है। क्या प्रतिस्थापन के बिना नमूने को संभालने के लिए अपने दृष्टिकोण को संशोधित करने का एक तरीका है?
vqv

2
@vqv हां। अब जब हमारे पास कोई भी शब्द नहीं है, तो आधे मिलियन या इतने रैक की एक सूची है, यह सीधा है (कोड की अंतिम दो पंक्तियों को बदलकर) प्रत्येक रैक की संभावना की गणना करने के लिए (प्रतिस्थापन के बिना) और हाइपरजोमेट्रिक परिणाम प्राप्त करना। सटीक उत्तर 349870667877/80678106432000 = 0.43366% के बराबर है । एन = 100 के परीक्षणों के साथ आपका एसई 0.021% है, इसलिए आपका उत्तर 0.38% और 0.49% (दो तरफा 99% CI) के बीच होना चाहिए। मुझे खुशी है कि हमारे जवाब सहमत हैं!
whuber

क्या आप दोस्तों के साथ शब्द (डब्ल्यूडब्ल्यूएफ) टाइल वितरण का उपयोग करके गणना चला सकते हैं? 0.4% का मेरा अनुमान डब्ल्यूडब्ल्यूएफ लेक्सिकॉन और डब्ल्यूडब्ल्यूएफ टाइल वितरण पर आधारित है। मुझे लगता है कि आप डब्ल्यूडब्ल्यूएफ लेक्सिकॉन के साथ स्क्रैबल टाइल वितरण का उपयोग कर रहे हैं।
vqv

उफ़। वास्तव में सटीक उत्तर 349870675899 है (मैं अपने शब्दकोश में एक त्रुटि के कारण 8022 बंद था।) यह सौभाग्य से कोई व्यावहारिक अंतर नहीं करता है।
whuber

@vqv मैं विभिन्न टाइल वितरण से परिचित नहीं हूँ। मैंने सीधे आपके कोड से नकल की (और मैंने आपके शब्दकोश का उपयोग किया) :-)। यदि आप का मतलब है कि वितरण में osxreality.com/2010/01/01/… है , तो मुझे 1.15444% (प्रतिस्थापन के साथ), 0.43366% (प्रतिस्थापन के बिना) प्राप्त होता है। दूसरी संख्या वास्तव में 8 वें महत्वपूर्ण आंकड़े पर स्क्रैबल आवृत्तियों से भिन्न होती है।
whuber

14

एक रैक को खींचना बहुत कठिन है जिसमें स्क्रैबल और इसके वेरिएंट में कोई वैध शब्द नहीं है। नीचे एक आर कार्यक्रम है जो मैंने इस संभावना का अनुमान लगाने के लिए लिखा था कि प्रारंभिक 7-टाइल रैक में एक वैध शब्द नहीं है। यह एक मोंटे कार्लो दृष्टिकोण और फ्रेंड्स विथ फ्रेंड्स लेक्सिकॉन का उपयोग करता है (मुझे आधिकारिक स्क्रैबल लेक्सिकॉन एक आसान प्रारूप में नहीं मिला)। प्रत्येक ट्रायल में 7-टाइल रैक को खींचना और फिर यह जांचना होता है कि रैक में एक वैध शब्द है या नहीं।

न्यूनतम शब्द

यदि रैक में एक वैध शब्द है, तो आपको यह जांचने के लिए पूरे लेक्सिकॉन को स्कैन करने की आवश्यकता नहीं है। आपको बस न्यूनतम शब्दों से मिलकर एक न्यूनतम शब्द को स्कैन करने की आवश्यकता है । एक शब्द कम से कम है अगर इसमें एक उपसमूह के रूप में कोई अन्य शब्द नहीं है। उदाहरण के लिए 'इम' एक न्यूनतम शब्द है; 'खाली' नहीं है। इस का मुद्दा यह है कि अगर एक रैक शब्द है है x तो यह भी के किसी भी सबसेट शामिल होना चाहिए एक्स । दूसरे शब्दों में: एक रैक में कोई शब्द नहीं होता है अगर उसमें कोई न्यूनतम शब्द नहीं है। सौभाग्य से, लेक्सिकॉन में अधिकांश शब्द न्यूनतम नहीं हैं, इसलिए उन्हें समाप्त किया जा सकता है। आप क्रमपरिवर्तन समतुल्य शब्दों का विलय भी कर सकते हैं। मैं 172,820 से लेकर 201 न्यूनतम शब्दों तक दोस्तों के साथ शब्दों को कम करने में सक्षम था।

पत्रों पर वितरण के रूप में रैक और शब्दों का उपचार करके वाइल्डकार्ड को आसानी से नियंत्रित किया जा सकता है। हम जांचते हैं कि क्या एक रैक में दूसरे से एक वितरण को घटाकर एक शब्द है। यह हमें रैक से गायब प्रत्येक अक्षर की संख्या देता है। यदि उन संख्याओं का योग वाइल्डकार्ड की संख्या है, तो शब्द रैक में है।

मोंटे कार्लो दृष्टिकोण के साथ एकमात्र समस्या यह है कि जिस घटना में हम रुचि रखते हैं वह बहुत दुर्लभ है। तो यह एक छोटे से पर्याप्त मानक त्रुटि के साथ एक अनुमान प्राप्त करने के लिए कई, कई परीक्षणों को लेना चाहिए। मैंने परीक्षणों के साथ अपना कार्यक्रम (नीचे की ओर चिपकाया) चलाया और 0.004 की अनुमानित संभावना मिली कि प्रारंभिक रैक में एक वैध शब्द नहीं है । उस अनुमान की अनुमानित मानक त्रुटि 0.0002 है। लेक्सिकॉन को डाउनलोड करने सहित, मेरे मैक प्रो पर चलने में बस कुछ मिनट लगे।N=100,000

मुझे यह देखने में दिलचस्पी होगी कि क्या कोई व्यक्ति एक कुशल सटीक एल्गोरिदम के साथ आ सकता है। समावेशन-अपवर्जन पर आधारित एक भोली दृष्टिकोण ऐसा लगता है कि इसमें एक विस्फोट विस्फोट शामिल हो सकता है।

समावेशन-बहिष्कार

मुझे लगता है कि यह एक बुरा समाधान है, लेकिन यहां वैसे भी एक अधूरा स्केच है। सिद्धांत रूप में आप गणना करने के लिए एक कार्यक्रम लिख सकते हैं, लेकिन विनिर्देश अत्याचारी होगा।

जिस गणना की हम गणना करना चाहते हैं वह है दाहिनी ओर की संभावना के अंदर की घटना घटनाओं का एक संघ है: जहाँ एक न्यूनतम लेक्सिकॉन होता है। हम समावेश-बहिष्करण सूत्र का उपयोग करके इसका विस्तार कर सकते हैं। इसमें उपरोक्त घटनाओं के सभी संभावित चौराहों पर विचार करना शामिल है। चलो की शक्ति सेट को निरूपित , के सभी संभव सबसेट के सेट यानी । फिर

P(k-tile rack does not contain a word)=1P(k-tile rack contains a word).
P(k-tile rack contains a word)=P(xM{k-tile rack contains x}),
MP(M)MM
P(k-tile rack contains a word)=P(xM{k-tile rack contains x})=j=1|M|(1)j1SP(M):|S|=jP(xS{k-tile rack contains x})

निर्दिष्ट करने के लिए आखिरी बात यह है कि ऊपर की अंतिम पंक्ति पर संभावना की गणना कैसे करें। इसमें एक बहुभिन्नरूपी हाइपरजोमेट्रिक शामिल है। वह घटना है जिसमें रैक में प्रत्येक शब्द । वाइल्डकार्ड्स की वजह से यह एक दर्द है। हम पर विचार करना होगा, कंडीशनिंग द्वारा, निम्नलिखित मामलों में से प्रत्येक: रैक में कोई वाइल्डकार्ड नहीं होता है, रैक में 1 वाइल्डकार्ड होता है, रैक में 2 वाइल्डकार्ड होते हैं, ...

xS{k-tile rack contains x}
S

फिर

P(xS{k-tile rack contains x})=w=0nP(xS{k-tile rack contains x}|k-tile rack contains w wildcards)×P(k-tile rack contains w wildcards).

मैं यहां रुकने जा रहा हूं, क्योंकि विस्तार लिखने के लिए अत्याचार कर रहा है और ज्ञानवर्धक बिल्कुल नहीं। इसे करने के लिए कंप्यूटर प्रोग्राम लिखना आसान है। लेकिन अब तक आपको यह देखना चाहिए कि समावेशन-अपवर्जन दृष्टिकोण अचूक है। इसमें शब्द शामिल हैं, जिनमें से प्रत्येक भी बहुत जटिल है। लेक्सिकॉन के लिए मैंने ऊपर विचार किया ।2 | एम | 3.2 × 10 602|M|2|M|3.2×1060

सभी संभव रैक स्कैनिंग

मुझे लगता है कि यह कम्प्यूटेशनल रूप से आसान है, क्योंकि न्यूनतम शब्दों के संभावित सबसेट की तुलना में कम संभव रैक हैं। हम क्रमिक रूप से संभव के सेट को कम करते हैंk-टाइल रैक जब तक हमें रैक का सेट नहीं मिल जाता है जिसमें कोई शब्द नहीं होता है। स्क्रैबल (या दोस्तों के साथ शब्द) के लिए संभावित 7-टाइल रैक की संख्या अरबों के दसियों में है। आर कोड की कुछ दर्जन लाइनों के साथ संभव शब्द शामिल नहीं करने वालों की संख्या की गणना करना। लेकिन मुझे लगता है कि आपको सभी संभावित रैक की गणना करने की तुलना में बेहतर करने में सक्षम होना चाहिए। उदाहरण के लिए, 'आ' एक न्यूनतम शब्द है। यह तुरंत एक से अधिक 'ए' वाले सभी रैक को समाप्त कर देता है। आप दूसरे शब्दों के साथ दोहरा सकते हैं। मेमोरी आधुनिक कंप्यूटर के लिए कोई समस्या नहीं होनी चाहिए। एक 7-टाइल स्क्रैबल रैक को भंडारण के 7 बाइट्स से कम की आवश्यकता होती है। कम से कम हम सभी संभव रैक को संग्रहीत करने के लिए कुछ गीगाबाइट का उपयोग करेंगे, लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है। कोई इस बारे में अधिक सोचना चाह सकता है।

मोंटे कार्लो आर कार्यक्रम

# 
#  scrabble.R
#  
#  Created by Vincent Vu on 2011-01-07.
#  Copyright 2011 Vincent Vu. All rights reserved.
# 

# The Words With Friends lexicon
# http://code.google.com/p/dotnetperls-controls/downloads/detail?name=enable1.txt&can=2&q=
url <- 'http://dotnetperls-controls.googlecode.com/files/enable1.txt'
lexicon <- scan(url, what=character())

# Words With Friends
letters <- c(unlist(strsplit('abcdefghijklmnopqrstuvwxyz', NULL)), '?')
tiles <- c(9, 2, 2, 5, 13, 2, 3, 4, 8, 1, 1, 4, 2, 5, 8, 2, 1, 6, 5, 7, 4, 
           2, 2, 1, 2, 1, 2)
names(tiles) <- letters

# Scrabble
# tiles <- c(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)


# Reduce to permutation equivalent words
sort.letters.in.words <- function(x) {
  sapply(lapply(strsplit(x, NULL), sort), paste, collapse='')
}

min.dict <- unique(sort.letters.in.words(lexicon))
min.dict.length <- nchar(min.dict)

# Find all minimal words of length k by elimination
# This is held constant across iterations:
#   All words in min.dict contain no other words of length k or smaller
k <- 1
while(k < max(min.dict.length))
{
  # List all k-letter words in min.dict
  k.letter.words <- min.dict[min.dict.length == k]

  # Find words in min.dict of length > k that contain a k-letter word
  for(w in k.letter.words)
  {
    # Create a regexp pattern
    makepattern <- function(x) {
      paste('.*', paste(unlist(strsplit(x, NULL)), '.*', sep='', collapse=''), 
            sep='')
    }
    p <- paste('.*', 
               paste(unlist(strsplit(w, NULL)), 
                     '.*', sep='', collapse=''), 
               sep='')

    # Eliminate words of length > k that are not minimal
    eliminate <- grepl(p, min.dict) & min.dict.length > k
    min.dict <- min.dict[!eliminate]
    min.dict.length <- min.dict.length[!eliminate]
  }
  k <- k + 1
}

# Converts a word into a letter distribution
letter.dist <- function(w, l=letters) {
  d <- lapply(strsplit(w, NULL), factor, levels=l)
  names(d) <- w
  d <- lapply(d, table)
  return(d)
}

# Sample N racks of k tiles
N <- 1e5
k <- 7
rack <- replicate(N,
                  paste(sample(names(tiles), size=k, prob=tiles), 
                        collapse=''))

contains.word <- function(rack.dist, lex.dist)
{
  # For each word in the lexicon, subtract the rack distribution from the 
  # letter distribution of the word.  Positive results correspond to the 
  # number of each letter that the rack is missing.
  y <- sweep(lex.dist, 1, rack.dist)

  # If the total number of missing letters is smaller than the number of 
  # wildcards in the rack, then the rack contains that word
  any(colSums(pmax(y,0)) <= rack.dist[names(rack.dist) == '?'])
}

# Convert rack and min.dict into letter distributions
min.dict.dist <- letter.dist(min.dict)
min.dict.dist <- do.call(cbind, min.dict.dist)
rack.dist <- letter.dist(rack, l=letters)

# Determine if each rack contains a valid word
x <- sapply(rack.dist, contains.word, lex.dist=min.dict.dist)

message("Estimate (and SE) of probability of no words based on ", 
        N, " trials:")
message(signif(1-mean(x)), " (", signif(sd(x) / sqrt(N)), ")")

वाह ... बहुत अच्छा अनुवर्ती।
मैट पार्कर 23

मुझे कुछ आश्चर्य हुआ कि यह 201 शब्दों तक कम हो गया। हालांकि पहले शब्द के लिए, हमारे घर के नियम 'I' और 'A' को शब्दों के रूप में स्वीकार करते हैं, जो संभवतः न्यूनतम शब्दों की संख्या को कम करेगा। मैं किसी को शामिल किए जाने के बहिष्कार-बहिष्कार विश्लेषण को देखने की उम्मीद कर रहा था, जो सुंदर बालों वाला होना चाहिए ...
shabbychef

@shabbychef लेक्सिकॉन में 1-अक्षर शब्द नहीं हैं। अधिकांश न्यूनतम शब्द 2- और 3-अक्षर वाले शब्द हैं। यहाँ न्यूनतम शब्द लंबाई का पूर्ण वितरण है: 2: 73, 3:86, 4:31, 5: 9, 6: 2। 6-अक्षर शब्द हैं: GLYCYL और SYZYGY।
vqv

@ शब्बीचेफ़ मैंने एक सटीक समावेश-बहिष्करण दृष्टिकोण के एक स्केच को शामिल करने के लिए अपना उत्तर अपडेट किया। यह बालों से भी बदतर है।
vqv

अच्छा कार्य! मुझे यह पसंद है कि यह सवाल, जिसे एक वाक्य (पर्याप्त पृष्ठभूमि वाले लोगों के लिए) के रूप में पेश किया जा सकता है, ने मोंटे कार्लो, समावेश-बहिष्करण, डीएजी, पेड़ों की खोज, बहुपद बीजगणित, और आपके सिमुलेशन की सैद्धांतिक रूप से पुष्टि की है। whuber। चियर्स!
shabbychef

7

श्रीकांत सही कहते हैं: मोंटे कार्लो अध्ययन एक रास्ता है। इसके दो कारण हैं। सबसे पहले, उत्तर दृढ़ता से शब्दकोश की संरचना पर निर्भर करता है । दो चरम सीमाएं हैं (1) शब्दकोश में हर संभव एकल-अक्षर शब्द शामिल है। इस मामले में, या अधिक अक्षरों के ड्रा में शब्द नहीं बनाने की संभावना शून्य है। (2) शब्दकोष में केवल एक अक्षर से बने शब्द होते हैं ( जैसे , "a", "aa", "aa", आदि )। अक्षरों के ड्रा में एक शब्द नहीं बनाने का मौका आसानी से निर्धारित होता है और स्पष्ट रूप से नॉनज़रो होता है। किसी भी निश्चित बंद-फॉर्म उत्तर को पूरे शब्दकोश संरचना को शामिल करना होगा और यह वास्तव में भयानक और लंबा सूत्र होगा।के1k

दूसरा कारण यह है कि एमसी वास्तव में संभव है: आपको इसे सही करना होगा। पूर्ववर्ती पैराग्राफ एक सुराग प्रदान करता है: केवल यादृच्छिक पर शब्द उत्पन्न न करें और उन्हें देखें; इसके बजाय, पहले शब्दकोश का विश्लेषण करें और इसकी संरचना का दोहन करें।

एक रास्ता शब्दकोश में शब्दों को एक पेड़ के रूप में दर्शाता है। पेड़ को खाली प्रतीक पर और प्रत्येक अक्षर पर शाखाओं को नीचे की तरफ जड़ दिया जाता है; इसकी पत्तियाँ (बेशक) स्वयं शब्द हैं। हालाँकि, हम पेड़ में हर शब्द के सभी क्रमिक क्रमांकन भी डाल सकते हैं, ( प्रत्येक शब्द के लिए तक)। यह कुशलता से किया जा सकता है क्योंकि किसी को उन सभी क्रमपरिवर्तन को संग्रहीत करने की आवश्यकता नहीं है; पेड़ में केवल किनारों को जोड़ने की जरूरत है। पत्तियाँ वही रहती हैं। वास्तव में, इस बात को आगे बढ़ाकर सरल बनाया जा सकता है कि पेड़ का वर्णमाला क्रम में पालन किया जाएk!1

दूसरे शब्दों में, यह निर्धारित करने के लिए कि क्या वर्णों का एक समूह शब्दकोश में है, पहले तत्वों को क्रमबद्ध क्रम में व्यवस्थित करें,kफिर मूल शब्द में शब्दों के क्रमबद्ध प्रतिनिधियों से निर्मित पेड़ में इस छंटे हुए "शब्द" को देखें। यह वास्तव में मूल पेड़ से छोटा होगा, क्योंकि यह सभी शब्दों को मिलाता है जो सॉर्ट-समतुल्य होते हैं, जैसे {रोक, पोस्ट, बर्तन, ऑप्स, स्पॉट}। वास्तव में, एक अंग्रेजी शब्दकोश में शब्दों का यह वर्ग कभी भी नहीं पहुंचेगा क्योंकि "ऐसा" पहले पाया जाएगा। इसे कार्रवाई में देखते हैं। सॉर्ट की गई मल्टीसेट "ओपस्ट" है; "ओ" केवल अक्षर {ओ, पी, ..., जेड} वाले सभी शब्दों के लिए शाखा होगा, "पी" केवल {ओ, पी, ..., जेड} और सभी पर युक्त सभी शब्दों के लिए शाखा होगा। एक "ओ", और अंत में "एस" पत्ती के लिए शाखा "ऐसा" होगा! (मैंने माना है कि प्रशंसनीय उम्मीदवारों में से कोई भी "ओ", "ऑप", "नहीं"

वाइल्डकार्ड को संभालने के लिए एक संशोधन की आवश्यकता होती है: मैं प्रोग्रामर के प्रकारों को आपके बारे में सोचने देता हूं। यह शब्दकोश का आकार नहीं बढ़ाएगा (इसे इसे कम करना चाहिए, वास्तव में); यह पेड़ की खाई को थोड़ा धीमा कर देगा, लेकिन इसे किसी भी मौलिक तरीके से बदलने के बिना। किसी भी ऐसे शब्दकोष में, जिसमें एक अक्षर वाला शब्द हो, जैसे अंग्रेजी ("a", "i"), कोई जटिलता नहीं है: वाइल्डकार्ड की उपस्थिति का मतलब है कि आप एक शब्द बना सकते हैं! (यह संकेत देता है कि मूल प्रश्न उतना दिलचस्प नहीं हो सकता जितना लगता है।)

नतीजा यह है कि एक भी शब्दकोश अनुसंधान एक छँटाई (a) है -letter मल्टीसेट और (ख) से अधिक नहीं traversing एक पेड़ के किनारों। चलने का समय । यदि आप चतुराई से क्रमबद्ध क्रम में यादृच्छिक मल्टीसेट्स उत्पन्न करते हैं (मैं ऐसा करने के लिए कई कुशल तरीकों के बारे में सोच सकता हूं), तो रनिंग टाइम तक कम हो जाता है । कुल चलने का समय प्राप्त करने के लिए पुनरावृत्तियों की संख्या से इसे गुणा करें।k O ( k log ( k ) ) O ( k )kkO(klog(k))O(k)

मुझे यकीन है कि आप इस अध्ययन को कुछ ही सेकंड में एक वास्तविक स्क्रैबल सेट और एक लाख पुनरावृत्तियों के साथ कर सकते हैं।


@ वाउचर पेड़ एक स्वच्छ विचार है (उस विचार के लिए उभार) लेकिन क्या इसके लिए बहुत अधिक स्मृति की आवश्यकता नहीं होगी? मुझे लगता है कि यह इस बात पर निर्भर करता है कि शब्दकोश कितना विविध है, लेकिन मैं अनुमान लगा रहा हूं कि एक बहुत ही विविध शब्दकोश के लिए कई पेड़ों की आवश्यकता होगी उदाहरण के लिए, 'b' वृक्ष उन सभी शब्दों के लिए 'a' के बजाय 'b' अक्षर से शुरू होगा जो नहीं उनमें 'क' है। इसी तरह, 'सी' ट्री उन शब्दों के लिए 'सी' अक्षर से शुरू होता है, जिनमें 'ए' और 'बी' नहीं होते हैं, लेकिन 'सी' होते हैं। मेरा प्रस्तावित प्रत्यक्ष दृष्टिकोण सरल लगता है क्योंकि इसके लिए शब्दकोष में सभी शब्दों के एक बार के ट्रावेल की आवश्यकता होती है, नहीं?

1
@ श्रीकांत: इस पेड़ के साथ शुरू करने के लिए पूरे शब्दकोश को बंद करने की तुलना में कहीं कम रैम की आवश्यकता होगी। क्या आप वास्तव में कुछ मेगाबाइट रैम के बारे में चिंतित हैं, वैसे भी? BTW, केवल एक ही पेड़ है, कई नहीं: वे सभी खाली शब्द पर निहित हैं। आपका दृष्टिकोण, जैसा कि मैंने इसे समझा है, हर पुनरावृत्ति पर शब्दकोश (उनमें से 7 तक) की कई खोजों की आवश्यकता है , जिससे यह @shabbychef भय के रूप में अव्यावहारिक है। यह मदद करेगा कि क्या आप उस एल्गोरिथ्म पर विस्तार कर सकते हैं जो आपके मन में है जहाँ आप लिखते हैं "देखें कि क्या आप एक शब्द बना सकते हैं": जो बहुत सारे महत्वपूर्ण विवरणों को छिपाता है!
व्हिबर

@whuber: मुझे इस तथ्य का एहसास हुआ कि मेरी टिप्पणी पोस्ट करने के बाद केवल एक ही पेड़ है। मेरे दृष्टिकोण के बारे में- मैं सहमत हूं कि मेरा मोंटे कार्लो का प्रस्ताव फ़र्ज़ी है और आपका जवाब यह बताता है कि कोई व्यक्ति वास्तव में इस सेटिंग में मोंटे कार्लो को कैसे लागू कर सकता है। मेरा वास्तव में मतलब था कि प्रत्यक्ष दृष्टिकोण (मेरा उत्तर देखें) वास्तव में सरल हो सकता है क्योंकि उस दृष्टिकोण को शब्दकोश में एक मोंटे कार्लो के विपरीत एक बार के ऑपरेशन की आवश्यकता होती है जिसमें पेड़ पर कई हजारों पुनरावृत्तियों की आवश्यकता होती है। बस दृष्टिकोणों के सापेक्ष गुणों पर सोच रहा था।

@ श्रीकांत मैंने आपके सीधे दृष्टिकोण पर टिप्पणी करने से परहेज किया क्योंकि मुझे संदेह है कि इसे गलत उत्तर मिले। यह शब्दकोश संरचना के लिए खाता नहीं है: अर्थात्, शब्दों के बीच सबसेट संबंध। उदाहरण के लिए, क्या आपके सूत्र को उन सभी शब्दकोशों के लिए शून्य का सही उत्तर मिलेगा, जिनमें सभी संभव एक-अक्षर के शब्द हैं?
whuber

@ शुभंकर हम्म अच्छा अंक। शायद, मैं गलत सवाल का जवाब दे रहा हूं!

2

मोंटे कार्लो दृष्टिकोण

त्वरित और गंदे दृष्टिकोण एक मोंटे कार्लो अध्ययन करना है। ड्रा टाइल्स बार और से प्रत्येक ड्रॉ के लिए टाइलें दिखाई देती है, तो आप एक शब्द बना सकते हैं। आप कितनी बार द्वारा कोई शब्द बना सकते हैं, उसे निरूपित करें । वांछित संभावना होगी:m k m wkmkmw

1mwm

सीधा आगे बढ़ना

शब्दकोश में शब्दों की संख्या द्वारा दी गई है । बता दें कि उन तरीकों की संख्या है जिनसे हम शब्द बना सकते हैं। अक्षरों की संख्या को शब्द के द्वारा (यानी, शब्द द्वारा निरूपित किया । पत्र के लिए संख्या की जरूरत है। आदि)। उन शब्दों की संख्या को निरूपित करें जिन्हें हम द्वारा सभी टाइलों के साथ बना सकते हैं ।Sएस वें रों वें मीटर एक , मीटर , , एम जेड एस वें एम एनtssthsthma,mb,...,mzsthmaN

N=(nk)

तथा

ts=(nama)(nbmb)...(nzmz)

(वाइल्डकार्ड टाइल्स के प्रभाव को शामिल करना थोड़ा पेचीदा है। मैं उस मुद्दे को अभी के लिए टाल दूंगा।)

इस प्रकार, वांछित संभावना है:

1stsN

जल्दी और गंदे दृष्टिकोण इतनी जल्दी नहीं हो सकता है! शब्दकोश में 100,000 शब्द हो सकते हैं, और दी गई टाइलों के एक मैच की खोज एक कोडिंग आपदा हो सकती है।
shabbychef

@ शब्बीचेफ यह कुछ अच्छी तरह से वर्तनी जांचकर्ताओं के लिए किया जाता है। उदाहरण के लिए देखें n3labs.com/pdf/lexicon-squeeze.pdf

@shabbychef Reg monte-carlo- अगर शब्दकोश को क्रमबद्ध किया जाए तो मैच काफी तेज होना चाहिए ना? किसी भी मामले में, मैं पहले उल्लिखित प्रत्यक्ष दृष्टिकोण त्रुटिपूर्ण था। मैंने ठीक कर दिया। मेरे पहले के समाधान में समस्या यह थी कि एक ही शब्द को कई तरीके से बनाया जा सकता है (जैसे, 'बल्ले', 'बी * टी' आदि)।

1
@ शब्बीशेफ आगे प्रतिबिंब पर, मैं आपसे सहमत हूं कि मोंटे कार्लो दृष्टिकोण काम नहीं करेगा। एक मुद्दा यह है कि आपको यह पता लगाने की जरूरत है कि आप वास्तव में k टाइल्स के साथ कौन से शब्द बना सकते हैं और दूसरा यह है कि आप k टाइल्स के साथ कई शब्द बना सकते हैं। K टाइल्स से इन संयोजनों की गणना करना शायद इतना आसान नहीं है।

1
@ श्रीकांत धन्यवाद आपका सूत्र लगता है कि आपको शब्द बनाने के लिए सभी k अक्षरों का उपयोग करना होगा, लेकिन मुझे नहीं लगता कि ओपी पूछ रहा है। (ऐसा नहीं है कि स्क्रैबल कैसे खेला जाता है, वैसे भी।) उस निहित धारणा के साथ, आप सही रास्ते पर हैं, लेकिन आपको एल्गोरिथ्म को संशोधित करने की आवश्यकता है: आपको शब्दकोश में उन शब्दों के लिए गणना को दोहराना नहीं चाहिए जो एक दूसरे के क्रमपरिवर्तन हैं। उदाहरण के लिए, आपको अपने सूत्र में t_ {stop} और t_ {post} दोनों को घटाना नहीं चाहिए। (यह लागू करने के लिए एक आसान संशोधन है।)
whuber
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.