【问题标题】:Swift: Generate a set of (X) random 6 character substringsSwift:生成一组(X)个随机 6 个字符的子字符串
【发布时间】:2016-08-13 12:41:39
【问题描述】:

我正在尝试从字母表中生成 5 个随机子字符串,每个子字符串包含六个字符。例如:ABCDEF、RSTUVW、UVWXYZ 等。这些子字符串可以是重复的,因此生成两次 ABCDEF 是没有问题的。

当我有这 5 个子字符串时,我想生成包含三个字符的五个数组。其中一个字符应该是子字符串的最后一个字母,另外两个字母应该是整个字母表中的两个随机唯一字母。

例子:

获取五个随机子串: [ABCDEF]、[RSTUVW]、[CDEFGH]、[LMNOPQ]、[UVWXYZ]

对于 [ABCDEF],系统可以生成 [F, H, S],对于 [RSTUVW],它可以生成 [K, Q, W]。如您所见,三字符数组始终包含其子字符串的最后一个字母和另外两个随机的唯一字母。

以上是孩子们练习字母顺序的游戏的一部分。为了生成可能的答案,我实际上需要将少量字符分配给按钮。

你认为解决这个问题的最佳方法是什么?

【问题讨论】:

  • 当您生成 6 个字符的 5 个子字符串时(在初始阶段),这些子字符串是否包含重复字符?喜欢"ABABAB"
  • 不,它们必须是字母表中的六个连续字母。谢谢!
  • 如果只有每个数组的最后一个字符相关,为什么要创建 5 个 6 个字符的 数组
  • 因为我还想存储子字符串的前五个字符以便显示它。我想你也可以通过编程从一个随机字符中计算五个字符并将其添加到视图中。
  • 从您的描述中不清楚是哪些字母用于生成三字符数组。

标签: arrays swift string


【解决方案1】:

感谢@vacawama,这是一个可能的解决方案。

1。创建字母表

let alphabet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters)

2。创建 6 个“序列”

let sequences = (0..<5).map { _ -> String in
    let startIndex = Int(arc4random_uniform(UInt32(alphabet.count - 5)))
    let endIndex = startIndex + 5
    return String(alphabet[startIndex...endIndex])
}

[“PQRSTU”、“DEFGHI”、“JKLMNO”、“CDEFGH”、“KLMNOP”]

3。获取每个序列的最后一个字符

let lastChars = sequences.flatMap { $0.characters.last }

[“U”、“I”、“O”、“H”、“P”]

4。建造 5 棵榆树

这里是代码sn-p

let elms = lastChars.map { char0 -> String in
    var tempAlphabet = alphabet
    tempAlphabet.removeAtIndex(tempAlphabet.indexOf(char0)!)
    let index1 = Int(arc4random_uniform(UInt32(tempAlphabet.count)))
    let char1 = tempAlphabet.removeAtIndex(index1)
    let index2 = Int(arc4random_uniform(UInt32(tempAlphabet.count)))
    let char2 = tempAlphabet[index2]
    return String(Array(Set<Character>([char0, char1, char2])))
}

[“DUN”、“ZIQ”、“ROP”、“HSW”、“PGS”]

更新

这是解决@dfri 在下面的 cmets 中突出显示的问题的另一种解决方案。下面的代码被剪断可以替换前面的项目符号4.

extension Array {
    mutating func removeRandom() -> Element {
        let index = Int(arc4random_uniform(UInt32(count)))
        return removeAtIndex(index)
    }
}

var availableChars = Array(Set(alphabet).subtract(lastChars))
let elms = lastChars.map { String([$0, availableChars.removeRandom(), availableChars.removeRandom()]) }

【讨论】:

  • @DennisvanMazijk:实际上还有另一个问题。如果前 5 个单词恰好相同(如您所允许的),那么我们无法生成有效结果。事实上uniqueLastChars 将只有 1 个字符,然后我们将无法构建最终结果。我认为我们必须强制 sequences 至少包含 3 个不同的元素。
  • @appzYourLife,请参阅上面的 cmets。 3 个字母的序列应包含子字符串的最后一个字母,以及整个字母表中的 2 个随机字母。
  • 您应该为每个最后一个字母创建一个 3 字符子数组。而且我相信Array(0...5).map 可以缩短为(0...5).map
  • @appzYourLife,几乎没有,但我会接受部分功劳:-)。投票赞成。
  • 当然,这是一个有趣的问答 :) 首先,我认为这甚至不是 OP 的要求,而是说例如对于lastChars = ["A", "A", "A", "A", "A"] 的情况(为了简化),elms 的低可能性结果可能是重复项之一,例如["DAK", "MAY", "DAK", "HZA", "UAE"]"DAK" 重复)。这个问题,给定lastChars(比如说,长度为 5),生成 5 个 unique 三字母词(在相应的lastChars 字符包含的约束下)非常复杂,因为我们需要对于生成的每个新单词,确定它不会重复以前生成的单词
【解决方案2】:

随机子串:

func randomString(length: Int) -> String {
    let charactersString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    let n = UInt32(charactersString.characters.count)
    var out = ""
    for _ in 0..<length {
        let index = charactersString.startIndex.advancedBy(Int(arc4random_uniform(n)))
        out.append(charactersString[index])
    }

    return out
} 

获取 5 个字符串:

func createSubstrings() -> [String] {
    var array = [String]()
    for _ in 0...5 {
        array.append(self.randomString(6))
    }
    return array
}

最后一个数组:

func createFinalStrings() -> [String] {
    let substrings = createSubstrings()
    var finalStrings = [String]()
    let lastChars = substrings.flatMap { $0.characters.last }

    for _ in 0...5 {
        var string = ""
        while string.characters.count < 3 {
            let index = Int(arc4random_uniform(5))
            let lastChar = lastChars[index]
            if string.rangeOfString(String(lastChar)) == nil{
                string = string + String(lastChar)
            }
        }
        finalStrings.append(string)
    }

    return finalStrings
}

【讨论】:

  • 我必须修复一些错误,但这仍然是阻塞的:Cannot subscript a value of type '[AnyObject]?'带有“UInt32”类型索引的 Xcode 表示它位于 lastChar 函数中。
  • @DennisvanMazijk 我更新了我的答案,删除了该功能,请检查最新版本
猜你喜欢
  • 1970-01-01
  • 2011-07-23
  • 2023-03-27
  • 2017-04-05
  • 2013-10-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多