aboutsummaryrefslogtreecommitdiff
path: root/challenge-152
diff options
context:
space:
mode:
authorMichael Lee Firkins <michael@firkins>2022-03-20 12:04:59 +0700
committerMichael Lee Firkins <michael@firkins>2022-03-20 12:04:59 +0700
commit63d5c25a82cbdbc7ae51789d3be79aa04607b59e (patch)
treec02d2a3d47be43eb718709f91f99d7d0a607d595 /challenge-152
parentac763daa5b5004646d92bfc45a2d37dd6adfbcbd (diff)
downloadperlweeklychallenge-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.go54
-rw-r--r--challenge-152/pokgopun/go/ch-2.go154
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
+//}