aboutsummaryrefslogtreecommitdiff
path: root/challenge-187/mohammad-anwar
diff options
context:
space:
mode:
author冯昶 <fengchang@novel-supertv.com>2022-10-24 17:44:04 +0800
committer冯昶 <fengchang@novel-supertv.com>2022-10-24 17:44:04 +0800
commit7783ecb7dad2ae5ea3d3022a13e3901c196c4154 (patch)
treefa408d0b19c541602d81799c8a13eea61df2cb8f /challenge-187/mohammad-anwar
parenta406c6935f88c7afa04a707a2611ebe4fe4eadae (diff)
parentbb06570f6b1634ca14bfd08927f3bfc6c052c494 (diff)
downloadperlweeklychallenge-club-7783ecb7dad2ae5ea3d3022a13e3901c196c4154.tar.gz
perlweeklychallenge-club-7783ecb7dad2ae5ea3d3022a13e3901c196c4154.tar.bz2
perlweeklychallenge-club-7783ecb7dad2ae5ea3d3022a13e3901c196c4154.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'challenge-187/mohammad-anwar')
-rw-r--r--challenge-187/mohammad-anwar/java/theweeklychallenge/DaysTogether.java87
-rw-r--r--challenge-187/mohammad-anwar/perl/ch-1.pl73
-rw-r--r--challenge-187/mohammad-anwar/perl/ch-2.pl61
-rw-r--r--challenge-187/mohammad-anwar/python/ch-1.py65
-rw-r--r--challenge-187/mohammad-anwar/python/ch-2.py61
-rw-r--r--challenge-187/mohammad-anwar/raku/ch-1.raku71
-rw-r--r--challenge-187/mohammad-anwar/raku/ch-2.raku60
7 files changed, 478 insertions, 0 deletions
diff --git a/challenge-187/mohammad-anwar/java/theweeklychallenge/DaysTogether.java b/challenge-187/mohammad-anwar/java/theweeklychallenge/DaysTogether.java
new file mode 100644
index 0000000000..0c0d0869fb
--- /dev/null
+++ b/challenge-187/mohammad-anwar/java/theweeklychallenge/DaysTogether.java
@@ -0,0 +1,87 @@
+package theweeklychallenge;
+
+/*
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #1: Days Together
+
+ Two friends, Foo and Bar gone on holidays seperately to the same
+ city. You are given their schedule i.e. start date and end date.
+
+ To keep the task simple, the date is in the form 'DD-MM' and all
+ dates belong to the same calendar year i.e. between '01-01' and
+ '31-12'.
+
+ Also the year is non-leap year and both dates are inclusive.
+
+Compile and Run:
+
+ mohammad-anwar/java$ javac theweeklychallenge/DaysTogether.java
+ mohammad-anwar/java$ java theweeklychallenge.DaysTogether
+
+*/
+
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+import junit.framework.TestCase;
+import static junit.framework.Assert.*;
+
+public class DaysTogether extends TestCase {
+
+ public static void main(String[] args) {
+ junit.textui.TestRunner.run(
+ theweeklychallenge.DaysTogether.class
+ );
+ }
+
+ public void testDaysTogether() {
+ assertEquals(4, daysTogether("12-01","20-01","15-01","18-01"));
+ assertEquals(0, daysTogether("02-03","12-03","13-03","14-03"));
+ assertEquals(2, daysTogether("02-03","12-03","11-03","15-03"));
+ assertEquals(4, daysTogether("30-03","05-04","28-03","02-04"));
+ }
+
+ public static int daysTogether(
+ String sd1, String ed1, String sd2, String ed2) {
+ LocalDate _sd1 = _date(sd1);
+ LocalDate _ed1 = _date(ed1);
+ LocalDate _sd2 = _date(sd2);
+ LocalDate _ed2 = _date(ed2);
+
+ int days = 0;
+
+ if (_ed1.compareTo(_sd2) < 0) {
+ return days;
+ }
+
+ if (_sd1.compareTo(_sd2) > 0) {
+ days = _daysTogether(_sd1, _ed1, _ed2);
+ }
+ else if (_ed2.compareTo(_sd2) > 0) {
+ days = _daysTogether(_sd2, _ed1, _ed2);
+ }
+
+ return days;
+ }
+
+ public static LocalDate _date(String dateStr) {
+ String[] splitDate = dateStr.split("-");
+ int day = Integer.parseInt(splitDate[0]);
+ int month = Integer.parseInt(splitDate[1]);
+
+ return LocalDate.of(2022, month, day);
+ }
+
+ public static int _daysTogether(
+ LocalDate from, LocalDate to, LocalDate _to) {
+ if (to.compareTo(_to) > 0) {
+ to = _to;
+ }
+
+ long days = ChronoUnit.DAYS.between(from, to);
+ return (int)days + 1;
+ }
+}
diff --git a/challenge-187/mohammad-anwar/perl/ch-1.pl b/challenge-187/mohammad-anwar/perl/ch-1.pl
new file mode 100644
index 0000000000..f98fed46fc
--- /dev/null
+++ b/challenge-187/mohammad-anwar/perl/ch-1.pl
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+
+=head1
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #1: Days Together
+
+ Two friends, Foo and Bar gone on holidays seperately to the same
+ city. You are given their schedule i.e. start date and end date.
+
+ To keep the task simple, the date is in the form 'DD-MM' and all
+ dates belong to the same calendar year i.e. between '01-01' and
+ '31-12'.
+
+ Also the year is non-leap year and both dates are inclusive.
+
+=cut
+
+use v5.36;
+use DateTime;
+use Test2::V0;
+
+is days_together('12-01','20-01','15-01','18-01'), 4, 'Example 1';
+is days_together('02-03','12-03','13-03','14-03'), 0, 'Example 2';
+is days_together('02-03','12-03','11-03','15-03'), 2, 'Example 3';
+is days_together('30-03','05-04','28-03','02-04'), 4, 'Example 4';
+
+done_testing;
+
+#
+#
+# METHODS
+
+sub days_together($sd_1, $ed_1, $sd_2, $ed_2) {
+ $sd_1 = _date($sd_1);
+ $ed_1 = _date($ed_1);
+ $sd_2 = _date($sd_2);
+ $ed_2 = _date($ed_2);
+
+ my $days = 0;
+
+ return $days if ($ed_1 < $sd_2);
+
+ if ($sd_2 <= $sd_1) {
+ $days = _days_together($sd_1, $ed_1, $ed_2);
+ }
+ elsif ($sd_2 <= $ed_2) {
+ $days = _days_together($sd_2, $ed_1, $ed_2);
+ }
+
+ return $days;
+}
+
+sub _date($date) {
+ my ($day, $month) = split(/\-/, $date, 2);
+ return DateTime->new(
+ year => 2022,
+ month => $month,
+ day => $day)->truncate(to => 'day');
+}
+
+sub _days_together($from, $to, $_to) {
+ my $days = 1; # inclusive day
+ $to = ($to > $_to)?($_to):($to);
+ while ($from < $to) {
+ $from = $from->add(days => 1);
+ $days++;
+ }
+ return $days;
+}
diff --git a/challenge-187/mohammad-anwar/perl/ch-2.pl b/challenge-187/mohammad-anwar/perl/ch-2.pl
new file mode 100644
index 0000000000..be4269c0c7
--- /dev/null
+++ b/challenge-187/mohammad-anwar/perl/ch-2.pl
@@ -0,0 +1,61 @@
+#!/usr/bin/perl
+
+=head1
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #2: Magical Triplets
+
+ You are given a list of positive numbers, @n, having at least
+ 3 numbers.
+
+ Write a script to find the triplets (a, b, c) from the given list
+ that satisfies the following rules.
+
+ 1. a + b > c
+ 2. b + c > a
+ 3. a + c > b
+ 4. a + b + c is maximum.
+
+ In case, you end up with more than one triplets having the maximum
+ then pick the triplet where a >= b >= c.
+
+=cut
+
+use v5.36;
+use Test2::V0;
+use Algorithm::Combinatorics qw(variations);
+
+is magical_triplets(1, 2, 3, 2), [3, 2, 2], 'Example 1';
+is magical_triplets(1, 3, 2), [], 'Example 2';
+is magical_triplets(1, 1, 2, 3), [], 'Example 3';
+is magical_triplets(2, 4, 3), [4, 3, 2], 'Example 4';
+
+done_testing;
+
+#
+#
+# METHOD
+
+sub magical_triplets(@list) {
+ my $triplets = variations([ sort { $b <=> $a } @list ], 3);
+ my %entries = ();
+ foreach my $triplet ($triplets->next) {
+ my ($x, $y, $z) = @$triplet;
+ if (($x + $y > $z) &&
+ ($y + $z > $x) &&
+ ($x + $z > $y)) {
+ $entries{join(":", $x, $y, $z)} = $x + $y + $z;
+ }
+ }
+
+ return [] unless (keys %entries);
+
+ my $magical = [
+ sort { $entries{$b} <=> $entries{$b} } keys %entries
+ ];
+
+ return [ split /\:/, $magical->[0] ];
+}
diff --git a/challenge-187/mohammad-anwar/python/ch-1.py b/challenge-187/mohammad-anwar/python/ch-1.py
new file mode 100644
index 0000000000..7af49bbaad
--- /dev/null
+++ b/challenge-187/mohammad-anwar/python/ch-1.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python3
+
+'''
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #1: Days Together
+
+ Two friends, Foo and Bar gone on holidays seperately to the same
+ city. You are given their schedule i.e. start date and end date.
+
+ To keep the task simple, the date is in the form 'DD-MM' and all
+ dates belong to the same calendar year i.e. between '01-01' and
+ '31-12'.
+
+ Also the year is non-leap year and both dates are inclusive.
+
+'''
+
+import unittest
+from datetime import date, timedelta
+
+def _date(dateStr) -> date:
+ (day, month) = dateStr.split("-")
+ return date(2022, int(month), int(day))
+
+def _days_together(fromDate, toDate, _toDate) -> int:
+ if toDate > _toDate:
+ toDate = _toDate
+
+ delta = toDate - fromDate
+ return delta.days + 1
+
+def daysTogether(sd1, ed1, sd2, ed2) -> int:
+ _sd1 = _date(sd1)
+ _ed1 = _date(ed1)
+ _sd2 = _date(sd2)
+ _ed2 = _date(ed2)
+
+ days = 0
+
+ if _ed1 < _sd2:
+ return days
+
+ if _sd2 <= _sd1:
+ days = _days_together(_sd1, _ed1, _ed2)
+ elif _sd2 <= _ed2:
+ days = _days_together(_sd2, _ed1, _ed2)
+
+ return days
+
+#
+#
+# Unit test class
+
+class TestDaysTogether(unittest.TestCase):
+ def test_daysTogether(self):
+ self.assertEqual(daysTogether('12-01','20-01','15-01','18-01'), 4)
+ self.assertEqual(daysTogether('02-03','12-03','13-03','14-03'), 0)
+ self.assertEqual(daysTogether('02-03','12-03','11-03','15-03'), 2)
+ self.assertEqual(daysTogether('30-03','05-04','28-03','02-04'), 4)
+
+unittest.main()
diff --git a/challenge-187/mohammad-anwar/python/ch-2.py b/challenge-187/mohammad-anwar/python/ch-2.py
new file mode 100644
index 0000000000..7aefb10fe3
--- /dev/null
+++ b/challenge-187/mohammad-anwar/python/ch-2.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python3
+
+'''
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #2: Magical Triplets
+
+ You are given a list of positive numbers, @n, having at least
+ 3 numbers.
+
+ Write a script to find the triplets (a, b, c) from the given list
+ that satisfies the following rules.
+
+ 1. a + b > c
+ 2. b + c > a
+ 3. a + c > b
+ 4. a + b + c is maximum.
+
+ In case, you end up with more than one triplets having the maximum
+ then pick the triplet where a >= b >= c.
+
+'''
+
+import unittest
+import itertools
+
+def magicalTriplets(array):
+ array.sort()
+ magical = {}
+ for triplet in itertools.permutations(array, 3):
+ triplet_list = list(triplet)
+ triplet_list.sort(reverse=True)
+ a = triplet_list[0]
+ b = triplet_list[1]
+ c = triplet_list[2]
+ if (a + b > c) and (b + c > a) and (a + c > b):
+ key = ':'.join([str(i) for i in triplet_list])
+ val = sum(triplet_list)
+ magical[key] = val
+
+ if len(magical) == 0:
+ return []
+
+ magical_triplet = sorted(magical, key=magical.get, reverse=True)[0]
+ return [int(i) for i in magical_triplet.split(":")]
+
+#
+#
+# Unit test class
+
+class TestMagicalTriplets(unittest.TestCase):
+ def test_MagicalTriplets(self):
+ self.assertEqual(magicalTriplets([1, 2, 3, 2]), [3, 2, 2], 'Example 1')
+ self.assertEqual(magicalTriplets([1, 3, 2]), [], 'Example 2')
+ self.assertEqual(magicalTriplets([1, 1, 2, 3]), [], 'Example 3')
+ self.assertEqual(magicalTriplets([2, 4, 3]), [4, 3, 2], 'Example 4')
+
+unittest.main()
diff --git a/challenge-187/mohammad-anwar/raku/ch-1.raku b/challenge-187/mohammad-anwar/raku/ch-1.raku
new file mode 100644
index 0000000000..4bbeabd5e7
--- /dev/null
+++ b/challenge-187/mohammad-anwar/raku/ch-1.raku
@@ -0,0 +1,71 @@
+#!/usr/bin/env raku
+
+=begin pod
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #1: Days Together
+
+ Two friends, Foo and Bar gone on holidays seperately to the same
+ city. You are given their schedule i.e. start date and end date.
+
+ To keep the task simple, the date is in the form 'DD-MM' and all
+ dates belong to the same calendar year i.e. between '01-01' and
+ '31-12'.
+
+ Also the year is non-leap year and both dates are inclusive.
+
+=end pod
+
+use Test;
+
+is days-together('12-01','20-01','15-01','18-01'), 4, 'Example 1';
+is days-together('02-03','12-03','13-03','14-03'), 0, 'Example 2';
+is days-together('02-03','12-03','11-03','15-03'), 2, 'Example 3';
+is days-together('30-03','05-04','28-03','02-04'), 4, 'Example 4';
+
+done-testing;
+
+#
+#
+# METHODS
+
+sub days-together(Str $sd1, Str $ed1, Str $sd2, Str $ed2 --> Int) {
+ my Date $_sd1 = _date($sd1);
+ my Date $_ed1 = _date($ed1);
+ my Date $_sd2 = _date($sd2);
+ my Date $_ed2 = _date($ed2);
+
+ my Int $days = 0;
+
+ return $days if $_ed1 < $_sd2;
+
+ if $_ed1 <= $_sd2 {
+ $days = _days_together($_ed1, $_ed2);
+ }
+ elsif $_sd2 <= $_sd1 {
+ $days = _days_together($_sd1, $_ed1, $_ed2);
+ }
+ elsif $_sd2 <= $_ed2 {
+ $days = _days_together($_sd2, $_ed1, $_ed2);
+ }
+
+ return $days;
+}
+
+sub _date(Str $date --> Date) {
+ my ($day, $month) = $date.split("-");
+ return Date.new(
+ year => 2022,
+ month => $month,
+ day => $day
+ );
+}
+
+sub _days_together(Date $from, Date $to, Date $_to? --> Int) {
+ my Date $end_date = $to;
+ $end_date = $_to if (defined $_to) && ($to > $_to);
+ return $end_date - $from + 1;
+}
diff --git a/challenge-187/mohammad-anwar/raku/ch-2.raku b/challenge-187/mohammad-anwar/raku/ch-2.raku
new file mode 100644
index 0000000000..03d3369afb
--- /dev/null
+++ b/challenge-187/mohammad-anwar/raku/ch-2.raku
@@ -0,0 +1,60 @@
+#!/usr/bin/env raku
+
+=begin pod
+
+Week 187:
+
+ https://theweeklychallenge.org/blog/perl-weekly-challenge-187
+
+Task #2: Magical Triplets
+
+ You are given a list of positive numbers, @n, having at least
+ 3 numbers.
+
+ Write a script to find the triplets (a, b, c) from the given list
+ that satisfies the following rules.
+
+ 1. a + b > c
+ 2. b + c > a
+ 3. a + c > b
+ 4. a + b + c is maximum.
+
+ In case, you end up with more than one triplets having the maximum
+ then pick the triplet where a >= b >= c.
+
+=end pod
+
+use Test;
+
+magical-triplets(<1 2 3 2>);
+
+is magical-triplets(<1 2 3 2>), (3, 2, 2), 'Example 1';
+is magical-triplets(<1 3 2>), (), 'Example 2';
+is magical-triplets(<1 1 2 3>), (), 'Example 3';
+is magical-triplets(<2 4 3>), (4, 3, 2), 'Example 4';
+
+done-testing;
+
+#
+#
+# METHOD
+
+sub magical-triplets(@list) {
+ my %entries = ();
+ for @list.sort.combinations(3) -> ($x, $y, $z) {
+ if $x + $y > $z &&
+ $y + $z > $x &&
+ $x + $z > $y {
+ %entries{"$x:$y:$z"} = $x + $y + $z;
+ }
+ }
+
+ return () if %entries.keys.elems == 0;
+
+ return %entries
+ .sort(*.values)
+ .tail
+ .key
+ .split(":")
+ .sort: { $^b leg $^a };
+}