aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-11-14 20:46:03 +0000
committerGitHub <noreply@github.com>2021-11-14 20:46:03 +0000
commit590f59c00b286bd755d9862071355c3acd8d68ec (patch)
tree82c97bfaa7ca0ccb6a7c77879f38a04814bffa7f
parentaba7146dd4fd0fe732848021cad6ed3f53af7528 (diff)
parentb55f4538dc0b52cf0a7ab01847c67f3e28d72edf (diff)
downloadperlweeklychallenge-club-590f59c00b286bd755d9862071355c3acd8d68ec.tar.gz
perlweeklychallenge-club-590f59c00b286bd755d9862071355c3acd8d68ec.tar.bz2
perlweeklychallenge-club-590f59c00b286bd755d9862071355c3acd8d68ec.zip
Merge pull request #5214 from arnesom/branch-for-challenge-138
Arne Sommer
-rw-r--r--challenge-138/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-138/arne-sommer/perl/ch-1.pl41
-rwxr-xr-xchallenge-138/arne-sommer/perl/workdays-perl41
-rwxr-xr-xchallenge-138/arne-sommer/raku/ch-1.raku35
-rwxr-xr-xchallenge-138/arne-sommer/raku/ch-2.raku60
-rwxr-xr-xchallenge-138/arne-sommer/raku/split-number60
-rwxr-xr-xchallenge-138/arne-sommer/raku/workdays35
7 files changed, 273 insertions, 0 deletions
diff --git a/challenge-138/arne-sommer/blog.txt b/challenge-138/arne-sommer/blog.txt
new file mode 100644
index 0000000000..1a30b85aed
--- /dev/null
+++ b/challenge-138/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/workdays-numbered.html
diff --git a/challenge-138/arne-sommer/perl/ch-1.pl b/challenge-138/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..9d910de218
--- /dev/null
+++ b/challenge-138/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,41 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use DateTime;
+
+my $year = shift(@ARGV) // "";
+
+die "Please specify a 4 digit year" unless $year =~ /^\d\d\d\d$/;
+
+my $dt = DateTime->new(year => $year, month => 1, day => 1);
+my $first_day = $dt->day_of_week;
+
+my @workdaysinyear =
+(
+ 0, # dummy # 52 * 7 = 364 | 52 * 5 = 260
+ 261, # Monday - Monday
+ 261, # Tuesday - Tuesday
+ 261, # Wednesday - wednesday
+ 261, # Thursday - Thursday
+ 261, # Friday - Friday
+ 260, # Saturday - Saturday
+ 259, # Sunday - Sunday
+);
+
+my @add_leap =
+(
+ 0, # Dummy
+ 1, # Mo -> Tu
+ 1, # Tu -> We
+ 1, # We -> Th
+ 1, # Th -> Fr
+ 0, # Fr -> Sa
+ 0, # Sa -> Su
+ 1, # Su -> Ma
+);
+
+my $count = $workdaysinyear[$first_day] + ($dt->is_leap_year ? $add_leap[$first_day] : 0);
+
+say $count;
diff --git a/challenge-138/arne-sommer/perl/workdays-perl b/challenge-138/arne-sommer/perl/workdays-perl
new file mode 100755
index 0000000000..9d910de218
--- /dev/null
+++ b/challenge-138/arne-sommer/perl/workdays-perl
@@ -0,0 +1,41 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use DateTime;
+
+my $year = shift(@ARGV) // "";
+
+die "Please specify a 4 digit year" unless $year =~ /^\d\d\d\d$/;
+
+my $dt = DateTime->new(year => $year, month => 1, day => 1);
+my $first_day = $dt->day_of_week;
+
+my @workdaysinyear =
+(
+ 0, # dummy # 52 * 7 = 364 | 52 * 5 = 260
+ 261, # Monday - Monday
+ 261, # Tuesday - Tuesday
+ 261, # Wednesday - wednesday
+ 261, # Thursday - Thursday
+ 261, # Friday - Friday
+ 260, # Saturday - Saturday
+ 259, # Sunday - Sunday
+);
+
+my @add_leap =
+(
+ 0, # Dummy
+ 1, # Mo -> Tu
+ 1, # Tu -> We
+ 1, # We -> Th
+ 1, # Th -> Fr
+ 0, # Fr -> Sa
+ 0, # Sa -> Su
+ 1, # Su -> Ma
+);
+
+my $count = $workdaysinyear[$first_day] + ($dt->is_leap_year ? $add_leap[$first_day] : 0);
+
+say $count;
diff --git a/challenge-138/arne-sommer/raku/ch-1.raku b/challenge-138/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..784378f49c
--- /dev/null
+++ b/challenge-138/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,35 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $year where $year.chars == 4);
+
+my $d = Date.new("$year-01-01");
+my $first-day = $d.day-of-week;
+
+my @workdaysinyear =
+(
+ 0, # dummy
+ 261, # Monday - Monday
+ 261, # Tuesday - Tuesday
+ 261, # Wednesday - wednesday
+ 261, # Thursday - Thursday
+ 261, # Friday - Friday
+ 260, # Saturday - Saturday
+ 259, # Sunday - Sunday
+);
+
+my @add-leap =
+(
+ 0, # Dummy
+ 1, # Mo -> Tu
+ 1, # Tu -> We
+ 1, # We -> Th
+ 1, # Th -> Fr
+ 0, # Fr -> Sa
+ 0, # Sa -> Su
+ 1, # Su -> Ma
+);
+
+my $count = @workdaysinyear[$first-day] + ($d.is-leap-year ?? @add-leap[$first-day] !! 0);
+
+say $count;
+
diff --git a/challenge-138/arne-sommer/raku/ch-2.raku b/challenge-138/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..ba5e149712
--- /dev/null
+++ b/challenge-138/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,60 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $psq where $psq.sqrt.Int == $psq.sqrt && $psq > 9, :v(:$verbose));
+
+my $sqrt = $psq.sqrt;
+my $size = $psq.chars;
+
+say ": Square root of $psq = $sqrt" if $verbose;
+
+my $found = False;
+
+my $splits := gather
+{
+ recurse( $psq, () );
+}
+
+for $splits -> $candidate
+{
+ my @list = @$candidate;
+
+ if @list.elems == 1
+ {
+ say ": Candidate list: { @list.join(", ") } (ignored size)" if $verbose;
+ next;
+ }
+
+ my $sum = @list.sum;
+
+ if $sqrt == $sum
+ {
+ say ": Candidate list: { @list.join(", ") } - with correct sum $sqrt" if $verbose;
+ say 1 unless $found;
+
+ $verbose
+ ?? ( $found = True )
+ !! exit;
+ }
+ else
+ {
+ say ": Candidate list: { @list.join(", ") } (wrong sum $sum vs expected $sqrt)" if $verbose;
+ }
+}
+
+say 0 unless $found;
+
+sub recurse ($remainder, @done)
+{
+ for 1 .. $remainder.chars -> $count
+ {
+ my $partial = $remainder.substr(0, $count);
+ my $new = $remainder.substr($count);
+ my @so-far = @done.clone;
+
+ @so-far.push: $partial;
+
+ $new eq ""
+ ?? take @so-far
+ !! recurse($new, @so-far);
+ }
+}
diff --git a/challenge-138/arne-sommer/raku/split-number b/challenge-138/arne-sommer/raku/split-number
new file mode 100755
index 0000000000..ba5e149712
--- /dev/null
+++ b/challenge-138/arne-sommer/raku/split-number
@@ -0,0 +1,60 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $psq where $psq.sqrt.Int == $psq.sqrt && $psq > 9, :v(:$verbose));
+
+my $sqrt = $psq.sqrt;
+my $size = $psq.chars;
+
+say ": Square root of $psq = $sqrt" if $verbose;
+
+my $found = False;
+
+my $splits := gather
+{
+ recurse( $psq, () );
+}
+
+for $splits -> $candidate
+{
+ my @list = @$candidate;
+
+ if @list.elems == 1
+ {
+ say ": Candidate list: { @list.join(", ") } (ignored size)" if $verbose;
+ next;
+ }
+
+ my $sum = @list.sum;
+
+ if $sqrt == $sum
+ {
+ say ": Candidate list: { @list.join(", ") } - with correct sum $sqrt" if $verbose;
+ say 1 unless $found;
+
+ $verbose
+ ?? ( $found = True )
+ !! exit;
+ }
+ else
+ {
+ say ": Candidate list: { @list.join(", ") } (wrong sum $sum vs expected $sqrt)" if $verbose;
+ }
+}
+
+say 0 unless $found;
+
+sub recurse ($remainder, @done)
+{
+ for 1 .. $remainder.chars -> $count
+ {
+ my $partial = $remainder.substr(0, $count);
+ my $new = $remainder.substr($count);
+ my @so-far = @done.clone;
+
+ @so-far.push: $partial;
+
+ $new eq ""
+ ?? take @so-far
+ !! recurse($new, @so-far);
+ }
+}
diff --git a/challenge-138/arne-sommer/raku/workdays b/challenge-138/arne-sommer/raku/workdays
new file mode 100755
index 0000000000..784378f49c
--- /dev/null
+++ b/challenge-138/arne-sommer/raku/workdays
@@ -0,0 +1,35 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $year where $year.chars == 4);
+
+my $d = Date.new("$year-01-01");
+my $first-day = $d.day-of-week;
+
+my @workdaysinyear =
+(
+ 0, # dummy
+ 261, # Monday - Monday
+ 261, # Tuesday - Tuesday
+ 261, # Wednesday - wednesday
+ 261, # Thursday - Thursday
+ 261, # Friday - Friday
+ 260, # Saturday - Saturday
+ 259, # Sunday - Sunday
+);
+
+my @add-leap =
+(
+ 0, # Dummy
+ 1, # Mo -> Tu
+ 1, # Tu -> We
+ 1, # We -> Th
+ 1, # Th -> Fr
+ 0, # Fr -> Sa
+ 0, # Sa -> Su
+ 1, # Su -> Ma
+);
+
+my $count = @workdaysinyear[$first-day] + ($d.is-leap-year ?? @add-leap[$first-day] !! 0);
+
+say $count;
+