【问题标题】:Find a word in a crossword [closed]在填字游戏中找到一个单词[关闭]
【发布时间】:2016-03-06 16:11:33
【问题描述】:

编写一个名为 capitalize_word_in_crossword 的函数,它接受一个二维字符列表(如填字游戏)和一个字符串(单词)作为输入参数。此函数搜索 2d 列表的行和列以找到单词的匹配项。如果找到匹配项,此函数将二维列表中的匹配字符大写并返回该列表。如果未找到匹配项,则此函数仅返回原始二维列表,不做任何修改。

示例1:如果函数调用如下:

文字:

crosswords=[['s','d','o','g'],['c','u','c','m'],['a','x','a','t'],['t','e','t','k']]
word='cat'
capitalize_word_in_crossword(crosswords,word)

那么你的函数应该返回:

请注意,上面的列表是一个二维纵横字谜的表示,如下所示。

示例2:如果函数调用如下:

文字:

crosswords=[['s','d','o','g'],['c','u','c','m'],['a','c','a','t'],['t','e','t','k']]
word='cat'
capitalize_word_in_crossword(crosswords,word)

那么你的函数应该返回:

请注意,上面的列表是一个二维纵横字谜的表示,如下所示。

注意:如果同时找到水平匹配和垂直匹配,则仅选择水平匹配。例如,在上述情况下,有一个从 [2,1] 开始的水平匹配,还有一个从 [1,0] 开始的垂直匹配。请注意,在返回的列表中,只有水平匹配中的字符应大写。

我试过这段代码,它只能找到水平词。

def find_word_horizontal(crosswords,word):
    list1=[]
    row_index = -1
    column_index = -1
    refind=''
    for row in crosswords:
        index=''
        for column in row:
            index= index+column
        list1.append(index)

    for find_word in list1:
        if word in find_word:
           row_index = list1.index(find_word)
           refind = find_word
           column_index = find_word.index(word)

    ret = [row_index,column_index]
    if row_index!= -1 and column_index != -1:
        return ret

不知道下一步该做什么。请帮忙。

【问题讨论】:

  • 这是一个很好的编程问题。但为什么是正则表达式标签?您似乎没有在这里使用正则表达式。系统会根据问题中包含的内容建议您使用标签。例如:您的问题与字符、数组、字符串有关。但您有责任决定是否真的要使用这些技术。
  • 因为它在建议中,我迫切需要回答。 @noob
  • 您可以将测试用例和示例代码发布为文本吗?我很难手动输入值。
  • 在图像文件中显示代码没有帮助,因为这意味着每个人都必须自己输入代码才能使用或编辑代码以获得答案。除此之外,图像中的缩进是错误的。
  • 单词可以斜着写还是倒序写?

标签: python arrays


