aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2025-08-12 13:22:30 +0100
committerGitHub <noreply@github.com>2025-08-12 13:22:30 +0100
commitac1c62639862fb7df5bdaa80d6356bdf4136c01b (patch)
treea68d5ee0a74d1a0a6942dc57f744097febb87053
parent8fa79c8f9bdb1cc2ffef28f822d13d486ba126c5 (diff)
parenta0de8e40d8f73d1b5a2b4e778f00bee801d419a2 (diff)
downloadperlweeklychallenge-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.go90
-rw-r--r--challenge-334/pokgopun/go/ch-2.go146
-rw-r--r--challenge-334/pokgopun/python/ch-1.py74
-rw-r--r--challenge-334/pokgopun/python/ch-2.py121
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()