package main import ( "fmt" "io" "log" ) func main() { var input []string var readInp string for { _, err := fmt.Scan(&readInp) if err != nil { if err != io.EOF { log.Fatal(err) } break } input = append(input, readInp) } var numNice int for _, k := range input { if isNicePt2(k) { numNice++ } } fmt.Printf("There are %d nice strings (out of %d total)\n", numNice, len(input)) } func isNicePt1(s string) bool { var prev byte var numVowels int var hasDouble bool for i := range s { if s[i] == 'b' && prev == 'a' { return false } else if s[i] == 'd' && prev == 'c' { return false } else if s[i] == 'q' && prev == 'p' { return false } else if s[i] == 'y' && prev == 'x' { return false } else if s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' { numVowels++ } if prev == s[i] { hasDouble = true } prev = s[i] } return (numVowels > 2 && hasDouble) } func isNicePt2(s string) bool { var splitRepeat bool var double bool for i := range s { if i > 0 { double = double || hasDouble(s[i-1], s[i], s[i+1:]) } if i > 1 { splitRepeat = splitRepeat || (s[i-2] == s[i]) } if double && splitRepeat { return true } } return false } func hasDouble(b1, b2 byte, s string) bool { var prev byte for i := range s { if prev == b1 && s[i] == b2 { return true } prev = s[i] } return false }