package main import ( "bytes" "fmt" "os" ) func main() { beg, end := []byte("165432"), []byte("707912") if len(os.Args) == 3 { beg, end = []byte(os.Args[1]), []byte(os.Args[2]) } var count int for { if validate(beg) { count++ } if bytes.Equal(beg, end) { break } beg = inc(beg) } fmt.Println(count) } func inc(num []byte) []byte { if len(num) == 0 { return []byte{'1'} } else if num[len(num)-1] == '9' { return append(inc(num[:len(num)-1]), '0') } else { num[len(num)-1]++ } return num } func validate(num []byte) bool { var dup bool for k := range num { if countSeq(num, k) == 2 { dup = true } if len(num) > k+1 && num[k] > num[k+1] { return false } } return dup } func countSeq(num []byte, idx int) int { ret := 1 if len(num) > idx+1 && num[idx+1] == num[idx] { ret += countSeq(num[idx+1:], 0) } if idx >= 1 && num[idx-1] == num[idx] { ret += countSeq(num[:idx], idx-1) } return ret }