यह बच्चों के लिए गतिविधि कार्ड के एक सेट से एक शब्द का खेल है। नियमों के नीचे / usr / शेयर / तानाशाह / शब्दों का उपयोग करके सबसे अच्छा ट्रिपल खोजने के लिए कोड है। मुझे लगा कि यह एक दिलचस्प अनुकूलन समस्या है, और मैं सोच रहा हूं कि क्या लोग सुधार पा सकते हैं।
नियम
- नीचे दिए गए प्रत्येक सेट में से एक अक्षर चुनें।
- चुने हुए अक्षरों (और किसी भी अन्य) का उपयोग करके एक शब्द चुनें।
- शब्द स्कोर करें।
- चुने हुए सेट के प्रत्येक अक्षर को सेट (दोहराए गए शामिल) के साथ दिखाया गया नंबर मिलता है।
AEIOU
गिनती ०- अन्य सभी अक्षर -2 हैं
- 1-3 से ऊपर चरणों को दोहराएं (चरण 1 में कोई पुन: उपयोग करने वाले पत्र नहीं) दो बार और।
- फाइनल स्कोर तीन शब्द स्कोर का योग है।
सेट
(1 अंक 1 अंक, 2 अंक 2 अंक, आदि सेट करें)
- LTN
- आरडीएस
- जीबीएम
- सीपीएच
- FWV
- YKJ
- QXZ
कोड:
from itertools import permutations
import numpy as np
points = {'LTN' : 1,
'RDS' : 2,
'GBM' : 3,
'CHP' : 4,
'FWV' : 5,
'YKJ' : 6,
'QXZ' : 7}
def tonum(word):
word_array = np.zeros(26, dtype=np.int)
for l in word:
word_array[ord(l) - ord('A')] += 1
return word_array.reshape((26, 1))
def to_score_array(letters):
score_array = np.zeros(26, dtype=np.int) - 2
for v in 'AEIOU':
score_array[ord(v) - ord('A')] = 0
for idx, l in enumerate(letters):
score_array[ord(l) - ord('A')] = idx + 1
return np.matrix(score_array.reshape(1, 26))
def find_best_words():
wlist = [l.strip().upper() for l in open('/usr/share/dict/words') if l[0].lower() == l[0]]
wlist = [l for l in wlist if len(l) > 4]
orig = [l for l in wlist]
for rep in 'AEIOU':
wlist = [l.replace(rep, '') for l in wlist]
wlist = np.hstack([tonum(w) for w in wlist])
best = 0
ct = 0
bestwords = ()
for c1 in ['LTN']:
for c2 in permutations('RDS'):
for c3 in permutations('GBM'):
for c4 in permutations('CHP'):
for c5 in permutations('FWV'):
for c6 in permutations('YJK'):
for c7 in permutations('QZX'):
vals = [to_score_array(''.join(s)) for s in zip(c1, c2, c3, c4, c5, c6, c7)]
ct += 1
print ct, 6**6
scores1 = (vals[0] * wlist).A.flatten()
scores2 = (vals[1] * wlist).A.flatten()
scores3 = (vals[2] * wlist).A.flatten()
m1 = max(scores1)
m2 = max(scores2)
m3 = max(scores3)
if m1 + m2 + m3 > best:
print orig[scores1.argmax()], orig[scores2.argmax()], orig[scores3.argmax()], m1 + m2 + m3
best = m1 + m2 + m3
bestwords = (orig[scores1.argmax()], orig[scores2.argmax()], orig[scores3.argmax()])
return bestwords, best
if __name__ == '__main__':
import timeit
print timeit.timeit('print find_best_words()', 'from __main__ import find_best_words', number=1)
मैट्रिक्स संस्करण वह है जो मैं शुद्ध अजगर में एक लिखने के बाद (स्वतंत्र रूप से प्रत्येक शब्द का उपयोग करके और स्कोरिंग करके) करता हूं, और मैट्रिक्स में एक और गुणा करके मैट्रिक्स गुणा के बजाय अनुक्रमण का उपयोग करता हूं।
अगला अनुकूलन पूरी तरह से स्कोरिंग से स्वरों को हटाने के लिए होगा (और एक संशोधित ord()
फ़ंक्शन का उपयोग करें ), लेकिन मुझे आश्चर्य है कि अगर बहुत तेज़ दृष्टिकोण हैं।
संपादित करें : जोड़ा गया timeit.timeit कोड
संपादित करें : मैं एक इनाम जोड़ रहा हूं, जिसे मैं सुधार दूंगा जो मुझे सबसे अधिक पसंद है (या संभवतः कई उत्तर हैं, लेकिन मुझे कुछ और प्रतिष्ठा अर्जित करनी होगी अगर ऐसा है)।