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