From 1281dc37c7bcc08ec45e7c4cfa0a6b3ce99bbd12 Mon Sep 17 00:00:00 2001 From: Luis Mochan Date: Mon, 21 Feb 2022 12:16:33 -0600 Subject: Solve PWC153 --- challenge-153/wlmb/blog.txt | 1 + challenge-153/wlmb/perl/ch-1.pl | 27 +++++++++++++++++++++++++++ challenge-153/wlmb/perl/ch-2.pl | 26 ++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 challenge-153/wlmb/blog.txt create mode 100755 challenge-153/wlmb/perl/ch-1.pl create mode 100755 challenge-153/wlmb/perl/ch-2.pl diff --git a/challenge-153/wlmb/blog.txt b/challenge-153/wlmb/blog.txt new file mode 100644 index 0000000000..fb64d00613 --- /dev/null +++ b/challenge-153/wlmb/blog.txt @@ -0,0 +1 @@ +https://wlmb.github.io/2022/02/21/PWC153/ diff --git a/challenge-153/wlmb/perl/ch-1.pl b/challenge-153/wlmb/perl/ch-1.pl new file mode 100755 index 0000000000..1ad188fbed --- /dev/null +++ b/challenge-153/wlmb/perl/ch-1.pl @@ -0,0 +1,27 @@ +#!/usr/bin/env perl +# Perl weekly challenge 153 +# Task 1: Left factorials +# +# See https://wlmb.github.io/2022/02/21/PWC153/#task-1-left-factorials +use v5.12; +use warnings; +use Memoize; +use bigint; +use Text::Wrap qw(wrap $columns $break); + +memoize qw(left_factorial factorial); +die "Usage: ./ch-1.pl N\nto get the first N left factorials" unless @ARGV; +my $N=shift; +$columns=62; $break=qr/\s/; +say wrap("", " ", "The first $N left factorials are: ", + join ", ", map {left_factorial($_)} (0..$N-1)); +sub left_factorial{ + my $n=shift; + return factorial(0) if $n<=0; + return factorial($n)+left_factorial($n-1); +} +sub factorial{ + my $k=shift; + return 1 if $k<=0; + return $k*factorial($k-1); +} diff --git a/challenge-153/wlmb/perl/ch-2.pl b/challenge-153/wlmb/perl/ch-2.pl new file mode 100755 index 0000000000..3112cd7a7c --- /dev/null +++ b/challenge-153/wlmb/perl/ch-2.pl @@ -0,0 +1,26 @@ +#!/usr/bin/env perl +# Perl weekly challenge 153 +# Task 2: Factorions +# +# See https://wlmb.github.io/2022/02/21/PWC153/#task-2-factorions +use v5.12; +use warnings; +use Memoize; +use List::Util qw(sum0); +memoize qw(factorial); +die "Usage: ./ch-2.pl N1 N2...\nto test if Ni is factorion" unless @ARGV; +foreach(@ARGV){ + say("Expected a non-negative integer: $_"), next unless $_>=0; + my @digits=split ''; + my @factorials=map {factorial($_)} @digits; + my $sum=sum0(@factorials); + my $factorion=$sum==$_; + say "$_ is", $factorion?"":" not", " factorion as ", + join("! + ", @digits), "! = ", join(" + ",@factorials), + " = $sum ", $factorion?"== ":"!= ", $_; +} +sub factorial { + my $n=shift; + return 1 if $n<=0; + return $n*factorial($n-1); +} -- cgit