이것은 어린이를위한 활동 카드 세트의 단어 게임입니다. 규칙 아래에는 / usr / share / dict / words를 사용하여 최상의 삼중 항을 찾는 코드가 있습니다. 흥미로운 최적화 문제라고 생각하고 사람들이 개선점을 찾을 수 있는지 궁금합니다.
규칙
- 아래의 각 세트에서 하나의 문자를 선택하십시오.
- 선택한 문자 (및 다른 문자)를 사용하여 단어를 선택하십시오.
- 단어를 득점하십시오.
- 선택한 세트의 각 문자는 세트와 함께 표시되는 번호를 얻습니다 (반복 포함).
AEIOU
카운트 0- 다른 모든 글자는 -2입니다
- 위의 1-3 단계를 반복합니다 (1 단계에서 문자를 재사용하지 않음).
- 최종 점수는 세 단어 점수의 합입니다.
세트
(1 점 1 점, 2 점 2 점 등 설정)
- LTN
- RDS
- GBM
- CHP
- 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 코드 추가
편집 : 현상금을 추가하고 싶습니다. 가장 좋아하는 개선 사항 (또는 여러 답변)을 줄 것입니다. 그렇다면 평판이 더 높아야합니다.