Arrays swift:比较两个字符数组,从每个数组中删除一个值

Arrays swift:比较两个字符数组,从每个数组中删除一个值,arrays,swift,character,Arrays,Swift,Character,这就是我要做的。我在做一个游戏,对手猜测对方的话,每个猜测都有直接和间接的打击。请参见星号以了解我遇到的问题 var directSum = 0 var indirectSum = 0 var words = ["canon", "cnams"] var secretWord = Array(words[0].characters) var guessWord = Array(words[1].characters) var secretWordInd = [Character]() var g

这就是我要做的。我在做一个游戏,对手猜测对方的话,每个猜测都有直接和间接的打击。请参见星号以了解我遇到的问题

var directSum = 0
var indirectSum = 0
var words = ["canon", "cnams"]
var secretWord = Array(words[0].characters)
var guessWord = Array(words[1].characters)
var secretWordInd = [Character]()
var guessWordInd = [Character]()

let dir1 = secretWord[0] == guessWord[0]
let dir2 = secretWord[1] == guessWord[1]
let dir3 = secretWord[2] == guessWord[2]
let dir4 = secretWord[3] == guessWord[3]
let dir5 = secretWord[4] == guessWord[4]


if dir1 && dir2 && dir3 && dir4 && dir5 {
    print ("you won!")
}
    if dir1 {
        directSum += 1
    } else {
        secretWordInd.append(secretWord[0])
        guessWordInd.append(guessWord[0])
}
    if dir2 {
        directSum += 1
    } else {
        secretWordInd.append(secretWord[1])
        guessWordInd.append(guessWord[1])
}
    if dir3 {
        directSum += 1
    } else {
        secretWordInd.append(secretWord[2])
        guessWordInd.append(guessWord[2])
}
    if dir4 {
        directSum += 1
    } else {
        secretWordInd.append(secretWord[3])
        guessWordInd.append(guessWord[3])
}
    if dir5 {
        directSum += 1
    } else {
        secretWordInd.append(secretWord[4])
        guessWordInd.append(guessWord[4])
**}

for var secretLetter in secretWordInd {
    for var guessLetter in guessWordInd{
        if secretLetter == guessLetter {
            secretWordInd.remove(at:secretWordInd.indexOf(secretLetter))
            guessWordInd.remove(at:guessWordInd.indexOf(guessLetter))
            indirectSum += 1
            }
        }
    }**
var score = [directSum, indirectSum]

我需要做的是每当数组中有一个字符时计数:SecretWordInd与数组中的一个字符相匹配:guessWordInd,只删除这两个字符(每个字符串中一个),每次发生这种情况时,indirectSum+=1。例如,如果一个中有2个“a”,另一个中有1个,则函数需要从每个中删除1个a这意味着directSum函数的输出,在这种情况下,indirectSum应该是[1,2],因为猜测词中的一个“n”只有一个间接命中。这正是使函数变得复杂的原因。两个数组中的值的数量将不是常数。我不知道如何使用方法来实现这一点(.contains仅适用于我认为的字符串)。非常感谢你的帮助!谢谢

正如其他人所说,这里不是做作业的地方;)

但以下是一些可能有用的建议:

indexOf:返回要查找的元素的索引,如果不在集合中,则返回nil


删除:从数组中删除

您应该查看文档中的数组、集合和字符串数据类型,它们提供了许多函数来执行此类计算和转换

例如:

var secretWord = "canon"
var guessWord  = "cnams"

// identify shared letters using sets
let sharedLetters  = Set(secretWord.characters).intersection(Set(guessWord.characters))

// count number of shared letters present in both words
let sharedCounts   = sharedLetters.map{  c      in (c, secretWord.characters, guessWord.characters) }
                                  .map{ (c,s,g) in (c, s.filter{$0==c}, g.filter{$0==c}) } 
                                  .map{ (c,s,g) in (c, min(s.count,g.count)) }

// count same letters at same position and shared
// (if you're making a mastermind game, you should subtract directCount from indirectCount)                                 
let directCount   = zip(secretWord.characters,guessWord.characters).filter{$0==$1}.count
let indirectCount = sharedCounts.map{$0.1}.reduce(0,+)                                 


// remove shared letters (for count) from both strings
sharedCounts.flatMap{ Array(repeating:$0, count:$1) }
            .forEach{ secretWord.remove(at:secretWord.characters.index(of:$0)!) }
sharedCounts.flatMap{ Array(repeating:$0, count:$1) }
            .forEach{ guessWord.remove(at:guessWord.characters.index(of:$0)!) }


sharedLetters  // {"n", "a", "c"}
sharedCounts   // ("n", 1), ("a",1), ("c", 1)]
directCount    // 1
indirectCount  // 3    
secretWord     // "on"
guessWord      // "ms"

这里不是为你做作业的地方。:)发布一个关于你正在实施你想要做的事情的问题的具体问题。这实际上是我正在构建的游戏的游戏逻辑的一部分。抱歉,如果它看起来很业余,但我是stuckHaha,我肯定知道那是什么样子。只是一个提示,先尝试实施一些东西,然后寻求帮助。机会是你认为非常接近你所需要的,并且它使你更容易帮助:)是的。我尝试运行in循环,但我知道的所有属性点语法似乎都适用于字符串而不是字符。我本可以更好地描述**的,为了更好的解释而编辑的我已经自学了两个月了,谢谢你伸出援助之手帮助一个N00B希望这有帮助!我最初写了一个解决方案,并打算与大家分享,但我想你最好还是练习一个简单的函数。练习是学习任何编程语言的最好方法!我很感激,;我确实花了很多时间来寻找一个解决方案,这个解决方案不需要一个冗长的条件语句列表,非常感谢。我不会把这个插进去,我要好好看看这是怎么回事。但问题是:给定单词的直接计数和间接计数应该是1,2。这就是为什么我从直接点击后的剩余字母生成了一个数组。如果秘密单词中有2个“n”,猜测中有1个,并且两者都不是直接命中,那么其中一个“n”只会有1个间接命中。这就是为什么我建议从注释中的间接命中中减去直接命中(而不是在分析中结合两者),因为在我使用的函数中,直接命中总是间接命中。是的,我的意图是给你们具体的例子,说明这些基础函数是如何结合的,因为我觉得迄今为止提供的模糊暗示不足以暴露它们的真正潜力。我也相信你的思维过程应该从函数式编程开始,然后再求助于过程性算法。