3

プログラムはほぼ完成しましたが、微妙な間違いを犯しました。私のプログラムは単語を取り、一度に 1 文字ずつ変更することで、指定されたステップ数で最終的に目的の単語に到達するはずです。最初は類似点を探していました。たとえば、単語が見つかり、ターゲット単語が失われた場合、プログラムは次のように 4 つのステップで出力します。

['find','fine','line','lone','lose]

これは実際に私が望んでいた出力です。しかし、Java や作業などのより難しい単語のセットを考慮すると、出力は 6 つのステップであると想定されます。

['java', 'lava', 'lave', 'wave', 'wove', 'wore', 'work']

つまり、訳語や原語に存在しない文字を使って、訳語にたどり着くことができるとは知らなかったのが私の間違いです。

これが私の元のコードです:

import string
def changeling(word,target,steps):
    alpha=string.ascii_lowercase
    x=word##word and target has been changed to keep the coding readable.
    z=target
    if steps==0 and word!= target:##if the target can't be reached, return nothing.
        return []
    if x==z:##if target has been reached.
        return [z]


    if len(word)!=len(target):##if the word and target word aren't the same length print error.
        print "error"
        return None
    i=1
    if lookup
    if lookup(z[0]+x[1:]) is True and z[0]+x[1:]!=x :##check every letter that could be from z, in variations of, and check if they're in the dictionary.
        word=z[0]+x[1:]
    while i!=len(x):
        if lookup(x[:i-1]+z[i-1]+x[i:]) and x[:i-1]+z[i-1]+x[i:]!=x:
            word=x[:i-1]+z[i-1]+x[i:]

        i+=1
    if lookup(x[:len(x)-1]+z[len(word)-1]) and x[:len(x)-1]+z[len(x)-1]!=x :##same applies here.
        word=x[:len(x)-1]+z[len(word)-1]


    y =  changeling(word,target,steps-1)
    if y :
      return [x] + y##used to concatenate the first word to the final list, and if the list goes past the amount of steps.
    else:
      return None

これが私の現在のコードです:

import string
def changeling(word,target,steps):
    alpha=string.ascii_lowercase
    x=word##word and target has been changed to keep the coding readable.
    z=target
    if steps==0 and word!= target:##if the target can't be reached, return nothing.
        return []
    if x==z:##if target has been reached.
        return [z]
    holderlist=[]


    if len(word)!=len(target):##if the word and target word aren't the same length print error.
        print "error"
        return None
    i=1
    for items in alpha:

        i=1
        while i!=len(x):
            if lookup(x[:i-1]+items+x[i:]) is True and x[:i-1]+items+x[i:]!=x:
                word =x[:i-1]+items+x[i:]
                holderlist.append(word)

            i+=1
        if lookup(x[:len(x)-1]+items) is True and x[:len(x)-1]+items!=x:
            word=x[:len(x)-1]+items
            holderlist.append(word)

    y =  changeling(word,target,steps-1)
    if y :
      return [x] + y##used to concatenate the first word to the final list, and if the/
   list goes past the amount of steps.
    else:
      return None

2 つの違いは、1 つ目は、lose の文字を含む find のすべてのバリエーションをチェックすることです。意味:リンド、フォンド、フィズド、ファイン。次に、lookup 関数で有効な単語が見つかった場合、その新しく見つかった単語に対して changeling を呼び出します。

アルファベットのすべての文字で検索のすべてのバリエーションをチェックする私の新しいプログラムとは対照的です。

このコードを機能させることができないようです。find の結果を単純に出力してテストしました。

for items in alpha:

        i=1
        while i!=len(x):
             print (x[:i-1]+items+x[i:])

             i+=1
        print (x[:len(x)-1]+items)

これは与える:

aind
fand
fiad
fina
bind
fbnd
fibd
finb
cind
fcnd
ficd
finc
dind
fdnd
fidd
find
eind
fend
fied
fine
find
ffnd
fifd
finf
gind
fgnd
figd
fing
hind
fhnd
fihd
finh
iind
find
fiid
fini
jind
fjnd
fijd
finj
kind
fknd
fikd
fink
lind
flnd
fild
finl
mind
fmnd
fimd
finm
nind
fnnd
find
finn
oind
fond
fiod
fino
pind
fpnd
fipd
finp
qind
fqnd
fiqd
finq
rind
frnd
fird
finr
sind
fsnd
fisd
fins
tind
ftnd
fitd
fint
uind
fund
fiud
finu
vind
fvnd
fivd
finv
wind
fwnd
fiwd
finw
xind
fxnd
fixd
finx
yind
fynd
fiyd
finy
zind
fznd
fizd
finz

これは完璧です!アルファベットの各文字が少なくとも 1 回は単語を通過することに注意してください。さて、私のプログラムは、ヘルパー関数を使用して、その単語が与えられた辞書にあるかどうかを判断します。

これを考えてみてください。私の最初のプログラムのようにではなく、正しい単語を複数受け取るようになりました。これが、holderlist.append(word) を試している理由です。

私の問題は、ホルダーリストの各単語を実行するためにチェンジリングが必要なことだと思いますが、その方法がわかりません。それは憶測に過ぎませんが。

どんな助けでも大歓迎です、

乾杯。

4

2 に答える 2

6

必要なものについて少し混乱しているかもしれませんが、この投稿から借りることで、役立つはずのコードがいくつかあると思います.

>>> alphabet = 'abcdefghijklmnopqrstuvwxyz'
>>> word = 'java'
>>> splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
>>> splits
[('', 'java'), ('j', 'ava'), ('ja', 'va'), ('jav', 'a'), ('java', '')]
>>> replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b]
>>> replaces
['aava', 'bava', 'cava', 'dava', 'eava', 'fava', 'gava', 'hava', 'iava', 'java', 'kava', 'lava', 'mava', 'nava', 'oava', 'pava', 'qava', 'rava', 'sava', 'tava', 'uava', 'vava', 'wav
a', 'xava', 'yava', 'zava', 'java', 'jbva', 'jcva', 'jdva', 'jeva', 'jfva', 'jgva', 'jhva', 'jiva', 'jjva', 'jkva', 'jlva', 'jmva', 'jnva', 'jova', 'jpva', 'jqva', 'jrva', 'jsva', '
jtva', 'juva', 'jvva', 'jwva', 'jxva', 'jyva', 'jzva', 'jaaa', 'jaba', 'jaca', 'jada', 'jaea', 'jafa', 'jaga', 'jaha', 'jaia', 'jaja', 'jaka', 'jala', 'jama', 'jana', 'jaoa', 'japa'
, 'jaqa', 'jara', 'jasa', 'jata', 'jaua', 'java', 'jawa', 'jaxa', 'jaya', 'jaza', 'java', 'javb', 'javc', 'javd', 'jave', 'javf', 'javg', 'javh', 'javi', 'javj', 'javk', 'javl', 'ja
vm', 'javn', 'javo', 'javp', 'javq', 'javr', 'javs', 'javt', 'javu', 'javv', 'javw', 'javx', 'javy', 'javz']

可能なすべての置換のリストを取得したら、簡単に行うことができます

valid_words = [valid for valid in replaces if lookup(valid)]

これにより、単語内の 1 文字を置き換えることによって形成できるすべての単語が得られるはずです。このコードを別のメソッドに配置することで、単語を取得し、その現在の単語から可能な次の単語を取得し、それらの各単語を再帰的に処理できます。例えば:

alphabet = 'abcdefghijklmnopqrstuvwxyz'
def next_word(word):
    splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b]
    return [valid for valid in replaces if lookup(valid)]

