From a0de8e40d8f73d1b5a2b4e778f00bee801d419a2 Mon Sep 17 00:00:00 2001 From: Pok Date: Mon, 11 Aug 2025 18:28:36 +0700 Subject: pwc334 solution in go --- challenge-334/pokgopun/go/ch-1.go | 90 +++++++++++++++++++++++ challenge-334/pokgopun/go/ch-2.go | 146 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+) create mode 100644 challenge-334/pokgopun/go/ch-1.go create mode 100644 challenge-334/pokgopun/go/ch-2.go diff --git a/challenge-334/pokgopun/go/ch-1.go b/challenge-334/pokgopun/go/ch-1.go new file mode 100644 index 0000000000..66cc1bb2e5 --- /dev/null +++ b/challenge-334/pokgopun/go/ch-1.go @@ -0,0 +1,90 @@ +//# https://theweeklychallenge.org/blog/perl-weekly-challenge-334/ +/*# + +Task 1: Range Sum + +Submitted by: [50]Mohammad Sajid Anwar + __________________________________________________________________ + + You are given a list integers and pair of indices.. + + Write a script to return the sum of integers between the given indices + (inclusive). + +Example 1 + +Input: @ints = (-2, 0, 3, -5, 2, -1), $x = 0, $y = 2 +Output: 1 + +Elements between indices (0, 2) => (-2, 0, 3) +Range Sum: (-2) + 0 + 3 => 1 + +Example 2 + +Input: @ints = (1, -2, 3, -4, 5), $x = 1, $y = 3 +Output: -3 + +Elements between indices (1, 3) => (-2, 3, -4) +Range Sum: (-2) + 3 + (-4) => -3 + +Example 3 + +Input: @ints = (1, 0, 2, -1, 3), $x = 3, $y = 4 +Output: 2 + +Elements between indices (3, 4) => (-1, 3) +Range Sum: (-1) + 3 => 2 + +Example 4 + +Input: @ints = (-5, 4, -3, 2, -1, 0), $x = 0, $y = 3 +Output: -2 + +Elements between indices (0, 3) => (-5, 4, -3, 2) +Range Sum: (-5) + 4 + (-3) + 2 => -2 + +Example 5 + +Input: @ints = (-1, 0, 2, -3, -2, 1), $x = 0, $y = 2 +Output: 1 + +Elements between indices (0, 2) => (-1, 0, 2) +Range Sum: (-1) + 0 + 2 => 1 + +Task 2: +#*/ +//# solution by pokgopun@gmail.com + +package main + +import ( + "io" + "os" + + "github.com/google/go-cmp/cmp" +) + +type ints []int + +func (in ints) rs(x, y int) int { + sum := 0 + for _, v := range in[x : y+1] { + sum += v + } + return sum +} + +func main() { + for _, data := range []struct { + ints ints + x, y, res int + }{ + {ints{-2, 0, 3, -5, 2, -1}, 0, 2, 1}, + {ints{1, -2, 3, -4, 5}, 1, 3, -3}, + {ints{1, 0, 2, -1, 3}, 3, 4, 2}, + {ints{-5, 4, -3, 2, -1, 0}, 0, 3, -2}, + {ints{-1, 0, 2, -3, -2, 1}, 0, 2, 1}, + } { + io.WriteString(os.Stdout, cmp.Diff(data.ints.rs(data.x, data.y), data.res)) // blank if ok, otherwise show the differece + } +} diff --git a/challenge-334/pokgopun/go/ch-2.go b/challenge-334/pokgopun/go/ch-2.go new file mode 100644 index 0000000000..a5345e9c78 --- /dev/null +++ b/challenge-334/pokgopun/go/ch-2.go @@ -0,0 +1,146 @@ +//# https://theweeklychallenge.org/blog/perl-weekly-challenge-334/ +/*# + +Task 2: + +Submitted by: [51]Mohammad Sajid Anwar + __________________________________________________________________ + + You are given current location as two integers: x and y. You are also + given a list of points on the grid. + + A point is considered valid if it shares either the same x-coordinate + or the same y-coordinate as the current location. + + Write a script to return the index of the valid point that has the + smallest Manhattan distance to the current location. If multiple valid + points are tied for the smallest distance, return the one with the + lowest index. If no valid points exist, return -1. + + The Manhattan distance between two points (x1, y1) and (x2, y2) is + calculated as: |x1 - x2| + |y1 - y2| + +Example 1 + +Input: $x = 3, $y = 4, @points ([1, 2], [3, 1], [2, 4], [2, 3]) +Output: 2 + +Valid points: [3, 1] (same x), [2, 4] (same y) + +Manhattan distances: + [3, 1] => |3-3| + |4-1| = 3 + [2, 4] => |3-2| + |4-4| = 1 + +Closest valid point is [2, 4] at index 2. + +Example 2 + +Input: $x = 2, $y = 5, @points ([3, 4], [2, 3], [1, 5], [2, 5]) +Output: 3 + +Valid points: [2, 3], [1, 5], [2, 5] + +Manhattan distances: + [2, 3] => 2 + [1, 5] => 1 + [2, 5] => 0 + +Closest valid point is [2, 5] at index 3. + +Example 3 + +Input: $x = 1, $y = 1, @points ([2, 2], [3, 3], [4, 4]) +Output: -1 + +No point shares x or y with (1, 1). + +Example 4 + +Input: $x = 0, $y = 0, @points ([0, 1], [1, 0], [0, 2], [2, 0]) +Output: 0 + +Valid points: all of them + +Manhattan distances: + [0, 1] => 1 + [1, 0] => 1 + [0, 2] => 2 + [2, 0] => 2 + +Tie between index 0 and 1, pick the smaller index: 0 + +Example 5 + +Input: $x = 5, $y = 5, @points ([5, 6], [6, 5], [5, 4], [4, 5]) +Output: 0 + +Valid points: all of them + [5, 6] => 1 + [6, 5] => 1 + [5, 4] => 1 + [4, 5] => 1 + +All tie, return the one with the lowest index: 0 + __________________________________________________________________ + + Last date to submit the solution 23:59 (UK Time) Sunday 17th August + 2025. + __________________________________________________________________ + +SO WHAT DO YOU THINK ? +#*/ +//# solution by pokgopun@gmail.com + +package main + +import ( + "io" + "os" + + "github.com/google/go-cmp/cmp" +) + +type point struct { + x, y int +} + +type points []point + +// mmd return index of minimum mahattan distance for given origin point +func (ps points) mmd(x, y int) int { + var ( + idx = -1 // default index if not found minimum manhattan distance + mn, md int // mininum and manhattan distance + ) + for i, p := range ps { + switch { // calculate manhattan distance when x or y coordinate matches, otherwise skip + case p.x == x: + md = max(p.y, y) - min(p.y, y) + case p.y == y: + md = max(p.x, x) - min(p.x, x) + default: + continue + } + if idx < 0 || mn > md { // update 1st minimum manhattan distance or less than the current mininum + mn = md + idx = i + } + } + return idx +} + +func main() { + for _, data := range []struct { + x, y int + points points + output int + }{ + {3, 4, points{point{1, 2}, point{3, 1}, point{2, 4}, point{2, 3}}, 2}, + {2, 5, points{point{3, 4}, point{2, 3}, point{1, 5}, point{2, 5}}, 3}, + {1, 1, points{point{2, 2}, point{3, 3}, point{4, 4}}, -1}, + {0, 0, points{point{0, 1}, point{1, 0}, point{0, 2}, point{2, 0}}, 0}, + {5, 5, points{point{5, 6}, point{6, 5}, point{5, 4}, point{4, 5}}, 0}, + } { + io.WriteString(os.Stdout, cmp.Diff(data.points.mmd(data.x, data.y), data.output)) // blank if ok, otherwise show the difference + } +} -- cgit