aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCY Fung <fungcheokyin@gmail.com>2022-07-21 05:21:21 +0800
committerCY Fung <fungcheokyin@gmail.com>2022-07-21 05:21:21 +0800
commit57bfe0772b99880652ca06b9914ad55fee405749 (patch)
tree6cc2cf7317d597ede3f128351e35191e292ec9ff
parentf448cdd65285d9ae08a2abdb58a87c80e7c1e0b5 (diff)
downloadperlweeklychallenge-club-57bfe0772b99880652ca06b9914ad55fee405749.tar.gz
perlweeklychallenge-club-57bfe0772b99880652ca06b9914ad55fee405749.tar.bz2
perlweeklychallenge-club-57bfe0772b99880652ca06b9914ad55fee405749.zip
Task 1 NodeJS soln, Task 1 & 2 Perl soln
-rw-r--r--challenge-174/cheok-yin-fung/node/ch-1.js29
-rw-r--r--challenge-174/cheok-yin-fung/perl/ch-1.pl31
-rw-r--r--challenge-174/cheok-yin-fung/perl/ch-2.pl62
3 files changed, 122 insertions, 0 deletions
diff --git a/challenge-174/cheok-yin-fung/node/ch-1.js b/challenge-174/cheok-yin-fung/node/ch-1.js
new file mode 100644
index 0000000000..9259b4f334
--- /dev/null
+++ b/challenge-174/cheok-yin-fung/node/ch-1.js
@@ -0,0 +1,29 @@
+// The Weekly Challenge 174
+// Task 1 Disarium Numbers
+// Node.js Solution
+
+let disar = 0;
+for (let n=0; n < 9999999; n++) {
+ let total = 0;
+ for([i, v] of n.toString().split("").entries()) {
+ total += v**(i+1);
+ }
+ if (total === n) {
+ console.log(n);
+ disar++;
+ }
+ if (disar===19) {break;}
+}
+
+
+/* 0 to 9
+89
+135
+175
+518
+598
+1306
+1676
+2427
+2646798
+*/
diff --git a/challenge-174/cheok-yin-fung/perl/ch-1.pl b/challenge-174/cheok-yin-fung/perl/ch-1.pl
new file mode 100644
index 0000000000..9ac06ce057
--- /dev/null
+++ b/challenge-174/cheok-yin-fung/perl/ch-1.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/perl
+# The Weekly Challenge 174
+# Task 1 Disarium Numbers
+use v5.30.0;
+use warnings;
+
+my $d = 0;
+my $n = 0;
+while ($d < 19) {
+ my @arr = split "", $n;
+ my $total = 0;
+ $total += $arr[$_]**($_+1) for 0..$#arr;
+ if ($total == $n) {
+ say $n;
+ $d++;
+ }
+ $n++;
+}
+
+=pod
+0 to 9
+89
+135
+175
+518
+598
+1306
+1676
+2427
+2646798
+
diff --git a/challenge-174/cheok-yin-fung/perl/ch-2.pl b/challenge-174/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..f0fb2df3e6
--- /dev/null
+++ b/challenge-174/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,62 @@
+# The Weekly Challenge 174
+# Task 2 Permutation Ranking
+# O(n^2) solution, translation of Python code on
+# https://tryalgo.org/en/permutations/2016/09/05/permutation-rank/
+use v5.30.0;
+use warnings;
+use List::Util qw/first/;
+
+
+
+sub factorial {
+ my $ans = 1;
+ for (1..$_[0]) {
+ $ans *= $_;
+ }
+ return $ans;
+}
+
+
+
+sub permutation2rank {
+ my @list = $_[0]->@*;
+ my $n = scalar @list;
+ my $fact = factorial($n-1);
+ my $r = 0;
+ my @unused_list = sort {$a<=>$b} @list;
+ for my $i (0..$n-2) {
+ my $q = first { $unused_list[$_] == $list[$i] } 0..$#unused_list;
+ $r += $q*$fact;
+ splice @unused_list, $q, 1;
+ $fact = int $fact / ($n-$i-1);
+ }
+ return $r;
+}
+
+
+
+sub rank2permutation {
+ my @list = $_[0]->@*;
+ my $r = $_[1];
+ my $n = scalar @list;
+ my $fact = factorial($n-1);
+ my @unused_list = sort {$a<=>$b} @list;
+ my @p = ();
+ for my $i (0..$n-1) {
+ my $q = int $r / $fact;
+ $r %= $fact;
+ push @p, $unused_list[$q];
+ splice @unused_list, $q, 1;
+ $fact = int $fact / ($n-1-$i) if $i != $n-1;
+ }
+ return [@p];
+}
+
+
+
+use Test::More tests=>3;
+use Test::Deep;
+ok permutation2rank([1,3,2,4,5]) == 6;
+cmp_deeply rank2permutation([1,6,9],3), [6,9,1];
+ok permutation2rank([9,7,5,3,1]) == 119;
+