これで十分ですか?タスクを小さなチャンクに分割することで、コードが本当に役立つと思います。

于 2012-03-28T18:27:50.673 に答える
0

コードを修正しました:

import string 
def changeling(word, target, steps): 
    alpha=string.ascii_lowercase 
    x = word  #word and target has been changed to keep the coding readable. 
    z = target 
    if steps == 0 and word != target:  #if the target can't be reached, return nothing. 
        return [] 
    if x == z:  #if target has been reached. 
        return [z] 
    holderlist = [] 


    if len(word) != len(target):  #if the word and target word aren't the same length print error. 
        raise BaseException("Starting word and target word not the same length: %d and %d" % (len(word), 
    i = 1 
    for items in alpha: 
        i=1
        while i != len(x): 
            if lookup(x[:i-1] + items + x[i:]) is True and x[:i-1] + items + x[i:] != x: 
                word = x[:i-1] + items + x[i:] 
                holderlist.append(word) 
            i += 1 
        if lookup(x[:len(x)-1] + items) is True and x[:len(x)-1] + items != x: 
            word = x[:len(x)-1] + items 
            holderlist.append(word) 

    y =  [changeling(pos_word, target, steps-1) for pos_word in holderlist] 
    if y: 
      return [x] + y  #used to concatenate the first word to the final list, and if the list goes past the amount of steps. 
    else: 
      return None

wherelen(word)len(target)では、スタック トレースがなく、致命的でない、あいまいなものを出力するよりも、例外を発生させる方がよいでしょう。

\行を続けるには、スラッシュ ( ) ではなく、バックスラッシュ ( )/を使用します。そして、彼らはコメントでは機能しません

于 2012-03-28T19:10:32.333 に答える