【问题标题】:swift: compare 2 arrays of characters, remove one value from eachswift:比较 2 个字符数组,从每个字符中删除一个值
【发布时间】:2017-05-04 23:34:31
【问题描述】:

这就是我想要做的。我正在制作一个游戏,对手猜对方的话,每个猜测都有直接和间接的命中。请参阅星号以了解我遇到问题的地方。

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]

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

【问题讨论】:

  • 这里不是为您完成作业的地方。 :) 发布一个关于你在实现你想做的事情时遇到的问题的具体问题。
  • 这实际上是我正在构建的游戏的游戏逻辑的一部分。对不起,如果它看起来很业余,但我被卡住了
  • 哈哈我绝对知道那是什么感觉。只是一个提示,先尝试实现一些东西,然后然后寻求帮助。机会是您认为非常接近您需要的东西,它使帮助更容易:)
  • 是的。我尝试运行 for-in 循环,但我知道的所有属性点语法似乎都适用于字符串而不是字符。我本可以在描述方面做得更好
  • **为更好的解释而编辑

标签: arrays swift character


【解决方案1】:

您应该在文档中查看 Array、Set 和 String 数据类型,它们提供了许多函数来执行这种计算和转换。

例如:

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"

【讨论】:

  • 非常感谢。我不打算把它插入,我要好好看看这一切都在做什么。不过,事情是这样的:给定单词的直接计数和间接计数应该是 1,2。这就是为什么我在直接命中后从剩余的字母生成一个数组。如果秘密词中有 2 个“n”,猜测中有 1 个,并且两者都不是直接命中,则“n”之一只有 1 个间接命中。
  • 这就是为什么我建议在 cmets 中从间接中减去直接(而不是在分析中将两者结合起来),因为直接在我使用的函数中始终是间接的。
  • 是的,我在这里的目的是为您提供如何组合这些基础功能的具体示例,因为我觉得到目前为止提供的模糊提示不足以揭示它们的真正潜力。我也相信你的思考过程应该从函数式编程开始,然后再求助于过程算法。
【解决方案2】:

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

但这里有一些可能有用的提示:

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

remove : 从数组中删除

【讨论】:

  • 我已经自学 swift 两个月了,感谢您向 n00b 伸出援助之手
  • 希望对您有所帮助!我最初写了一个解决方案并打算分享它,但我认为你最好练习一个简单的功能。练习是学习任何编程语言的最佳方式!
  • 我很感激;我确实花了很多时间寻找一个不涉及笨重的条件语句列表的解决方案
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2012-08-16
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多