2009-07-20 14 views
6

कुछ गेम के लिए जहां किसी को ढीले अक्षरों के समूह से एनाग्राम ढूंढने की आवश्यकता होगी, मैंने सभी संभावित एनाग्राम खोजने के लिए क्रमपरिवर्तन एल्गोरिदम लागू करने और ज्ञात पत्र स्थितियों के लिए आवश्यक होने पर फ़िल्टर करने के लिए समाप्त किया (-match रास्ते में बढ़िया है)। लेकिन लंबे शब्दों के लिए यह बहुत गड़बड़ी साबित हुआ, क्योंकि गंदगी की एक बड़ी सूची को स्किम करने से वास्तव में उन उचित शब्दों को प्रकट नहीं किया जाता है जो छुपाए गए थे।पावरहेल, किस तरह के सेट चौराहे अंतर्निहित?

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

के बाद से अलग ढंग से पी एस काम में कई ऑपरेटरों संग्रह के साथ मैंने सोचा कि मैं वैसे ही जैसे

$wordlist -contains $permlist 

कुछ करना और चौराहे वापस मिल सकता है। दुर्भाग्य से यह इतना आसान नहीं है। अन्य विकल्प मैं के बारे में सोचा है एक सूची से अधिक पुनरावृति करने के लिए हो सकता है और प्रत्येक आइटम के लिए एक -contains करना होगा:

$permlist | ? { $wordlist -contains $_ } 

यह शायद काम करेगा, लेकिन यह भी बहुत धीमी गति से, मुझे लगता है कि है (खासकर जब $wordlist एक gc wordlist.txt का परिणाम है)। या मैं एक विशाल नियमित अभिव्यक्ति का निर्माण कर सकता हूं:

$wordlist -matches (($permlist | %{ "^$_`$" }) -join "|") 

लेकिन शायद यह बहुत तेज़ नहीं होगा। मैं शायद findstr का उपयोग विशाल विशाल रेगेक्स के साथ भी कर सकता हूं लेकिन यह गलत लगता है।

क्या कोई अंतर्निहित समाधान है जिसका मैं उपयोग कर सकता हूं और यह अब तक मेरे प्रयासों से बेहतर है? अन्यथा मैं शायद शब्द सूची को हैशटेबल में रखूंगा और पुनरावृत्त -contains दृष्टिकोण का उपयोग करूँगा जो तब पर्याप्त तेज़ होना चाहिए।

उत्तर

6
$left = New-HashSet string 
$left.Add("foo") 
$left.Add("bar") 
$right = New-HashSet string 
$right.Add("bar") 
$right.Add("baz") 

$left.IntersectWith($right) 
$left.UnionWith($right) 

(नई HashSet उधार Josh Einstein से)

चेतावनी: HashSet पर उन तरीकों में जगह एल्गोरिदम कि मूल संग्रह को संशोधित कर रहे हैं।आप कार्यात्मक शैली अपरिवर्तनीय वस्तुओं पर बदलना चाहते हैं, आप पार्टी के लिए LINQ लाने के लिए की आवश्यकता होगी:

add-type system.core 

$asqueryable = [system.linq.queryable].getmethods() | ? { $_.name -eq "AsQueryable" } | select -first 1 
$asqueryable = $asqueryable.MakeGenericMethod([string]) 
$leftAsQueryable = $asqueryable.Invoke($null, (,$left)) 

$intersect = [system.linq.queryable].getmethods() | ? { $_.name -eq "Intersect" } | select -first 1 
$intersect = $intersect.MakeGenericMethod([string]) 
$result = $intersect.Invoke($null, ($leftAsQueryable, $right)) 

जाहिर है, कोई एक दोस्ताना cmdlet में इस स्थिर-सामान्य प्रतिबिंब बकवास रैप करने के लिए की जरूरत है! चिंता न करें, मैं इस पर काम कर रहा हूं ...

+0

ठीक है, यह मेरे दृष्टिकोण के बारे में होता। निश्चित रूप से सुंदर नहीं है। (और निश्चित रूप से cmdline से अनचाहे उपयोग के लिए उपयुक्त नहीं है)। – Joey

0

आप शब्दों की अपनी सूची का जादू-जांच कर सकते हैं और मानक शब्दकोश के खिलाफ सभी वर्तनी त्रुटियों को खत्म कर सकते हैं।

GNU aspell पैकेज इंस्टॉल होने के बाद

,

cat text.txt | aspell list 

आप सभी मिस-लिखे गए शब्दों की एक सूची दे देंगे।
आप aspell के साथ अन्य शब्दकोशों के साथ काम कर सकते हैं।


या बस anagram generator like this one made for Scrabble players पिकअप करें।

क्रांति शब्द खोजक के पास दो विकल्प हैं; एक एनाग्राम खोजक और एक स्क्रैबल सॉल्वर। एनाग्राम फाइंडर अक्षरों की एक सूची लेता है और सभी वैध एनाग्राम देता है जिसे शब्दों की एक निश्चित सूची के सापेक्ष उपयोग करके बनाया जा सकता है। प्रत्येक एनाग्राम को SOWPODS शब्द सूची के विरुद्ध वैधता के लिए चेक किया गया है जो मौजूदा अंतर्राष्ट्रीय स्क्रैबल टूर्नामेंट में उपयोग की जाने वाली शब्द सूची है।

+0

"आप शब्दों की अपनी सूची का जादू-जांच कर सकते हैं और मानक शब्दकोश के खिलाफ सभी वर्तनी त्रुटियों को खत्म कर सकते हैं।" खैर, यह वही है जो मैं कोशिश कर रहा था। हालांकि, यह मुझे कुछ भी नहीं बताता है कि यह वास्तव में कैसे प्राप्त किया जाए, मेरे प्रश्न को कम से कम आंशिक रूप से हटा दें। – Joey

+0

क्षमा करें, मेरा मतलब आपके वर्तनी जांच बिंदु को साइड करने का मतलब नहीं था, मैंने जो मतलब बताया उस पर एक संदर्भ जोड़ा है। मैं कह रहा था कि मैच-सूची तैयार करने के लिए आपके पास मानक उपकरण हैं। – nik

+0

हम्म, ठीक है, हालांकि यह "पावरहेल अंतर्निर्मित" समाधान बहुत अधिक नहीं है। मैं शायद कार्यालय वर्तनी परीक्षक को काम करने के लिए भी मजबूर कर सकता हूं लेकिन शायद इसके लिए मैं इसके लिए क्या करना चाहता हूं उससे परे है। मुझे गलत वर्तनी वाले शब्दों की एक सूची भी मुझे मदद नहीं करेगी क्योंकि मुझे सही वर्तनी वाले शब्दों की एक सूची की आवश्यकता होगी :) (प्रश्न में गेम http://www.kongregate.com/games/Morpheme/ है ब्लॉक-टू-अक्षरों पर और कुछ स्तरों पर मैंने जिस शब्द को बनाने के लिए आवश्यक शब्द भी ढूंढने के लिए संघर्ष किया, यही कारण है कि मैं हर क्रमपरिवर्तन को मजबूर कर रहा हूं और परिणामस्वरूप सूची में शब्दों की तलाश कर रहा हूं। – Joey

संबंधित मुद्दे