【解决方案1】:
crosswords=[['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'x', 'a', 't'], ['t', 'e', 't', 'k']]
words=['cat', 'dog']

def capitalize_word_in_crossword(crosswords, words):
    for rownum, row in enumerate(crosswords):
        for word in words:
            find_index=''.join(row).lower().find(word)
            if find_index>0:
                for i in range(find_index, len(word)+1):
                    crosswords[rownum][i]=crosswords[rownum][i].upper()

    for colindex in range(len(crosswords[0])):
        for word in words:
            colvalues=[row[colindex] for row in crosswords]
            find_index=''.join(colvalues).lower().find(word)
            if find_index>0:
                for i in range(find_index, len(word)+1):
                    crosswords[i][colindex]=crosswords[i][colindex].upper()
    return crosswords

print("Input: "+str(crosswords))
print("Output: "+str(capitalize_word_in_crossword(crosswords, words)))

输出:

$ python a.py 
Input: [['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'x', 'a', 't'], ['t', 'e', 't', 'k']]
Output: [['s', 'D', 'O', 'G'], ['C', 'u', 'C', 'm'], ['A', 'x', 'A', 't'], ['T', 'e', 'T', 'k']]
$

第一行的DOG 和第二列和第三列的CAT 是大写的。

第一个循环只是逐行获取所有内容并找到单词的索引,并将从找到的索引到单词长度的所有内容变为大写。

第二个循环在获取所有列 1 后执行相同的操作。

上述示例还可以扩展到跨行和列查找多个单词。

编辑1:把所有东西都放在一个函数中

编辑 2:感谢海森堡。我发现了一些我错过的东西并通过在检查子字符串时引入一个临时步骤lower() 函数来修复它,因为某些字母可能已经是大写的(由于以前的迭代)

编辑 3:再次感谢海森堡。我错过了这一点。我刚刚使用普通的填字游戏匹配解决了它。这是为每个单词维护布尔标志的更正版本,然后在垂直匹配时对其进行检查。

crosswords=[['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'c', 'a', 't'], ['t', 'e', 't', 'k']]
words=['cat', 'dog']
horizontal_match_found=[False, False]
word_index=0

def capitalize_word_in_crossword(crosswords, words):
    for rownum, row in enumerate(crosswords):
        word_index=0
        for word in words:
            find_index=''.join(row).lower().find(word)
            if find_index>0:
                for i in range(find_index, len(word)+1):
                    crosswords[rownum][i]=crosswords[rownum][i].upper()

                if not horizontal_match_found[word_index]:
                    horizontal_match_found[word_index]=True
            word_index+=1

    for colindex in range(len(crosswords[0])):
        word_index=0
        for word in words:
            if not horizontal_match_found[word_index]:
                colvalues=[row[colindex] for row in crosswords]
                find_index=''.join(colvalues).lower().find(word)
                if find_index>0:
                    for i in range(find_index, len(word)+1):
                        crosswords[i][colindex]=crosswords[i][colindex].upper()
            word_index+=1

    return crosswords

print("Input: "+str(crosswords))
print("Output: "+str(capitalize_word_in_crossword(crosswords, words)))

输出:

$ python a.py 
Input: [['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'c', 'a', 't'], ['t', 'e', 't', 'k']]
Output: [['s', 'D', 'O', 'G'], ['c', 'u', 'c', 'm'], ['a', 'C', 'A', 'T'], ['t', 'e', 't', 'k']]
$

注意(基于 0 的索引):因为我们在第 2 行有匹配的 cat,所以我们在第 0 列和第 2 列中有 NOT 大写的 cat

【讨论】:

  • 我们不必在任何地方都将单词的每个字母都大写,但只有当它作为一个单词集体出现时才大写。
  • 是的,代码遵循这一点。cat 共同出现在第一列和第三列中
  • 输出:[['s', 'd', 'o', 'g'], ['C', 'u', 'C', 'm'], ['a ', 'C', 'a', 't'], ['t', 'e', 't', 'k']] 预期输出:[['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'c', 'a', 't'], ['t', 'e', 't', 'k']]
  • 如果我将您的输入提供给我的程序:它会像这样正确打印:Output: [['s', 'D', 'O', 'G'], ['C', 'u', 'c', 'm'], ['A', 'C', 'A', 'T'], ['T', 'e', 't', 'k']],注意cat 出现在第 1 列中,cat 也出现在第 3 行中转换为大写
  • 注意:如果同时找到水平匹配和垂直匹配,则只选择水平匹配。例如,在上述情况下,有一个从 [2,1] 开始的水平匹配,还有一个从 [1,0] 开始的垂直匹配。请注意,在返回的列表中,只有水平匹配中的字符应大写。我想你没有读过这个。您的代码将每个单词都大写,但不应该这样做。
【解决方案2】:

现在是正确的。

我有缩进问题和水平/垂直拆分索引

def capitalize_word_in_crossword(crosswords,word):
     i_v=-1
     j_v=-1
     i_h=-1
     j_h=-1
     index_cap = find_word_horizontal(crosswords,word)
     if index_cap is not None:
        i_h,j_h=index_cap
     else:
        index_cap = find_word_vertical(crosswords,word)
        if index_cap is not None:
           i_v,j_v=index_cap


     for row_index in range(len(crosswords)):
         for col_index in range(len(crosswords[row_index])):

             for w in range(len(word)):
                 if i_h is not -1:                       
                    if row_index==i_h and col_index==j_h+w:
                       crosswords[row_index][col_index] = (crosswords[row_index][col_index]).upper()

                 if i_v is not -1:
                    if row_index==i_v+w and col_index==j_v:
                       crosswords[row_index][col_index] = (crosswords[row_index][col_index]).upper()
                    else:
                       crosswords[row_index][col_index] = (crosswords[row_index][col_index])

     return (crosswords)

【讨论】:

    【解决方案3】:
    def find_word_horizontal(crosswords, word):
        l=[]
        for row in crosswords:
            join_list = "".join(row)
            if join_list.find(word) != -1:
                print([crosswords.index(row), row.index(word[0])])
                return [crosswords.index(row), row.index(word[0])]
    
    def find_word_vertical(crosswords,word):
        l=[]
        for i in range(len(crosswords[0])):
                l.append(''.join([row[i] for row in crosswords]))
                for line in l:
                    print(line)
                    if word in line:
                        row_index=i
                        column_index=line.index(word[0])
                        print([column_index,row_index])
                        return [column_index,row_index]
    
    
    def capitalize_word_in_crossword(crosswords,word):
         if find_word_horizontal (crosswords,word) or find_word_vertical(crosswords,word) is not None:
    

    我在这里工作。获取'cat' 并将其大写

    crosswords=[['s','d','o','g'],['c','u','c','m'],['a','x','a','t'],['t','e','t','k']]
    word='cat'
    print(capitalize_word_in_crossword(crosswords,word))
    

    【讨论】:

    • 不是最后一个 if 行应该给出错误吗?
    【解决方案4】:

    def find_word_horizo​​ntal(填字游戏,单词): l=[] 对于填字游戏中的行: join_list = "".join(行) 如果 join_list.find(word) != -1: 返回 [crosswords.index(row), row.index(word[0])]

    def find_word_vertical(填字游戏,单词): l=[] 对于我在范围内(len(填字游戏[0])): l.append(''.join([row[i] for row in crosswords])) 对于 l 中的行: 如果单词在行:
    row_index=i column_index=line.index(word[0]) 返回 [column_index,row_index]

    def capitalize_word_in_crossword(crosswords,word):

     index_cap = find_word_horizontal(crosswords,word)
     if index_cap is not None:
        i,j=index_cap
     else:
        index_cap = find_word_vertical(crosswords,word)
        if index_cap is not None:
           i,j=index_cap
    
    
           for row_index in range(len(crosswords)):
               for col_index in range(len(crosswords[row_index])):
    
                   for w in range(len(word)):
    
                       if row_index==i+w and col_index==j:
                          crosswords[row_index][col_index] = (crosswords[row_index][col_index]).upper()
                       else:                     
                          crosswords[row_index][col_index] = (crosswords[row_index][col_index])
    
           return crosswords
    

    填字游戏=[['s','d','o','g'],['c','u','c','m'],['a','x' ,'a','t'],['t','e','t','k']] 字='猫' print(capitalize_word_in_crossword(crosswords,word))

    结果正确

    =============== 重新启动:/Users/valdemarpavesi/Documents/32.py =============== [['s', 'd', 'o', 'g'], ['C', 'u', 'c', 'm'], ['A', 'x', 'a', 't'], ['T', 'e', 't', 'k']]

    但是有一个与return相关的错误

    你的函数返回的变量类型是:NoneType

    预期是:列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多