这个想法是创建一个函数,它接受一些整数字符串,文本也可以包含符号,如',。等。-如果字符串中有数字,返回string-一个单词的第一个和最后一个字母不应该被碰触。打乱其他字母。
- 如果我们有一个"符号,不要打乱它。
问题是,我希望打印出在想要的部分,但得到另一个结果。例如:而不是->Aa, metatr ->磨等。我使用seed = 100
标记化函数:
import "regexp"
func tokenize(text string) []string {
re := regexp.MustCompile(`[A-Za-z0-9']+|[':;?().,!\ ]`)
return re.FindAllString(text, -1)
}
争夺代码
import (
"math/rand"
"strconv"
)
func scramble(text string, seed int64) string {
rand.Seed(seed)
slicy := tokenize(text)
var str string = ""
for a := 0; a < len(slicy); a++ {
_, err := strconv.Atoi(slicy[a])
if err != nil {
var shufle []byte
for i := 1; i < len(slicy[a])-1; i++ {
shufle = append(shufle, slicy[a][i])
}
if slicy[a] != " " && slicy[a] != "." && slicy[a] != "," && slicy[a] != "(" && slicy[a] != ")" {
new_length := 0
for d := 0; d < len(shufle); d++ {
if string(shufle[d]) == "'" {
new_length = d - 1
}
}
if new_length != 0 {
for l := 0; l < new_length-1; l++ {
m := l + 1
shufle[l], shufle[m] = shufle[m], shufle[l]
}
} else {
rand.Shuffle(len(shufle), func(k, j int) {
shufle[k], shufle[j] = shufle[j], shufle[k]
})
}
var scrambled_list []byte
scrambled_list = append(scrambled_list, slicy[a][0])
for d := 0; d < len(shufle); d++ {
scrambled_list = append(scrambled_list, shufle[d])
}
scrambled_list = append(scrambled_list, slicy[a][len(slicy[a])-1])
str = str + string(scrambled_list)
} else {
switch slicy[a] {
case " ":
str += " "
case ".":
str += "."
case "(":
str += "("
case ")":
str += ")"
case ",":
str += ","
default:
}
}
} else {
return text
}
}
return str
}
当我测试它时,i失败了:
输入:
"it doesn't matter in what order the letters in a word are, the only important thing is that the first and last letter be at the right place."
:
"it deson't metatr in waht oredr the lettres in a wrod are, the only inmproatt thing is taht the frist and last letetr be at the right plcae."
结果:
一个单词的字母顺序如何并不重要,重要的是第一个字母和最后一个字母应该在正确的位置。根据我对OP要求的理解,这是另一种解决方案。
在一个句子中,如果它是nburem,则删除每个单词,但保留其不受影响的单词:
<<;';';;()&;,第一个字母,最后一个字母。
它使用bufio。扫描器配置为使用bufio.ScanWords.
按单词分割输入当找到一个单词时,如果检测到它是一个数字,则保持它完整,否则检查单词的长度,如果大于2,则对单词进行洗牌。
对单词进行洗牌,它使用字符串按text until ".,()'""
的一部分扫描它。然后使用rand.Shuffle对每个部分进行洗牌。
package main
import (
"bufio"
"fmt"
"math/rand"
"strconv"
"strings"
)
func main() {
input := `Within a sentence, if it is not a number, scramble each words, but leave intact those characters "'".,()", the first letter, and the last letter.`
output := scramble(input, 100)
fmt.Printf("%vn", input)
fmt.Printf("%vn", output)
}
func scramble(text string, seed int64) (output string) {
rand.Seed(seed)
b := bufio.NewScanner(strings.NewReader(text))
b.Split(bufio.ScanWords)
for b.Scan() {
w := b.Text()
_, err := strconv.Atoi(w)
if err == nil || len(w) < 2 {
output += w
} else {
output += shuffleWord(w)
}
output += " "
}
return strings.TrimSuffix(output, " ")
}
func shuffleWord(input string) (output string) {
if len(input) < 2 {
output = input
return
}
r := []rune(input)
ln := len(r)
for i := 1; i < ln-1; i++ {
n := strings.IndexAny(input[i:], ".,()'"")
if n == -1 {
n = ln - i
}
if n > 0 {
rand.Shuffle(n, func(k, j int) {
r[i+k], r[i+j] = r[i+j], r[i+k]
})
i += n - 1
}
}
output = string(r)
return
}
试试这里