wordle中的重复字母

Duplicate letters in wordle

对于一个学校项目,我必须在 Python 中创建一个 wordle。我创建的程序比较目标词和猜测词的字母。举个例子:目标词是“compulsory”,猜词是“submission”。输出应为“-O-O--X-O-”。

"X" 表示被猜单词中的字母也在目标单词中并且在同一位置。 “O”表示猜测的单词中的字母也在目标单词中,但不在同一位置。 "-"表示打错字母了。

但我似乎找不到处理重复字母的方法。例如,如果目标词是“teethe”而猜测的词是“health”,它应该给我输出:“OX--O-”。虽然我的程序 returns 输出:“OX--OO”。

我的代码:

    def compare(guess, target):
        output = ""
        for i in range(target.__len__()):
            if guess[i] == target[i]:
                output = output + "X"
            elif guess[i] in target:
                 output = output + "O"
            else:
                output = output + "-"
        return output
    print(compare("health", "teethe")) 

希望我提供的信息足以让您了解我的 question/problem。

提前感谢您的帮助!

这花了我一段时间才解决,但我想我明白了。

这是我实现的解决方案:

def compare(guess: str, target: str):
    output = ["-"] * len(target)

    for index, (guess_letter, target_letter) in enumerate(zip(guess, target)):
        if guess_letter == target_letter:
            output[index] = "X"
            target = target.replace(guess_letter, "-", 1)
    
    for index, (guess_letter, target_letter) in enumerate(zip(guess, target)):
        if guess_letter in target and output[index] == "-":
            output[index] = "O"
            target = target.replace(guess_letter, "-", 1)

    return ''.join(output)


print(compare('health', 'teethe'))
print(compare('submission', 'compulsory'))

这是一个相同的解决方案,它使用更简单(但不那么“Pythonic”)的工具:

def compare(guess, target):
    length = len(target)
    output = ["-"] * length

    for index in range(length):
        if guess[index] == target[index]:
            output[index] = "X"
            target = target.replace(guess[index], "-", 1)

    for index in range(length):
        if guess[index] in target and output[index] == "-":
            output[index] = "O"
            target = target.replace(guess[index], "-", 1)

    return ''.join(output)


print(compare('health', 'teethe'))
print(compare('submission', 'compulsory'))

输出:

OX--O-
-O-O--X-O-

以下是我的关键技术:

  • 首先创建输出字符串,这样我们就有办法检查给定的点是否已经用 'X' 标记了。我最初将其作为列表维护,然后在返回时将其转换为字符串。
  • 如果我们“用完”目标字符串中的一个字母,我们通过将其设置为 '-'.
  • 来“禁用”它
  • 首先检查所有完全匹配项(即导致 'X' 的内容)。

这可能不是最漂亮的解决方法。但是您可以使用一种方法,那就是将目标中的字母保存为一个额外的字符串,这样您就可以“记住”它们。之后你可以将字符串添加到你的 elif 中,如果猜测的字母不在数组中,它会添加一个“O”,如果是,将计算 else 并添加“-”。这应该处理你想要的结果。希望有所帮助

def compare(guess, target):
  output = ""
  isGuessInTarget = ""
  for i in range(target.__len__()):
     if guess[i] == target[i]:
       output = output + "X"
     elif (guess[i] in target) and not (guess[i] in isGuessInTarget):
       output = output + "O"
       isGuessInTarget = isGuessInTarget + guess[i]
     else:
      output = output + "-"
  return output
print(compare("health", "teethe")) 

eccentricOrange - 感谢代码帮助。我能够利用 Python 代码并将其转换为 Visual Basic。所以对于那些需要 VB 版本的人来说,这是我想出的代码。

Function Compare(Guess As String, Target as String) As String
    Dim Output As String = "-----"

    'Match all of the Exact Match Characters first
    For i = 1 To 5
        If Guess.Substring(i - 1, 1) = Target.Substring(i - 1, 1) Then
            Output = Output.Remove(i - 1, 1).Insert(i - 1, "X")
            Target = Target.Remove(i - 1, 1).Insert(i - 1, "-")
        End If
    Next

    'Next Match Characters in the word but in the wrong spot
    For i = 1 To 5
        For j = 1 To 5
            If (Guess.Substring(j - 1, 1) = Target.Substring(i - 1, 1)) And Output.Substring(j - 1, 1) = "-" Then
                Output = Output.Remove(j - 1, 1).Insert(j - 1, "O")
                Target = Target.Remove(i - 1, 1).Insert(i - 1, "-")
            End If
        Next
    Next
    Compare = Output
End Function