我目前正在开发一个简单的程序,在两次迭代中逐步随机地可视化一个字符串。现在我已经设法得到了第一个迭代,但我不知道如何做第二个。如果有人能给我举个例子或提些建议,我将不胜感激。我的代码如下:

let s = "Hello playground"
let factor = 0.25
let factor2 = 0.45

var n = s.filter({ $0 != " " }).count  // # of non-space characters
var m = lrint(factor * Double(n))      // # of characters to display

let t = String(s.map { c -> Character in
        if c == " " {
        // Preserve space
        return " "
    } else if Int.random(in: 0..<n) < m {
        // Replace
        m -= 1
        n -= 1
        return c
    } else {
        // Keep
        n -= 1
        return "_"
    }
})

print(t)  // h_l__ _l_______d

为了澄清,我想在第二次迭代中使用factor2打印一些在t上随机添加字母的内容,看起来像这个húlúo plúu gúd。

最佳答案

替换字符
从@MartinR的代码开始,您应该记住已被替换的索引。所以,我将稍微更改替换字符的代码:

let s = "Hello playground"
let factor = 0.25
let factor2 = 0.45

var n = s.filter({ $0 != " " }).count  // # of non-space characters
let nonSpaces = n
var m = lrint(factor * Double(n))      // # of characters to display

var indices = Array(s.indices)

var t = ""

for i in s.indices {
    let c = s[i]
    if c == " " {
        // Preserve space
        t.append(" ")
        indices.removeAll(where: { $0 == i })
    } else if Int.random(in: 0..<n) < m {
        // Keep
        m -= 1
        n -= 1
        t.append(c)
        indices.removeAll(where: { $0 == i })
    } else {
        // Replace
        n -= 1
        t.append("_")
    }
}

print(t)   //For example: _e___ ______ou_d

揭示人物
为此,我们应该计算要显示的字符数:
m = lrint((factor2 - factor) * Double(nonSpaces))

为了随机选取三个指标,我们洗牌indices,然后替换m第一个指标:
indices.shuffle()
var u = t
for i in 0..<m {
    let index = indices[i]
    u.replaceSubrange(index..<u.index(after: index), with: String(s[index]))
}
indices.removeSubrange(0..<m)

print(u)   //For example: _e__o _l__g_ou_d

关于ios - 逐渐随机显示字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55318702/

10-10 21:13
查看更多