type Entry struct { Prefix string// 动词部分 Suffix string// 量词+名词 Num int }
funcparse(text string) []Entry { var entries []Entry for _, line := range strings.Split(text, "\n") { line = strings.TrimSpace(line) if line == "" { continue } // 找到数字的起止位置 numStart, numEnd := -1, -1 for i, r := range line { if unicode.IsDigit(r) { if numStart == -1 { numStart = i } numEnd = i + 1 } } if numStart == -1 { continue } num, _ := strconv.Atoi(line[numStart:numEnd]) entries = append(entries, Entry{ Prefix: line[:numStart], Suffix: line[numEnd:], Num: num, }) } return entries }
拿到 entries 后,先原样倒序打印,验证解析正确:
1 2 3 4 5 6 7 8 9
funcprintReverse(entries []Entry) { fmt.Println(strings.Repeat("=", 54)) var sb strings.Builder for i := len(entries) - 1; i >= 0; i-- { fmt.Fprintf(&sb, "%s%d%s\n", entries[i].Prefix, entries[i].Num, entries[i].Suffix) } fmt.Print(sb.String()) fmt.Println(strings.Repeat("=", 54)) }
funcshuffleEntries(entries []Entry, groupSize int)string { rng := rand.New(rand.NewSource(time.Now().UnixNano())) // 按 groupSize 分段 groups := make([][]Entry, 0) for i := 0; i < len(entries); i += groupSize { end := i + groupSize if end > len(entries) { end = len(entries) } groups = append(groups, entries[i:end]) } for g := 0; g < len(groups)-1; g++ { rng.Shuffle(len(groups[g]), func(i, j int) { groups[g][i], groups[g][j] = groups[g][j], groups[g][i] }) } // 拼接输出 var sb strings.Builder for i := len(groups) - 1; i >= 0; i-- { for _, e := range groups[i] { fmt.Fprintf(&sb, "%s%d%s\n", e.Prefix, e.Num, e.Suffix) } } return sb.String() }