diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2025-08-12 13:22:30 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-12 13:22:30 +0100 |
| commit | ac1c62639862fb7df5bdaa80d6356bdf4136c01b (patch) | |
| tree | a68d5ee0a74d1a0a6942dc57f744097febb87053 | |
| parent | 8fa79c8f9bdb1cc2ffef28f822d13d486ba126c5 (diff) | |
| parent | a0de8e40d8f73d1b5a2b4e778f00bee801d419a2 (diff) | |
| download | perlweeklychallenge-club-ac1c62639862fb7df5bdaa80d6356bdf4136c01b.tar.gz perlweeklychallenge-club-ac1c62639862fb7df5bdaa80d6356bdf4136c01b.tar.bz2 perlweeklychallenge-club-ac1c62639862fb7df5bdaa80d6356bdf4136c01b.zip | |
Merge pull request #12502 from pokgopun/pwc334
Pwc334
| -rw-r--r-- | challenge-334/pokgopun/go/ch-1.go | 90 | ||||
| -rw-r--r-- | challenge-334/pokgopun/go/ch-2.go | 146 | ||||
| -rw-r--r-- | challenge-334/pokgopun/python/ch-1.py | 74 | ||||
| -rw-r--r-- | challenge-334/pokgopun/python/ch-2.py | 121 |
4 files changed, 431 insertions, 0 deletions
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 + } +} diff --git a/challenge-334/pokgopun/python/ch-1.py b/challenge-334/pokgopun/python/ch-1.py new file mode 100644 index 0000000000..7e5de27b4e --- /dev/null +++ b/challenge-334/pokgopun/python/ch-1.py @@ -0,0 +1,74 @@ +### 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 + +def rs(ints: tuple[int], x: int, y: int) -> int: + return sum(ints[x:y+1]) + +import unittest + +class TestRs(unittest.TestCase): + def test(self): + for (ints,x,y),otpt in { + ((-2, 0, 3, -5, 2, -1), 0, 2): 1, + ((1, -2, 3, -4, 5), 1, 3): -3, + ((1, 0, 2, -1, 3), 3, 4): 2, + ((-5, 4, -3, 2, -1, 0), 0, 3): -2, + ((-1, 0, 2, -3, -2, 1), 0, 2): 1, + }.items(): + self.assertEqual(rs(ints,x,y), otpt) + +unittest.main() diff --git a/challenge-334/pokgopun/python/ch-2.py b/challenge-334/pokgopun/python/ch-2.py new file mode 100644 index 0000000000..1c53d96513 --- /dev/null +++ b/challenge-334/pokgopun/python/ch-2.py @@ -0,0 +1,121 @@ +### 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 + +from dataclasses import dataclass + +@dataclass +class Point: + x: int + y: int + +def mmd(x: int, y: int, ps: tuple[Point]) -> int: + return list( + [e[1] for e in sorted( + (abs(ps[i]. x-x) + abs(ps[i]. y-y), i) for i in range(len(ps)) if ps[i].x==x or ps[i].y==y + ) + ] + [-1] + )[0] + +import unittest + +class TestMmd(unittest.TestCase): + def test(self): + for (x, y, ps), otpt in { + (3, 4, ((1, 2), (3, 1), (2, 4), (2, 3))): 2, + (2, 5, ((3, 4), (2, 3), (1, 5), (2, 5))): 3, + (1, 1, ((2, 2), (3, 3), (4, 4))): -1, + (0, 0, ((0, 1), (1, 0), (0, 2), (2, 0))): 0, + }.items(): + self.assertEqual(mmd(x, y, tuple(Point(e[0],e[1]) for e in ps)), otpt) + +unittest.main() |
