Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 一种检查与原始图像接近程度的字谜算法_Algorithm_Pseudocode - Fatal编程技术网

Algorithm 一种检查与原始图像接近程度的字谜算法

Algorithm 一种检查与原始图像接近程度的字谜算法,algorithm,pseudocode,Algorithm,Pseudocode,我正在尝试创建一个算法来测试一个字谜(由另一个算法从原始单词创建)是否与原始单词太接近。上下文是一个字谜解决游戏-我希望游戏能够动态生成字谜(从我在游戏中输入的单词中),但希望避免它们太容易解决,因为随机性会留下与原始单词的相似之处(例如,蝙蝠侠是BTAMAN的字谜) 我是个业余爱好者,所以我想看看我的想法是否正确。我目前的计划是将“分数”分配给特定的标准,然后将分数相加,并检查是否达到某个阈值(这意味着字谜与原始单词太相似,应该丢弃) (注意:我尝试了一些第三方代码来检查两个字符串的相似性,但

我正在尝试创建一个算法来测试一个字谜(由另一个算法从原始单词创建)是否与原始单词太接近。上下文是一个字谜解决游戏-我希望游戏能够动态生成字谜(从我在游戏中输入的单词中),但希望避免它们太容易解决,因为随机性会留下与原始单词的相似之处(例如,蝙蝠侠是BTAMAN的字谜)

我是个业余爱好者,所以我想看看我的想法是否正确。我目前的计划是将“分数”分配给特定的标准,然后将分数相加,并检查是否达到某个阈值(这意味着字谜与原始单词太相似,应该丢弃)

(注意:我尝试了一些第三方代码来检查两个字符串的相似性,但它们似乎与字符串长度和实际字符有很大的关系,这在我的字谜/原始单词对中是相同的)

我还希望避免过多地对字谜进行游戏,避免产生虚假的随机性(例如,从来没有一个字谜的起始字母与原始单词相同)

以下是我的伪代码算法(游戏中的字谜从短单词到两三个单词字符串,如电影标题):

等等。我可以根据结果对具体检查进行磨练

我没有要求任何代码…只是想知道是否有人以前做过类似的事情和/或我是否犯过任何算法错误。还是我想得太多了


我自己通过一个简单的算法创建了字谜,从字符串中提取一个随机字符,并将其添加到一个新字符串中,直到原始字符串中没有剩余字符为止。新算法将用于检查结果,并(如果需要)重做字谜。

权重/点数系统应更详细

  • 首先,你应该对第一个字母和最后一个字母给予更多的重视,因为如果只有它们在这个地方,而其他字母是混合的,本地读者(除了初学者或小孩)通常不会注意到这一点。你有空吗
  • 您应该为所有字母组合赋予相同的权重。频率越高,体重越重。你必须重视严格的字母组合。例如,在英语中,如果ch、sh、tch、ck等组合被破坏,那么这个词就会变得更难识别。如果字谜破坏了它们,那就好了
  • 如果出现新的频繁字母组合,也很好
  • 如果用字谜代替通常发音相近的字母,那就不好了
  • 如果字谜将字母重新组合,使字母的发音不同,如
    sic->cis
    中的“c”,则效果良好
  • 如果字谜看起来和听起来都像一个普通的单词(它使用语言中频繁的字母组合,越长越好),那么它就是一个好的字谜,原因有两个——难解和不错
  • 点数的总和应该根据单词的长度重新计算——单词越长,绘制一个困难的图表就越容易
准备-所有称重系统都必须进行大量测试。我建议制定一个测试程序,提出解决方案的字谜图,并将花费的时间与评估进行比较,从而评估权重系统的质量。如果它能单独评估加权原则,那就更好了


当然,经过这样的测试,你可以找到更多的原则。顺便说一句,这是心理学博士论文的良好基础。

这是我目前正在测试的代码。到目前为止,它已经被证明足以满足我的需求,但上面的评论中有一些很棒的想法,可以进一步改进它。为VB道歉,但那是我用的。这段代码非常通用,但特别是VB.net WinRT代码

到目前为止,对于4个字符(最多25个字符)和多个单词的单词,这种方法效果很好

Public Function IsAnagramTooSimilarToOriginal(originalWord As String, anagramWord As String) As Boolean

    ' matchPoints tracks how many matches are found between the two strings        
    Dim matchPoints As Integer = 0

    ' first letters of each string match
    If originalWord.Substring(0, 1) = anagramWord.Substring(0, 1) Then
        If originalWord.Length < 7 Then matchPoints += 3 Else matchPoints += 1.5
    End If


    ' last letters of each string match
    If originalWord.Substring(originalWord.Length - 1, 1) = anagramWord.Substring(anagramWord.Length - 1, 1) Then
        If originalWord.Length < 7 Then matchPoints += 2 Else matchPoints += 1.5
    End If


    ' first two letters match (NOTE: this is in addition to the first letters matching, so the points accumulate)
    If originalWord.Substring(0, 2) = anagramWord.Substring(0, 2) Then matchPoints += 1

    ' each three character string that appears in order in both strings
    For count = 0 To (originalWord.Length - 3)
        If anagramWord.Contains(originalWord.Substring(count, 3)) Then matchPoints += 2

    Next

    ' each four character string that appears in order in both strings
    For count = 0 To (originalWord.Length - 4)
        If anagramWord.Contains(originalWord.Substring(count, 4)) Then matchPoints += 2

    Next

    Dim result As Boolean = False

    If originalWord.Length - matchPoints <= 3 Then
        ' this makes the rules more stringent for shorter words
        result = True
    Else

        If matchPoints >= 5 Then result = True

    End If

    Return result


End Function
公共函数IsAnagramTooSimilarToOriginal(原始单词作为字符串,anagramWord作为字符串)作为布尔值
'匹配点跟踪在两个字符串之间找到的匹配数
将匹配点设置为整数=0
'每个字符串的首字母匹配
如果originalWord.Substring(0,1)=anagramWord.Substring(0,1),则
如果原始单词长度<7,则匹配点+=3,否则匹配点+=1.5
如果结束
'每个字符串的最后一个字母匹配
如果originalWord.Substring(originalWord.Length-1,1)=anagramWord.Substring(anagramWord.Length-1,1),则
如果原始单词长度<7,则匹配点+=2,否则匹配点+=1.5
如果结束
'前两个字母匹配(注意:这是对前两个字母匹配的补充,因此积分累积)
如果originalWord.Substring(0,2)=anagramWord.Substring(0,2),则匹配点+=1
'在两个字符串中按顺序显示的每个三个字符串
对于count=0到(originalWord.Length-3)
如果anagramWord.Contains(originalWord.Substring(count,3))则匹配点+=2
下一个
'在两个字符串中按顺序显示的每个四个字符串
对于count=0到(originalWord.Length-4)
如果anagramWord.Contains(originalWord.Substring(count,4))则匹配点+=2
下一个
将结果设置为布尔值=False

如果是originalWord.Length-matchPoints,我会对排列的第一个字母进行更高的评分,因为它会泄露游戏。此外,如果你的检查还不够,也许你可以检查两个单词中的子字符串是否都是字典中的单词,也就是说,两个单词中出现的TMA都没有两个单词中出现的MAN或BAT那么糟糕。我认为你的算法应该足够好。如果你记住字符串中的字母数。当然,如果是一个3字字符串,您可能需要检查每个单词的首字母和末字母。:)谢谢你的建议。我目前正在测试,我的算法接近我需要它的地方。我
Public Function IsAnagramTooSimilarToOriginal(originalWord As String, anagramWord As String) As Boolean

    ' matchPoints tracks how many matches are found between the two strings        
    Dim matchPoints As Integer = 0

    ' first letters of each string match
    If originalWord.Substring(0, 1) = anagramWord.Substring(0, 1) Then
        If originalWord.Length < 7 Then matchPoints += 3 Else matchPoints += 1.5
    End If


    ' last letters of each string match
    If originalWord.Substring(originalWord.Length - 1, 1) = anagramWord.Substring(anagramWord.Length - 1, 1) Then
        If originalWord.Length < 7 Then matchPoints += 2 Else matchPoints += 1.5
    End If


    ' first two letters match (NOTE: this is in addition to the first letters matching, so the points accumulate)
    If originalWord.Substring(0, 2) = anagramWord.Substring(0, 2) Then matchPoints += 1

    ' each three character string that appears in order in both strings
    For count = 0 To (originalWord.Length - 3)
        If anagramWord.Contains(originalWord.Substring(count, 3)) Then matchPoints += 2

    Next

    ' each four character string that appears in order in both strings
    For count = 0 To (originalWord.Length - 4)
        If anagramWord.Contains(originalWord.Substring(count, 4)) Then matchPoints += 2

    Next

    Dim result As Boolean = False

    If originalWord.Length - matchPoints <= 3 Then
        ' this makes the rules more stringent for shorter words
        result = True
    Else

        If matchPoints >= 5 Then result = True

    End If

    Return result


End Function