diff options
| author | Michael Lee Firkins <michael@firkins> | 2022-03-20 12:04:59 +0700 |
|---|---|---|
| committer | Michael Lee Firkins <michael@firkins> | 2022-03-20 12:04:59 +0700 |
| commit | 63d5c25a82cbdbc7ae51789d3be79aa04607b59e (patch) | |
| tree | c02d2a3d47be43eb718709f91f99d7d0a607d595 /challenge-152 | |
| parent | ac763daa5b5004646d92bfc45a2d37dd6adfbcbd (diff) | |
| download | perlweeklychallenge-club-63d5c25a82cbdbc7ae51789d3be79aa04607b59e.tar.gz perlweeklychallenge-club-63d5c25a82cbdbc7ae51789d3be79aa04607b59e.tar.bz2 perlweeklychallenge-club-63d5c25a82cbdbc7ae51789d3be79aa04607b59e.zip | |
pwc152 solution in Go
Diffstat (limited to 'challenge-152')
| -rw-r--r-- | challenge-152/pokgopun/go/ch-1.go | 54 | ||||
| -rw-r--r-- | challenge-152/pokgopun/go/ch-2.go | 154 |
2 files changed, 208 insertions, 0 deletions
diff --git a/challenge-152/pokgopun/go/ch-1.go b/challenge-152/pokgopun/go/ch-1.go new file mode 100644 index 0000000000..0678a7f3ef --- /dev/null +++ b/challenge-152/pokgopun/go/ch-1.go @@ -0,0 +1,54 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "log" + "os" + "sort" + "strings" +) + +func main() { + var jsonStream string + if len(os.Args) > 1 { + for _, v := range os.Args[1:] { + jsonStream += fmt.Sprintf("%v\n", v) + } + } else { + jsonStream = ` +[ [1], [5,3], [2,3,4], [7,1,0,2], [6,4,5,2,8] ] +[ [5], [2,3], [4,1,5], [0,1,2,3], [7,2,4,1,9] ] +` + } + dec := json.NewDecoder(strings.NewReader(jsonStream)) + for { + var sos [][]int + if err := dec.Decode(&sos); err == io.EOF { + break + } else if err != nil { + log.Fatal(err) + } + fmt.Println("Input: $triangle =", sos) + fmt.Println("Output:", sumMin(sos)) + } + // sos := [][]int{ + // []int{1}, + // []int{2, 3}, + // []int{4, 5, 6}, + // []int{7, 8, 9, 10}, + // []int{11, 12, 13, 14, 15}, + // } + // fmt.Println(sos) +} + +func sumMin(s [][]int) (sum int) { + for _, v := range s { + sort.Slice(v, func(i, j int) bool { + return v[i] < v[j] + }) + sum += v[0] + } + return sum +} diff --git a/challenge-152/pokgopun/go/ch-2.go b/challenge-152/pokgopun/go/ch-2.go new file mode 100644 index 0000000000..c14368f65e --- /dev/null +++ b/challenge-152/pokgopun/go/ch-2.go @@ -0,0 +1,154 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "log" + "os" + "strings" +) + +//type rectangle struct { +// posL coordinate +// posH coordinate +// dimension int +//} +// +//type coordinate struct { +// x, y, z int +//} +type rectangle struct { + pointL []int + pointH []int +} + +func main() { + var jsonStream string + if len(os.Args) > 1 { + for _, v := range os.Args[1:] { + jsonStream += fmt.Sprintf("%v\n", v) + } + } else { + jsonStream = ` +[ [[-3,-1],[1,3]], [[-1,-3],[2,2]], [[0,1],[3,5]] ] +[ [[-3,-1],[1,3]], [[-1,-3],[2,2]], [[0,1],[3,5]], [[3,3],[5,5]] ] +[ [[-3,-1],[1,3]], [[-1,-3],[2,2]], [[0,1],[3,5]], [[3,3],[5,5]], [[-5,-5],[5,5]] ] +[ [[0,0,0],[4,4,4]], [[-3,-3,-3],[0,0,0]] ] +[ [[0,0,0],[4,4,4]], [[-3,-3,-3],[0,0,0]], [[-1,-1,-1],[1,1,1]] ] +[ [[0,0,0],[4,4,4]], [[-3,-3,-3],[0,0,0]], [[-1,-1,-1],[1,1,1]], [[-5,-5,-5],[5,5,5]] ] +[ [[-1,0],[2,2]], [[0,-1],[4,4]] ] +[ [[-3,-1],[1,3]], [[-1,-3],[2,2]] ] +` + } + dec := json.NewDecoder(strings.NewReader(jsonStream)) + for { + var sosos [][][]int + if err := dec.Decode(&sosos); err == io.EOF { + break + } else if err != nil { + log.Fatal(err) + } + dimension := len(sosos[0][0]) + recs := []rectangle{} + var recKeys []int + sumCoverage := 0 + mi := map[int]string{0: "Input:"} + for i, v := range sosos { + rec := newRectangle(v) + recKeys = append(recKeys, i) + recs = append(recs, rec) + sumCoverage += recCoverage(rec) + fmt.Printf("%16s %d => %v\n", mi[i]+" Rectangle", recKeys[i]+1, v) + } + sumOverlap := 0 + for i := 2; i <= len(recs); i++ { + for _, orecKeys := range getCombo(i, recKeys) { + var orec rectangle + for j := 0; j < dimension; j++ { + var maxPointL, minPointH int + for i, orecKey := range orecKeys { + pointL := recs[orecKey].pointL[j] + pointH := recs[orecKey].pointH[j] + if i == 0 { + maxPointL = pointL + minPointH = pointH + } + if maxPointL < pointL { + maxPointL = pointL + } + if minPointH > pointH { + minPointH = pointH + } + } + if maxPointL < minPointH { + orec.pointL = append(orec.pointL, maxPointL) + orec.pointH = append(orec.pointH, minPointH) + } + } + if len(orec.pointL) == dimension { + overlap := recCoverage(orec) + if len(orecKeys)%2 == 0 { + sumOverlap += overlap + } else { + sumOverlap -= overlap + } + } + } + } + fmt.Printf("Output: %v\n\n", sumCoverage-sumOverlap) + } +} +func recCoverage(r rectangle) int { + c := 1 + for i, v := range r.pointH { + c *= v - r.pointL[i] + } + return c +} +func newRectangle(s [][]int) (r rectangle) { + r.pointL = s[0] + r.pointH = s[1] + return r +} +func getCombo(n int, e []int) (r [][]int) { + c := []int{} + cTree(n, e, c, func(s []int) { + r = append(r, s) + }) + return r +} +func cTree(n int, e []int, c []int, f func(s []int)) { + if len(c) == n || len(c)+len(e) == n { + s := append(c, e...) + f(s[:n]) + } else { + for i := 0; len(c)+len(e)-i >= n; i++ { + cTree(n, e[i+1:], append(c, e[i]), f) + } + } +} + +//func recCoverage(r rectangle) int { +// c := 1 +// sol := []int{r.posH.x - r.posL.x, r.posH.y - r.posL.y, r.posH.z - r.posL.z} +// for i := 0; i < r.dimension; i++ { +// c *= sol[i] +// } +// return c +//} +//func newCoordinate(d int, s []int) (c coordinate) { +// soc := [3]*int{&c.x, &c.y, &c.z} +// for i := 0; i < d; i++ { +// *soc[i] = s[i] +// } +// return c +//} +//func newRectangle(s [][]int) (r rectangle) { +// r.dimension = len(s[0]) +// sop := [2]*coordinate{&r.posL, &r.posH} +// for i := 0; i < len(sop); i++ { +// *sop[i] = newCoordinate(r.dimension, s[i]) +// } +// return r +//} |
