2016-08-18 19 views
0

私は基本的に入力を受け取り、有効なスクラブル単語のリストを通り、入力を与えられた単語のうちのどれを作ることができるかを決定する、pythonプロジェクトを完成しようとしています。Python Scrabbleの挑戦が有効な単語を見つける

最初の部分は、やや簡単だったが、実際に重要な部分は私に問題を与えています。ここで

は、私がこれまで持っているものです。

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の投稿を見ましたが、正直言って、何が起こっているのか分かりません。

私はここに私の頭の上に少し行くことかもしれないが、私はまだこれを理解したいと思います。

+0

A [トライ](https://en.wikipedia.org/ wiki/Trie)データ構造は、しばしばコンパクトな方法で辞書を表現するのに有用である。 –

答えて

2

単語が有効かどうかを確認する最も簡単な方法は、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) 

はあなたに与える:

MEDUSA 
AMUSED 
SAUTED 
+0

なぜ6以上で6以上でないのですか?スクラブルワードはラックと同じ長さにすることができます – David

+1

@David誤植を訂正してくれてありがとう。私はいくつかを得るために6以上の文字を選択しましたが、ペースト/ここにコピーする目的のために限られた出力しかありませんでした。 –

+0

"and not(letter_count - rack)"の部分について説明できますか?ちょうど良いコードを理解しようとしています。これを投稿してくれてありがとう。 – user118742

関連する問題