package main import "fmt" // 10^8 is the maximum ... So let's use uint64 ... const LIMIT_MAX = uint64(100000000) func reverse( in uint64 ) (out uint64) { for ; in != 0 ; in /= 10 { out *= 10 out += in % 10 } return } func isPalindromic( in uint64 ) bool { return in == reverse(in) } func showPile( slice []uint64 ) { for i := 0 ; i < len(slice) ; i++ { fmt.Printf("[%d]", slice[i]) } fmt.Println("") } func main() { pile := []uint64{5}; mem := [LIMIT_MAX]bool{}; for cmp := uint64(3) ; ; cmp++ { tmp := []uint64{}; for _,v := range pile { mem[v] = true if v+cmp*cmp < LIMIT_MAX { tmp = append(tmp, v+cmp*cmp); } } pile = append(tmp, cmp*cmp+(cmp-1)*(cmp-1)) if len(tmp) == 0 { break } } cmp := 0 for i,v := range mem { if v && isPalindromic(uint64(i)) { cmp+=i } } fmt.Println(cmp) }