62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
func reverse(s string) string {
|
|
chars := []rune(s)
|
|
for i, j := 0, len(chars)-1; i < j; i, j = i+1, j-1 {
|
|
chars[i], chars[j] = chars[j], chars[i]
|
|
}
|
|
return string(chars)
|
|
}
|
|
|
|
func findIndex(sl []string, s string) int {
|
|
return sort.Search(len(sl), func(i int) bool {
|
|
return sl[i] > s
|
|
})
|
|
}
|
|
|
|
func main() {
|
|
const (
|
|
layout = "20060102"
|
|
layout2 = "2006-01-02"
|
|
)
|
|
palins := []string{}
|
|
for i := 0; i < 10000; i++ {
|
|
y := fmt.Sprintf("%04d", i)
|
|
r := reverse(y)
|
|
if r[:2] > "12" || r[2:] > "31" {
|
|
continue
|
|
}
|
|
d := fmt.Sprintf("%s%s", y, r)
|
|
t, err := time.Parse(layout, d)
|
|
if err == nil {
|
|
palins = append(palins, t.Format(layout2))
|
|
}
|
|
}
|
|
le := len(palins)
|
|
i1 := findIndex(palins, "1001-01-01")
|
|
i2 := findIndex(palins, "2020-02-02")
|
|
fmt.Printf("There are %d palindromic dates after 0000-01-01 of which:\n", le)
|
|
fmt.Printf(" %d are after 1000-01-01\n", le-i1)
|
|
fmt.Printf(" %d are after 2020-02-02\n", le-i2)
|
|
fmt.Println("\nThe first 15 after 2020-02-02 are:")
|
|
for i := 0; i < 15; i++ {
|
|
if i != 0 && i%5 == 0 {
|
|
fmt.Println()
|
|
}
|
|
fmt.Printf("%s ", palins[i+i2])
|
|
}
|
|
fmt.Println("\n\nThe last 15 before 9999-12-31 are:")
|
|
for i := 15; i >= 1; i-- {
|
|
if i != 15 && i%5 == 0 {
|
|
fmt.Println()
|
|
}
|
|
fmt.Printf("%s ", palins[le-i])
|
|
}
|
|
fmt.Println()
|
|
}
|