package main import ( "fmt" "bufio" "os" "slices" "flag" "strings" "strconv" ) type Opts struct { IgnoreCase bool Numeric bool } func ParseOpts() Opts { var opts Opts flag.BoolVar(&opts.IgnoreCase, "f", false, "ignore case") flag.BoolVar(&opts.Numeric, "n", false, "numeric sort") flag.Parse() return opts } func NumericSort(a string, b string) int { a_int, a_err := strconv.Atoi(a) b_int, b_err := strconv.Atoi(b) if a_err != nil || b_err != nil { return strings.Compare(a, b) } else { return a_int - b_int } } func IgnoreCase(a string, b string) int { return strings.Compare(strings.ToLower(a), strings.ToLower(b)) } func main() { lines := make([]string, 0, 100) opts := ParseOpts() scan := bufio.NewScanner(os.Stdin) for scan.Scan() { line := scan.Text() lines = append(lines, line) } if opts.Numeric { slices.SortFunc(lines, NumericSort) } else if opts.IgnoreCase{ slices.SortFunc(lines, IgnoreCase) } else { slices.Sort(lines) } for _, line := range lines { fmt.Println(line) } }