मुझे लगता है कि आप इसे स्क्रैबल शैली की समस्या के रूप में वर्गीकृत कर सकते हैं, लेकिन यूके टीवी क्विज़ शो काउंटडाउन का उल्लेख करने वाले किसी मित्र के कारण यह शुरू हो गया। शो में विभिन्न दौरों में प्रतिभागियों को पत्रों का एक तंग सेट प्रस्तुत किया जाता है और उन्हें सबसे लंबे समय तक शब्द के साथ आना पड़ता है। मेरा एक दोस्त जिसका उल्लेख "रायपवेन" था।scrambled अक्षरों में शब्दों के लिए कुशल शिकार
काफी कम क्रम में मैंने पाइथन में इस समस्या को संभालने के लिए कुछ हद तक चाबुक लगाया, पीईएन्चेंट का उपयोग डिक्शनरी लुक-अप को संभालने के लिए किया, हालांकि मुझे लगता है कि यह वास्तव में उन सभी को स्केल नहीं कर सकता है।
#!/usr/bin/python
from itertools import permutations
import enchant
from sys import argv
def find_longest(origin):
s = enchant.Dict("en_US")
for i in range(len(origin),0,-1):
print "Checking against words of length %d" % i
pool = permutations(origin,i)
for comb in pool:
word = ''.join(comb)
if s.check(word):
return word
return ""
if (__name__)== '__main__':
result = find_longest(argv[1])
print result
यह एक 9 पत्र उदाहरण पर ठीक है जैसे वे इस शो में उपयोग करते हैं, 9 भाज्य = 362,880 और 8 भाज्य = 40,320:
यहाँ मैं वर्तमान में पड़ता है। उस पैमाने पर भी अगर उसे सभी संभावित क्रमिकताओं और शब्द की लंबाई की जांच करनी पड़ेगी तो यह बहुत से नहीं है।
हालांकि एक बार जब आप 14 वर्णों तक पहुंचे तो 87,178,291,200 संभावित संयोजन हैं, जिसका अर्थ है कि आप भाग्य पर निर्भर हैं कि एक 14 चरित्र शब्द जल्दी से पाया जाता है।
ऊपर दिए गए शब्द के साथ यह मेरी मशीन को "reawaken" खोजने के लिए 12 1/2 सेकंड के बारे में ले रहा है। 14 चरित्र scrambled शब्दों के साथ हम सभी संभव 14 चरित्र क्रमपरिवर्तन की जांच के लिए 23 दिनों के पैमाने पर बात कर सकते हैं।
क्या इसे संभालने का कोई और अधिक प्रभावी तरीका है?
मुझे यकीन नहीं है कि कितना कुशल जादूगर है।लेकिन क्या उन सभी शब्दों के साथ एक सूची खोजना संभव है जो * n * वर्ण लंबे हैं? यदि ऐसा है, तो आप उस सूची को स्मृति में लोड कर सकते हैं और enchant.check की बजाय * in * कर सकते हैं। मुझे लगता है कि यह लंबे शब्दों के लिए तेज़ है। लेकिन सूची छोटे शब्दों के लिए बहुत लंबी होगी। – Willian
@ विल्लियन, इस दृष्टिकोण को अपने दृष्टिकोण को वोट देने के लिए उत्तर के रूप में पोस्ट करें: शब्दकोश में क्रमपरिवर्तनों को पकड़ने के लिए इंस्टीट्यूट, वैध अक्षरों में सभी शब्दकोष शब्द अक्षरों की जांच करें। – danihp
फेयर प्वाइंट @ विल्लियन, मैंने इसे पायथन-एस्पेल बाइंडिंग के साथ भी लिखा था। ऐसा लगता है कि एनचेंट एक बाधा है, एस्पेल संस्करण में बहुत कम समय लगता है (लगभग आधे), हालांकि यह अभी भी बहुत लंबे समय तक ब्रूट फोर्स ले जा रहा है! आपके उत्तरों के लिए सभी को धन्यवाद, कुछ रोचक विचार। मैं उन्हें लागू करने की कोशिश करूंगा और देखेंगे कि हम किस तरह के गति अंतर देखेंगे। – Twirrim