57 lines
835 B
Go
57 lines
835 B
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"math/rand/v2"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
onlyNum := flag.Bool("num", false, "generate only numbers (no formatting)")
|
|
flag.Parse()
|
|
|
|
cpf := generateCPF()
|
|
|
|
if *onlyNum {
|
|
fmt.Println(cpf)
|
|
} else {
|
|
fmt.Printf("%s.%s.%s-%s\n", cpf[:3], cpf[3:6], cpf[6:9], cpf[9:])
|
|
}
|
|
}
|
|
|
|
func generateCPF() string {
|
|
digits := make([]int, 11)
|
|
|
|
for i := range 9 {
|
|
digits[i] = rand.IntN(10)
|
|
}
|
|
|
|
sum := 0
|
|
for i := range 9 {
|
|
sum += digits[i] * (10 - i)
|
|
}
|
|
rem := sum % 11
|
|
if rem < 2 {
|
|
digits[9] = 0
|
|
} else {
|
|
digits[9] = 11 - rem
|
|
}
|
|
|
|
sum = 0
|
|
for i := range 10 {
|
|
sum += digits[i] * (11 - i)
|
|
}
|
|
rem = sum % 11
|
|
if rem < 2 {
|
|
digits[10] = 0
|
|
} else {
|
|
digits[10] = 11 - rem
|
|
}
|
|
|
|
var result strings.Builder
|
|
for _, d := range digits {
|
|
fmt.Fprintf(&result, "%d", d)
|
|
}
|
|
return result.String()
|
|
}
|