diff options
| -rw-r--r-- | challenge-306/pokgopun/go/ch-1.go | 80 | ||||
| -rw-r--r-- | challenge-306/pokgopun/go/ch-2.go | 93 |
2 files changed, 173 insertions, 0 deletions
diff --git a/challenge-306/pokgopun/go/ch-1.go b/challenge-306/pokgopun/go/ch-1.go new file mode 100644 index 0000000000..c97fa86533 --- /dev/null +++ b/challenge-306/pokgopun/go/ch-1.go @@ -0,0 +1,80 @@ +//# https://theweeklychallenge.org/blog/perl-weekly-challenge-306/ +/*# + +Task 1: Odd Sum + +Submitted by: [42]Mohammad Sajid Anwar + __________________________________________________________________ + + You are given an array of positive integers, @ints. + + Write a script to return the sum of all possible odd-length subarrays + of the given array. A subarray is a contiguous subsequence of the + array. + +Example 1 + +Input: @ints = (2, 5, 3, 6, 4) +Output: 77 + +Odd length sub-arrays: +(2) => 2 +(5) => 5 +(3) => 3 +(6) => 6 +(4) => 4 +(2, 5, 3) => 10 +(5, 3, 6) => 14 +(3, 6, 4) => 13 +(2, 5, 3, 6, 4) => 20 + +Sum => 2 + 5 + 3 + 6 + 4 + 10 + 14 + 13 + 20 => 77 + +Example 2 + +Input: @ints = (1, 3) +Output: 4 + +Task 2: Last Element +#*/ +//# solution by pokgopun@gmail.com + +package main + +import ( + "io" + "os" + + "github.com/google/go-cmp/cmp" +) + +type ints []int + +func (is ints) odsm() int { + sm := 0 + l := len(is) + o := 1 + for o <= l { + i := 0 + for i+o <= l { + for _, v := range is[i : i+o] { + sm += v + } + i++ + } + o += 2 + } + return sm +} + +func main() { + for _, data := range []struct { + input ints + output int + }{ + {ints{2, 5, 3, 6, 4}, 77}, + {ints{1, 3}, 4}, + } { + io.WriteString(os.Stdout, cmp.Diff(data.input.odsm(), data.output)) // blank if ok, otherwise show the difference + } +} diff --git a/challenge-306/pokgopun/go/ch-2.go b/challenge-306/pokgopun/go/ch-2.go new file mode 100644 index 0000000000..fac02f55d4 --- /dev/null +++ b/challenge-306/pokgopun/go/ch-2.go @@ -0,0 +1,93 @@ +//# https://theweeklychallenge.org/blog/perl-weekly-challenge-306/ +/*# + +Task 2: Last Element + +Submitted by: [43]Mohammad Sajid Anwar + __________________________________________________________________ + + You are given a array of integers, @ints. + + Write a script to play a game where you pick two biggest integers in + the given array, say x and y. Then do the following: +a) if x == y then remove both from the given array +b) if x != y then remove x and replace y with (y - x) + + At the end of the game, there is at most one element left. + + Return the last element if found otherwise return 0. + +Example 1 + +Input: @ints = (3, 8, 5, 2, 9, 2) +Output: 1 + +Step 1: pick 8 and 9 => (3, 5, 2, 1, 2) +Step 2: pick 3 and 5 => (2, 2, 1, 2) +Step 3: pick 2 and 1 => (1, 2, 2) +Step 4: pick 2 and 1 => (1, 2) +Step 5: pick 1 and 2 => (1) + +Example 2 + +Input: @ints = (3, 2, 5) +Output: 0 + +Step 1: pick 3 and 5 => (2, 2) +Step 2: pick 2 and 2 => () + __________________________________________________________________ + + Last date to submit the solution 23:59 (UK Time) Sunday 2^nd January + 2025. + __________________________________________________________________ + +SO WHAT DO YOU THINK ? +#*/ +//# solution by pokgopun@gmail.com + +package main + +import ( + "io" + "os" + "slices" + + "github.com/google/go-cmp/cmp" +) + +type ints []int + +func (is ints) lstelm() int { + for { + l := len(is) + switch l { + case 0: + return 0 + case 1: + return is[0] + } + slices.Sort(is) + d := is[l-2] - is[l-1] + if d == 0 { + is = is[:l-2] + continue + } + if d < 0 { + d *= -1 + } + is[l-2] = d + is = is[:l-1] + } +} + +func main() { + for _, data := range []struct { + input ints + output int + }{ + {ints{3, 8, 5, 2, 9, 2}, 1}, + {ints{3, 2, 5}, 0}, + } { + io.WriteString(os.Stdout, cmp.Diff(data.input.lstelm(), data.output)) // blank if ok, otherwise show the difference + } +} |
