/* * Unique word count in Go * Usage: go run counts.go < file * @author gtowell * created: July 20, 2021 */ package main import ( "bufio" "fmt" "os" "strings" ) func removePunc(r rune) rune { if strings.IndexRune(".?!,", r) < 0 { return r } return -1 } func replacePunc(r rune) rune { if strings.IndexRune("-", r) < 0 { return r } return ' ' } func main() { counts := make(map[string]int) input := bufio.NewScanner(os.Stdin) for input.Scan() { for _, v := range strings.Fields(strings.Map(replacePunc, strings.Map(removePunc, strings.ToLower(input.Text())))) { counts[v]++ } } fmt.Printf("%d", len(counts)) fmt.Println(counts) }