diff options
author | ache <ache@ache.one> | 2018-09-12 03:32:42 +0200 |
---|---|---|
committer | ache <ache@ache.one> | 2018-09-12 03:32:42 +0200 |
commit | 726f4a24a2c503aaf4bb0038c36d427a25f9a409 (patch) | |
tree | c757c9c6c4efc42fdccf3aee313e3aad6dfe4e60 | |
parent | Ajout du probleme 61 (diff) |
Problem 61 solution
-rwxr-xr-x | p61/p61 | bin | 0 -> 1911589 bytes | |||
-rw-r--r-- | p61/p61.go | 121 |
2 files changed, 67 insertions, 54 deletions
Binary files differ @@ -5,44 +5,55 @@ import ( ) -type num struct { +type IndexedSet struct { v,i int } var it = 0 -func fillByFormule( slc *[]int, form func (int) int) { +func fillByFormule( slc *[]IndexedSet, form func (int) int) { it++ for n, i := 0, 0 ; n < 10000 ; i++ { if n > 999 && n < 10000 { if n % 100 > 9 { - *slc = append(*slc, num{v=n, i=it}) + *slc = append(*slc, IndexedSet{v:n, i:it}) } } n = form(i) } } -func fillByNumber( dict map[int][]int, num []int) { +func fillByNumber( dict map[int][]IndexedSet, num []IndexedSet) { for _,n := range num { - dict[n/100] = append(dict[n/100], n%100) + dict[n.v/100] = append(dict[n.v/100], n) } } +func containsIndex( ref []IndexedSet, index int) bool { + for _,n := range ref { + if n.i == index { + return true + } + } + return false +} +func containsValue( ref []IndexedSet, value int) bool { + for _,n := range ref { + if n.v == value { + return true + } + } + return false +} func main () { - trin := []int{} - sqrt := []int{} - pent := []int{} - hexa := []int{} - hept := []int{} - octa := []int{} + trin := []IndexedSet{} + sqrt := []IndexedSet{} + pent := []IndexedSet{} + hexa := []IndexedSet{} + hept := []IndexedSet{} + octa := []IndexedSet{} - numMap := make(map[int][]num) - /* - hexaMap := make(map[int][]int) - heptMap := make(map[int][]int) - octaMap := make(map[int][]int) - */ + numMap := make(map[int][]IndexedSet) fillByFormule(&trin, func(x int) int { return (x*(x+1))>>1 }) @@ -52,57 +63,59 @@ func main () { fillByFormule(&hept, func(x int) int { return (x*(5*x-3))>>1 }) fillByFormule(&octa, func(x int) int { return x*(3*x-2) }) - fillByNumber(numMap, trin, 1) - fillByNumber(numMap, sqrt, 2) - /* - fillByNumber(sqrtMap, sqrt) - fillByNumber(pentMap, pent) - */ - - fmt.Println(trin) - fmt.Println(numMap) + fillByNumber(numMap, trin) + fillByNumber(numMap, sqrt) + fillByNumber(numMap, pent) + fillByNumber(numMap, hexa) + fillByNumber(numMap, hept) - pile := []int{} + pile := []IndexedSet{} - empiler := func(i []int) { - pile = append(pile, i...) - } + pile = append( pile, octa...) - empiler(pent) + cycle := []IndexedSet{} - for len(pile) != 0{ - n_1 := n / 100 - n_2 := n % 100 + for len(pile) > 0 { + if len(cycle) >= 6 { + if (cycle[0].v/100) == (cycle[5].v%100) { + fmt.Println(cycle) + sum := 0 + for _,v := range cycle { + sum += v.v + } + fmt.Println(sum) + } + for pile[len(pile)-1].i != -1 { + pile = pile[:len(pile)-1] + } + } - cycle := []int{n8} - numberType := []int{0} - for len(cycle) != 3 { - + n := pile[len(pile)-1] + pile = pile[:len(pile)-1] + if n.i == -1 { + if len(cycle) > 0 { + cycle = cycle[:len(cycle)-1] + } else { + fmt.Println("Houston, we got a problem") + } + continue } - if _,ok := numMap[n_2] ; ok { - for + n_2 := n.v % 100 - for _, n1_2 := range numMap[n_2] { - if _,ok := trinMap[n1_2] ; ok { - for _, n2 := range trinMap[n1_2] { - n2_2 := n2 % 100 - if n2_2 == n8_1 { - fmt.Println(n1_2, n2_2, n8_2) - } + if !containsIndex(cycle, n.i) && !containsValue( cycle, n.v) { + cycle = append(cycle, n) + pile = append(pile, IndexedSet{ v:-1, i: -1} ) + if vList,ok := numMap[n_2] ; ok && vList != nil { + for _,v := range vList { + if !containsIndex( cycle, v.i ) { + pile = append(pile, v) } } } } } - - fmt.Println(len(trin)) - fmt.Println(len(sqrt)) - fmt.Println(len(pent)) - fmt.Println(len(hexa)) - fmt.Println(len(hept)) - fmt.Println(len(octa)) } |