diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2023-07-30 06:51:10 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-30 06:51:10 +0100 |
| commit | 993d9f9bf6f4494517de7d50fa42fd13e991c730 (patch) | |
| tree | 74ed2bc2b220addc55be28fa2938be7be0df07b6 | |
| parent | 74e55ce09a04a365f11de29ff0e794fe47a49014 (diff) | |
| parent | b88973a6ce7ce579f64bb9bb2622060a6c460b05 (diff) | |
| download | perlweeklychallenge-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.md | 4 | ||||
| -rw-r--r-- | challenge-227/sgreen/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-227/sgreen/perl/ch-1.pl | 21 | ||||
| -rwxr-xr-x | challenge-227/sgreen/perl/ch-2.pl | 83 | ||||
| -rwxr-xr-x | challenge-227/sgreen/python/ch-1.py | 17 | ||||
| -rwxr-xr-x | challenge-227/sgreen/python/ch-2.py | 69 |
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:]) |
