如何修复此代码,使其随机播放字母并且对第一个字母和最后一个字母、标点符号没有影响

Posted

技术标签:

【中文标题】如何修复此代码,使其随机播放字母并且对第一个字母和最后一个字母、标点符号没有影响【英文标题】:How to fix this code so that it shuffles letters and has no affect on first letter and last letter, punctuation 【发布时间】:2020-01-16 16:44:07 【问题描述】:

我正在处理 go/golang,尝试编写带有字符串和种子的代码。它应该返回一个打乱的字符串,其中单词、标点符号和数字中的第一个和最后一个字母都没有改变。

例子:

我的名字是尼基。我的号码是 333

应该是

我的 nmae 是 Nkiki。我的 nebumr 是 333

我对 goland/go 很陌生。已经尝试使用rand.Shuffle 来做到这一点:

   func splitText(text string) []string 
    re := regexp.MustCompile("[A-Za-z0-9']+|[':;?().,!\\ ]")
    return re.FindAllString(text, -1)


    func scramble(text string, seed int64) string 

    rand.Seed(seed)
    split := splitText(text)

    for i := range split 
        e := split[i]

        r := []byte(e)

        for i := 0; i < len(r); i++ 
            l := len(r) - 1
            if i == 0 
                return string(r[0])
            
            if i == l 
                return string(r[l])
            

            if i > 0 || i < l 
                n := rand.Intn(l)
                x := r[i]
                r[i] = r[n]
                r[n] = x

            

            if (r[i] >= 32 && r[i] <= 62) || (r[i] >= 91 && r[i] <= 96) 
                return string(r[i])
            
        

    
    return text



func main() 

    v := ("The quick brown fox jumps over the lazy dog.")
    scramble(v, 100)
    fmt.Println(scramble(v, 100))


但这只会返回一个字母,并且只有在remoe f==0f==l 时,它才不会跳到下一个单词。

【问题讨论】:

在嵌套的 for 循环中,您有一个 if i==0 条件,该条件在循环第一次运行时始终为真,因此它在不执行其余代码的情况下返回。内部 for 循环索引 i 遮蔽了外部循环 i,所以这可能是您困惑的根源。 但是如何解决它才能打印和随机播放? 按照您的操作方式,您将失去单词边界和标点符号。所以我建议你改变你的算法。一种方法是将字符串转换为 []rune,然后迭代元素。在您进行迭代时,找出单词边界,使用 rand.Shuffle 将字节打乱,然后将生成的 []rune 转换为字符串并返回。 你能用一些代码示例解释一下吗? 我无法为您编写代码,但我描述的算法需要保留一个状态变量来告诉您是否在一个单词中。如果您看到一个字母 (unicode.IsLetter),您不在一个单词中,您将更改状态变量,并且只要您看到字母就继续。当你看到一个非字母时,这给了你单词的结尾。然后,您可以在 word start+1:word end-1 之间洗牌,然后继续。 【参考方案1】:

我对 goland/go 很陌生。


避免使用新语言编写程序,就好像您仍在使用旧语言编写程序一样。


编写带有字符串和种子的代码。它应该返回一个洗牌的 单词中第一个和最后一个字母、标点和 数字保持不变。

例子:

my name is Nikki. My number is 333

应该是

my nmae is Nkiki. My nebumr is 333

这是一个用 Go 编写的解决方案。

package main

import (
    "fmt"
    "math/rand"
    "unicode"
)

func shuffle(word []rune, rand *rand.Rand) 
    if len(word) < 4 
        return
    
    chars := word[1 : len(word)-1]
    rand.Shuffle(
        len(chars),
        func(i, j int) 
            chars[i], chars[j] = chars[j], chars[i]
        ,
    )


func scramble(text string, seed int64) string 
    rand := rand.New(rand.NewSource(seed))

    chars := []rune(text)
    inWord := false
    i := 0
    for j, char := range chars 
        if !unicode.IsLetter(char) 
            if inWord 
                shuffle(chars[i:j], rand)
            
            inWord = false
         else if !inWord 
            inWord = true
            i = j
        
    
    if inWord 
        shuffle(chars[i:len(chars)], rand)
    
    return string(chars)


func main() 
    for _, text := range []string
        "my name is Nikki. My number is 333",
        "The quick brown fox jumps over the lazy dog.",
        loremipsum,
     
        fmt.Printf("%q\n", text)
        fmt.Printf("%q\n", scramble(text, 100))
    


var loremipsum = `
Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
Excepteur sint occaecat cupidatat non proident, 
sunt in culpa qui officia deserunt mollit anim id est laborum.
`

游乐场:https://play.golang.org/p/NoHXynQSD4p

输出:

"my name is Nikki. My number is 333"
"my name is Nkiki. My neubmr is 333"
"The quick brown fox jumps over the lazy dog."
"The quick bowrn fox jmups over the lzay dog."
"\nLorem ipsum dolor sit amet, consectetur adipiscing elit, \nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \nUt enim ad minim veniam, \nquis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. \nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. \nExcepteur sint occaecat cupidatat non proident, \nsunt in culpa qui officia deserunt mollit anim id est laborum.\n"
"\nLorem isupm dloor sit amet, csttunoecer andiipcsig elit, \nsed do emiousd tepmor idinicdnut ut lorbae et dorloe mgnaa aqilua. \nUt einm ad miinm vinaem, \nquis notursd eioattxceirn ualmlco libroas nisi ut aqiiulp ex ea cdmoomo cuanqesot. \nDius aute iurre dolor in rienreehredpt in vlptuotae vielt esse clulim drlooe eu fuagit nulla ptaaiurr. \nEepuxcter snit ocecacat citapadut non prinodet, \nsnut in cpula qui oficfia dsuenret milolt ainm id est laorbum.\n"

【讨论】:

以上是关于如何修复此代码,使其随机播放字母并且对第一个字母和最后一个字母、标点符号没有影响的主要内容,如果未能解决你的问题,请参考以下文章

如何检查PHP中的字母是大写还是小写?

jQuery:动画隐藏字母随机但间隔相等

在单词的每个字母之间插入一个数字

如何检查字符串是不是至少有 1 个字母字符? [复制]

如何成对存储二维数组中的随机字母?

根据第一列中的字母数将行与上一行连接起来