Python Scrabble挑战找到有效的单词

时间:2016-08-18 22:36:29

标签: python python-3.x

我试图完成一个基本上接受输入的python项目,并查看有效的拼字游戏单词列表,并确定在给定输入的情况下可以制作哪些单词。

第一部分有点容易,但真正重要的部分是给我一些问题。

这是我到目前为止所拥有的:

import argparse
import sys

"""

Step 1: Get input from the user

"""

parser = argparse.ArgumentParser()
parser.add_argument("rack", type=str, help = "letters on the rack (no spaces)")
args = parser.parse_args()

rack = args.rack
rack = rack.upper()
rack = sorted(rack)

"""

Step 2: Open the sowpods.txt file, read the contents and turn it into a list

"""

def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

scores = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2,
         "f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3,
         "l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1,
         "r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4,
         "x": 8, "z": 10}

file = "sowpods.txt"
length = file_len(file)

file = open("sowpods.txt", 'r')
file_list = list(file)

for i in range(length):
    value = file_list[i]
    value = value.rstrip('\n')
    file_list[i] = value

"""

Step 3: Find valid words

"""

#for x in range(len(file_list)):
for x in range(82980,83000):
    tmp = rack
    test = file_list[x]
    pos = []

    if len(test) > len(tmp):
        break
    else:
        for y in range(len(test)):
            letter = test[y]
            if letter in tmp[y:(len(tmp))]:
                pos.append(letter)
        print(pos)

我确定它很乱,因为我暂时没有编程,但我只是想弄清楚程序检查有效性的部分。现在,循环经历了一个范围,我知道有些字可以从机架上制作但我被卡住了。我已经在this帖子上看了一些帮助,但老实说,我不确定发生了什么。

我可能会在这里稍微过一点,但我仍然想知道这一点。

1 个答案:

答案 0 :(得分:2)

检查单词是否有效的最简单方法是使用<br/>。您可以获取机架中每个字母的出现次数,然后每个拼字游戏单词的出现次数会有所不同。如果从机架中删除字母后没有留下拼字游戏的任何内容,那么您可以制作拼字游戏单词。

示例代码(使用提供的字典而不是系统代码):

collections.Counter

会给你:

from collections import Counter

with open('/usr/share/dict/words') as fin:
    lines = (word.strip().upper() for word in fin)
    words = [(word, Counter(word)) for word in lines]

rack = Counter('AEDTUMS')
for scrabble_word, letter_count in words:
    # Using length here to limit output for example purposes
    if len(scrabble_word) >= 6 and not (letter_count - rack):
        print(scrabble_word)