aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-07-30 06:51:10 +0100
committerGitHub <noreply@github.com>2023-07-30 06:51:10 +0100
commit993d9f9bf6f4494517de7d50fa42fd13e991c730 (patch)
tree74ed2bc2b220addc55be28fa2938be7be0df07b6
parent74e55ce09a04a365f11de29ff0e794fe47a49014 (diff)
parentb88973a6ce7ce579f64bb9bb2622060a6c460b05 (diff)
downloadperlweeklychallenge-club-993d9f9bf6f4494517de7d50fa42fd13e991c730.tar.gz
perlweeklychallenge-club-993d9f9bf6f4494517de7d50fa42fd13e991c730.tar.bz2
perlweeklychallenge-club-993d9f9bf6f4494517de7d50fa42fd13e991c730.zip
Merge pull request #8460 from simongreen-net/master
Simon's solution to challenge 227
-rw-r--r--challenge-227/sgreen/README.md4
-rw-r--r--challenge-227/sgreen/blog.txt1
-rwxr-xr-xchallenge-227/sgreen/perl/ch-1.pl21
-rwxr-xr-xchallenge-227/sgreen/perl/ch-2.pl83
-rwxr-xr-xchallenge-227/sgreen/python/ch-1.py17
-rwxr-xr-xchallenge-227/sgreen/python/ch-2.py69
6 files changed, 193 insertions, 2 deletions
diff --git a/challenge-227/sgreen/README.md b/challenge-227/sgreen/README.md
index 517b617a01..f9524c44af 100644
--- a/challenge-227/sgreen/README.md
+++ b/challenge-227/sgreen/README.md
@@ -1,3 +1,3 @@
-# The Weekly Challenge 226
+# The Weekly Challenge 227
-Blog: [Moving and Removing](https://dev.to/simongreennet/moving-and-removing-2c5j)
+Blog: [Weekly Challenge 227](https://dev.to/simongreennet/weekly-challenge-227-3loi)
diff --git a/challenge-227/sgreen/blog.txt b/challenge-227/sgreen/blog.txt
new file mode 100644
index 0000000000..f4af8c20d7
--- /dev/null
+++ b/challenge-227/sgreen/blog.txt
@@ -0,0 +1 @@
+https://dev.to/simongreennet/weekly-challenge-227-3loi \ No newline at end of file
diff --git a/challenge-227/sgreen/perl/ch-1.pl b/challenge-227/sgreen/perl/ch-1.pl
new file mode 100755
index 0000000000..2d5988a1a9
--- /dev/null
+++ b/challenge-227/sgreen/perl/ch-1.pl
@@ -0,0 +1,21 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use experimental 'signatures';
+
+use Date::Calc 'Day_of_Week';
+
+sub main ($year) {
+ my $fridays = 0;
+ foreach my $month ( 1 .. 12 ) {
+ if ( Day_of_Week( $year, $month, 13 ) == 5 ) {
+ $fridays++;
+ }
+ }
+
+ say $fridays;
+}
+
+main(@ARGV); \ No newline at end of file
diff --git a/challenge-227/sgreen/perl/ch-2.pl b/challenge-227/sgreen/perl/ch-2.pl
new file mode 100755
index 0000000000..48950aa855
--- /dev/null
+++ b/challenge-227/sgreen/perl/ch-2.pl
@@ -0,0 +1,83 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use experimental 'signatures';
+
+sub from_roman($roman) {
+ my @romans = split //, $roman;
+ my %mapping = ( I => 1, V => 5, X => 10, L => 50, C => 100, D => 500, M => 1000);
+ my @digits = map { $mapping{$_} } @romans;
+
+ my $number = 0;
+ while (my ($i, $v) = each @digits) {
+ if ($i < $#digits and $v < $digits[$i+1]) {
+ $number -= $v;
+ }
+ else {
+ $number += $v;
+ }}
+
+ return $number;}
+
+sub to_roman($number) {
+ if ($number == 0) {
+ return 'nulla';
+ }
+ elsif ($number > 3999 or $number < 0) {
+ return 'non potest';
+ }
+ elsif (index($number, '.') != -1) {
+ if ($number != int($number)) {
+ return 'non potest';
+ }
+ $number = int($number);
+ }
+
+ my @mapping = (
+ [ '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', ],
+ [ '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', ],
+ [ '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', ],
+ [ '', 'M', 'MM', 'MMM', ],
+ );
+
+ my $roman = '';
+ my @digits = reverse(split //, $number);
+
+ # Iterate in reverse
+ while (my ($i, $d) = each @digits) {
+ $roman = $mapping[$i][$d] . $roman;
+ }
+
+ return $roman;
+}
+
+sub main($roman1, $oper, $roman2) {
+ my $number1 = from_roman($roman1);
+ my $number2 = from_roman($roman2);
+ my $number = 0;
+
+ if ($oper eq '+') {
+ $number = $number1 + $number2;
+ }
+ elsif ($oper eq '-') {
+ $number = $number1 - $number2;
+ }
+ elsif ($oper eq '*' or $oper eq '×') {
+ $number = $number1 * $number2;
+ }
+ elsif ($oper eq '/' or $oper eq '÷') {
+ $number = $number1 / $number2;
+ }
+ elsif ($oper eq '**') {
+ $number = $number1 ** $number2;
+ }
+ else {
+ die "Unknown operator: '$oper'\n";
+ }
+
+ say to_roman($number);
+}
+
+main(@ARGV); \ No newline at end of file
diff --git a/challenge-227/sgreen/python/ch-1.py b/challenge-227/sgreen/python/ch-1.py
new file mode 100755
index 0000000000..33aefcf418
--- /dev/null
+++ b/challenge-227/sgreen/python/ch-1.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python3
+
+import sys
+from datetime import date
+
+
+def main(year):
+ fridays = 0
+ for month in range(1, 13):
+ if date(year, month, 13).isoweekday() == 5:
+ fridays += 1
+
+ print(fridays)
+
+
+if __name__ == '__main__':
+ main(int(sys.argv[1]))
diff --git a/challenge-227/sgreen/python/ch-2.py b/challenge-227/sgreen/python/ch-2.py
new file mode 100755
index 0000000000..30aa4b9995
--- /dev/null
+++ b/challenge-227/sgreen/python/ch-2.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+
+import sys
+
+
+def from_roman(roman):
+ mapping = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
+ digits = [mapping[s] for s in roman]
+
+ number = 0
+ for i, v in enumerate(digits):
+ if i < len(digits)-1 and v < digits[i+1]:
+ number -= v
+ else:
+ number += v
+
+ return number
+
+
+def to_roman(number):
+ if number == 0:
+ return 'nulla'
+ elif number > 3999 or number < 0:
+ return 'non potest'
+ elif type(number) == float:
+ if not number.is_integer():
+ return 'non potest'
+ number = int(number)
+
+ mapping = [
+ ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', ],
+ ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', ],
+ ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', ],
+ ['', 'M', 'MM', 'MMM', ],
+ ]
+
+ # Convert it into a string
+ roman = ''
+ number = str(number)
+
+ # Iterate in reverse
+ for i, d in enumerate(number[::-1]):
+ roman = mapping[i][int(d)] + roman
+
+ return roman
+
+
+def main(roman1, oper, roman2):
+ number1 = from_roman(roman1)
+ number2 = from_roman(roman2)
+
+ if oper == '+':
+ number = number1 + number2
+ elif oper == '-':
+ number = number1 - number2
+ elif oper == '*' or oper == '×':
+ number = number1 * number2
+ elif oper == '/' or oper == '÷':
+ number = number1 / number2
+ elif oper == '**':
+ number = number1 ** number2
+ else:
+ raise ValueError(f"Unknown operator: '{oper}'")
+
+ print(to_roman(number))
+
+
+if __name__ == '__main__':
+ main(*sys.argv[1:])