diff options
| author | 冯昶 <fengchang@novel-supertv.com> | 2022-10-24 17:44:04 +0800 |
|---|---|---|
| committer | 冯昶 <fengchang@novel-supertv.com> | 2022-10-24 17:44:04 +0800 |
| commit | 7783ecb7dad2ae5ea3d3022a13e3901c196c4154 (patch) | |
| tree | fa408d0b19c541602d81799c8a13eea61df2cb8f /challenge-187/mohammad-anwar | |
| parent | a406c6935f88c7afa04a707a2611ebe4fe4eadae (diff) | |
| parent | bb06570f6b1634ca14bfd08927f3bfc6c052c494 (diff) | |
| download | perlweeklychallenge-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.java | 87 | ||||
| -rw-r--r-- | challenge-187/mohammad-anwar/perl/ch-1.pl | 73 | ||||
| -rw-r--r-- | challenge-187/mohammad-anwar/perl/ch-2.pl | 61 | ||||
| -rw-r--r-- | challenge-187/mohammad-anwar/python/ch-1.py | 65 | ||||
| -rw-r--r-- | challenge-187/mohammad-anwar/python/ch-2.py | 61 | ||||
| -rw-r--r-- | challenge-187/mohammad-anwar/raku/ch-1.raku | 71 | ||||
| -rw-r--r-- | challenge-187/mohammad-anwar/raku/ch-2.raku | 60 |
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 }; +} |
