0

単語検索/単語ジェネレーターの検索をコーディングしようとしていますが、いくつかの部分で行き詰まっています。このコードの目的は、ユーザー入力から次元と単語を取り込み、ランダムな単語検索/単語の検索を生成することです。

問題は、文字が時々上書きされることです。これを試して停止するために、関数に次のコード行があります。

lines[0][randCoO[0] - (i)][randCoO[1]] == '-':

その行は関数 U に属します

スペースが空かどうかをテストするためのものです(「 - 」が入力されています)

おそらく長くて読むのが面倒なので、コード全体を入れることを控えるようにしなければならないことはわかっていますが、助けてください

これは私のコードです:

    try:
    dim=int(raw_input('How many letters high and long do you want your find-a-word? (It has to be <= 79) '))
except ValueError:
        raise SystemExit, 'Dude, thats not a number!'

if dim > 79:
    raise SystemExit, "\n That number is bigger than 79. It won't print to well. \n"


count=0

allwords = raw_input('What words do you want in your find-a-word?\n(Enter them all together seperated by a comma)')

allwords = allwords.upper()
allwords = allwords.split(', ')
nowords = len(allwords)

while count < nowords:
    if len(allwords[count])>dim:
        raise SystemExit, "\nYour find-a-word is not big enough for one or more of your words.\nIt is doomed to fail! "
    count = count + 1

    randletter = []
    import random
    randrange = random.randrange
    alphabet = ['A', 'B', 'C', 'D', 'E', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']

    all_words = ' '.join(allwords)

    print '\n\nTry to find these words in the word find-a-word\n\n'
    count = 0
    while count < nowords:
        print allwords[count],'\n'
        count=count+1

        drctn = ['U','D','L','R','UL','UR','DL','DR']

        randdrctnlist = []

for i in range(nowords):
    randdrctn = drctn[randrange(0,4)]
    randdrctnlist.append(randdrctn)

    d = {}

for i in range(dim):
    d['line' + str(i + 1)] = ['-']*dim

    lines = []
    lines.append(d.values())
    lines.sort()

    CoO1 = []
    CoO2 = []
    CoO = []

for i in range(dim):
    CoO1.append(i)
    CoO2.append(i)    

    CoO.append(CoO1)
    CoO.append(CoO2)

    count = 0

def U(word, wordno, count, dim, lines):
    stop = 0
    randCoO = []
    while count == 0:
        rand = CoO[0][randrange(0,dim)]
        randCoO.append(rand)
        rand = CoO[1][randrange(0,dim)]
        randCoO.append(rand)
        for i in range(len(word[wordno])):
            if randCoO[0] >= (len(word[wordno]) - 1) and lines[0][randCoO[0] - (i)][randCoO[1]] == '-':
                count = 1               
                lines[0][randCoO[0]][randCoO[1]] = word[wordno][0]
                while count < len(allwords[wordno]):
                    lines[0][randCoO[0] - (count)][randCoO[1]] = word[wordno][count]
                    count = count + 1                
            else:
                print randCoO
                randCoO = []
                stop = stop + 1
                print stop
                if stop > dim*dim:
                    raise SystemExit, "\nThe find-a-word is probably impossible to make\nwithout overwriting already placed letters.\nPlease try it again. If this has show up many times in a row try making the dimensions of you find-a-word bigger\n(Or you're just unlucky!)\n"
                break

def D(word, wordno, count, dim, lines):
    stop = 0
    randCoO = []
    while count == 0:
        rand = CoO[0][randrange(0,dim)]
        randCoO.append(rand)
        rand = CoO[1][randrange(0,dim)]
        randCoO.append(rand)
        for i in range(len(word[wordno])):
            if dim - randCoO[0] > len(word[wordno]) - 1 and lines[0][randCoO[0] + (i)][randCoO[1]] == '-':
                count = 1
                lines[0][randCoO[0]][randCoO[1]] = word[wordno][0]
                while count < len(allwords[wordno]):
                    lines[0][randCoO[0] + (count)][randCoO[1]] = word[wordno][count]
                    count = count + 1
            else:
                print randCoO
                randCoO = []
                stop = stop + 1
                print stop
                if stop > dim*dim:
                    raise SystemExit, "\nThe find-a-word is probably impossible to make\nwithout overwriting already placed letters.\nPlease try it again. If this has show up many times in a row try making the dimensions of you find-a-word bigger\n(Or you're just unlucky!)\n"
                break   

def L(word, wordno, count, dim, lines):
    stop = 0
    randCoO = []
    while count == 0:
        rand = CoO[0][randrange(0,dim)]                            
        randCoO.append(rand)
        rand = CoO[1][randrange(0,dim)]
        randCoO.append(rand)
        for i in range(len(word[wordno])):
            if dim - randCoO[1] > (len(word[wordno]) - 1) and lines[0][randCoO[0]][randCoO[1] + (i)] == '-':
                count = 1  
                lines[0][randCoO[0]][randCoO[1]] = word[wordno][0]
                while count < len(allwords[wordno]):
                    lines[0][randCoO[0]][randCoO[1] + (count)] = word[wordno][count]
                    count = count + 1
            else:
                print randCoO
                randCoO = []
                stop = stop + 1
                print stop
                if stop > dim*dim:
                    raise SystemExit, "\nThe find-a-word is probably impossible to make\nwithout overwriting already placed letters.\nPlease try it again. If this has show up many times in a row try making the dimensions of you find-a-word bigger\n(Or you're just unlucky!)\n"
                break

def R(word, wordno, count, dim, lines):
    stop = 0 
    randCoO = []
    while count == 0:
        rand = CoO[0][randrange(0,dim)]                            
        randCoO.append(rand)
        rand = CoO[1][randrange(0,dim)]
        randCoO.append(rand)
        for i in range(len(word[wordno])):
            if randCoO[1] >= (len(word[wordno]) - 1) and lines[0][randCoO[0]][randCoO[1] + (i)] == '-':
                count = 1  
                lines[0][randCoO[0]][randCoO[1]] = word[wordno][0]
                while count < len(allwords[wordno]):
                    lines[0][randCoO[0]][randCoO[1] - (count)] = word[wordno][count]
                    count = count + 1
            else:
                print randCoO
                randCoO = []
                print stop
                stop = stop + 1
                if stop > dim*dim:
                    raise SystemExit, "\nThe find-a-word is probably impossible to make\nwithout overwriting already placed letters.\nPlease try it again. If this has show up many times in a row try making the dimensions of you find-a-word bigger\n(Or you're just unlucky!)\n"
                break

for i in range(nowords):
    count = 0
    print randdrctnlist
    if randdrctnlist[i] == 'U':
        U(allwords, i, count, dim, lines)
    if randdrctnlist[i] == 'D':
        D(allwords, i, count, dim, lines)
    if randdrctnlist[i] == 'L':
        L(allwords, i, count, dim, lines)
    if randdrctnlist[i] == 'R':
        R(allwords, i, count, dim, lines)

for i in range(dim):
    print ' '.join(lines[0][i])
4

1 に答える 1

1

基本的なアルゴリズムを再考する必要があると思います。あなたのコードはランダムな方向に単語を作成し、衝突を管理しようとしています。代わりに、すべての単語間のすべての交点を検討し、可能なすべての重複を構築して、結果からランダムに選択することができます。

例:「FROG」は「DOG」と2文字で交差するため、「G」では7方向、「O」では6方向から交差する可能性があります。「CAT」と(「DOG」または「FROG」)には共通の文字がないため、交差することはできません。「これまでの既存のソリューション」の各組み合わせを試してから、ソリューションを再帰的に呼び出し、パズルの次元内に収まる他のすべての可能な組み合わせで新しい単語を追加すると、すべての可能な単語の検索が可能になります。与えられた言葉。

これの次元を減らすために、私はあなたが最初に交差しない単語を置くべきだと思います。それらがすべて適合しない場合は、エラーで終了できます。次に、サイズの降順で単語を処理します。

その後、ランダムに選択するか、解決策が見つかったらすぐに終了することができます。答えにさまざまな特性を持たせたい場合(たとえば、与えられた次元全体を使用するためにもっと広げたい場合)、組み合わせを試す方法を再配置して、与えられた最初の解決策を選択できると思います。

于 2012-12-27T01:16:53.943 に答える