diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-11-14 20:46:03 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-14 20:46:03 +0000 |
| commit | 590f59c00b286bd755d9862071355c3acd8d68ec (patch) | |
| tree | 82c97bfaa7ca0ccb6a7c77879f38a04814bffa7f | |
| parent | aba7146dd4fd0fe732848021cad6ed3f53af7528 (diff) | |
| parent | b55f4538dc0b52cf0a7ab01847c67f3e28d72edf (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-138/arne-sommer/perl/ch-1.pl | 41 | ||||
| -rwxr-xr-x | challenge-138/arne-sommer/perl/workdays-perl | 41 | ||||
| -rwxr-xr-x | challenge-138/arne-sommer/raku/ch-1.raku | 35 | ||||
| -rwxr-xr-x | challenge-138/arne-sommer/raku/ch-2.raku | 60 | ||||
| -rwxr-xr-x | challenge-138/arne-sommer/raku/split-number | 60 | ||||
| -rwxr-xr-x | challenge-138/arne-sommer/raku/workdays | 35 |
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; + |
