aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-04-08 07:06:09 +0100
committerGitHub <noreply@github.com>2021-04-08 07:06:09 +0100
commit7c226dce55a9a7c5cf1d23d097ae4b1754dbbc81 (patch)
tree4fc9edd3ac57fc0a13ecc6693d993288a74c1832
parent9af63cd6470207de9cb52dfea010f8ba898fa77d (diff)
parent2713bc08057ac11c4d57e1056daad818843e4bea (diff)
downloadperlweeklychallenge-club-7c226dce55a9a7c5cf1d23d097ae4b1754dbbc81.tar.gz
perlweeklychallenge-club-7c226dce55a9a7c5cf1d23d097ae4b1754dbbc81.tar.bz2
perlweeklychallenge-club-7c226dce55a9a7c5cf1d23d097ae4b1754dbbc81.zip
Merge pull request #3848 from polettix/polettix/pwc107
Add polettix's solution to challenge-107
-rw-r--r--challenge-107/polettix/blog.txt1
-rw-r--r--challenge-107/polettix/blog1.txt1
-rw-r--r--challenge-107/polettix/perl/Calc.pm13
-rw-r--r--challenge-107/polettix/perl/ch-1.pl50
-rw-r--r--challenge-107/polettix/perl/ch-2.pl17
5 files changed, 82 insertions, 0 deletions
diff --git a/challenge-107/polettix/blog.txt b/challenge-107/polettix/blog.txt
new file mode 100644
index 0000000000..7f3416455c
--- /dev/null
+++ b/challenge-107/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/04/07/pwc107-self-descriptive-numbers/
diff --git a/challenge-107/polettix/blog1.txt b/challenge-107/polettix/blog1.txt
new file mode 100644
index 0000000000..01d71ba1dc
--- /dev/null
+++ b/challenge-107/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/04/08/pwc107-list-methods/
diff --git a/challenge-107/polettix/perl/Calc.pm b/challenge-107/polettix/perl/Calc.pm
new file mode 100644
index 0000000000..c7786e745e
--- /dev/null
+++ b/challenge-107/polettix/perl/Calc.pm
@@ -0,0 +1,13 @@
+package Calc;
+
+use strict;
+use warnings;
+
+our $intruder;
+
+sub new { bless {}, shift; }
+sub add { }
+sub mul { }
+sub div { }
+
+1;
diff --git a/challenge-107/polettix/perl/ch-1.pl b/challenge-107/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..f6d9562165
--- /dev/null
+++ b/challenge-107/polettix/perl/ch-1.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+use List::Util 'sum';
+
+sub nested_loops_iterator {
+ my ($dims, $opts, $cb, $accumulator) = @_;
+ return unless scalar @{$dims};
+ ($opts, $cb) = ($cb, $opts) if ref($opts) eq 'CODE';
+ my @indexes = (-1);
+ my @accumulator = (undef) x scalar @{$dims};
+ return sub {
+ while ((my $level = $#indexes) >= 0) {
+ my $dimension = $dims->[$level];
+ my $i = ++$indexes[$level];
+ if ($i > $#{$dimension}) { pop @indexes }
+ else {
+ $accumulator[$level] = $dimension->[$i];
+ if ($level == $#{$dims}) { return @accumulator }
+ else { push @indexes, -1 }
+ }
+ }
+ return;
+ }
+}
+
+sub is_self_descriptive (@sequence) {
+ for my $i (0 .. $#sequence) {
+ my $count = sum map { $_ == $i ? 1 : 0 } @sequence;
+ return unless $count == $sequence[$i];
+ }
+ return 1;
+}
+
+sub three_self_descriptive_numbers {
+ my ($b, @found) = (1);
+ while ('necessary') {
+ my $it = nested_loops_iterator([map { [0 .. ($b - 1)]} 1 .. $b]);
+ while (my @args = $it->()) {
+ push @found, join '', @args if is_self_descriptive(@args);
+ return @found if @found == 3;
+ }
+ ++$b;
+ }
+ return @found[0..2];
+}
+
+say join(', ', three_self_descriptive_numbers());
diff --git a/challenge-107/polettix/perl/ch-2.pl b/challenge-107/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..d0cce77510
--- /dev/null
+++ b/challenge-107/polettix/perl/ch-2.pl
@@ -0,0 +1,17 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+
+sub list_methods ($module) {
+ no strict 'refs';
+ return grep { defined &{$module . '::' . $_} } keys %{$module . '::'};
+}
+
+sub load ($module) { require("$module.pm" =~ s{::}{/}grmxs); $module }
+
+use FindBin '$Bin';
+use lib $Bin;;
+my $module = shift // 'Calc';
+say for list_methods(load($module));