2016-08-18 1 views
0

Ich versuche ein Python-Projekt zu vervollständigen, das grundsätzlich eine Eingabe macht und eine Liste von gültigen Scrabble-Wörtern durchläuft und bestimmt, welche dieser Wörter bei der Eingabe gemacht werden können.Python Scrabble Challenge finde gültige Wörter

Der erste Teil war etwas einfach, aber der Teil, der wirklich wichtig ist, gibt mir Probleme.

Hier ist, was ich bisher:

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) 

Ich bin sicher, dass es sehr chaotisch ist, als ich eine Weile nicht programmiert haben, aber ich möchte nur den Teil, um herauszufinden, wo überprüft das Programm für die Gültigkeit . Im Moment läuft die Schleife durch einen Bereich, in dem ich weiß, dass es Worte gibt, die aus dem Rack gemacht werden können, aber ich stecke fest. Ich habe this Post auf etwas Hilfe angeschaut, aber um ehrlich zu sein, bin ich nicht wirklich sicher, was los ist.

Ich gehe vielleicht ein wenig über meinen Kopf hier, aber ich würde immer noch gerne herausfinden.

+0

A [trie] (https://en.wikipedia.org/ wiki/Trie) Datenstruktur ist oft nützlich, um ein Wörterbuch kompakt darzustellen. –

Antwort

2

Der einfachste Weg zu überprüfen, ob Wörter gültig sind, ist eine collections.Counter. Sie nehmen das Vorkommen jedes Buchstabens im Rack auf, und das Vorkommen jedes Buchstabens für jedes Scrabble-Wort nimmt dann den Unterschied. Wenn nach dem Entfernen der Buchstaben aus dem Rack nichts mehr vom Scrabble-Wort übrig ist, können Sie das Scrabble-Wort erstellen.

Beispiel-Code (mit dem anstelle eines Systems zur Verfügung gestellt Wörterbuch one):

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) 

geben Sie:

MEDUSA 
AMUSED 
SAUTED 
+0

Warum> = 6 und nicht nur> 6? Das Scrabble-Wort kann die gleiche Länge wie das Rack haben – David

+1

@David Danke für die Korrektur Tippfehler. Ich wählte 6 oder mehr Buchstaben, um nur einige, aber eine begrenzte Ausgabe zu erhalten, um beispielsweise paste/here zu kopieren. –

+0

Können Sie den Teil "und nicht (letter_count - rack)" erklären. Ich versuche nur, den Code besser zu verstehen. Danke, dies zu veröffentlichen. – user118742