aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2021-12-01 00:03:08 +0100
committerFlavio Poletti <flavio@polettix.it>2021-12-01 00:03:08 +0100
commitd482d8f397d2ec4b935af1ea6e7af71c983327f6 (patch)
tree4b1a1a273aae1a22066a0a393270fe83ae2a3820
parent87657d119305f8de1d4322f596a72ae619eacaac (diff)
downloadperlweeklychallenge-club-d482d8f397d2ec4b935af1ea6e7af71c983327f6.tar.gz
perlweeklychallenge-club-d482d8f397d2ec4b935af1ea6e7af71c983327f6.tar.bz2
perlweeklychallenge-club-d482d8f397d2ec4b935af1ea6e7af71c983327f6.zip
Add polettix's solution to challenge-141
-rw-r--r--challenge-141/polettix/blog.txt1
-rw-r--r--challenge-141/polettix/blog1.txt1
-rw-r--r--challenge-141/polettix/perl/ch-1.pl28
-rw-r--r--challenge-141/polettix/perl/ch-2.pl20
-rw-r--r--challenge-141/polettix/raku/ch-1.raku120
-rw-r--r--challenge-141/polettix/raku/ch-2.raku20
6 files changed, 190 insertions, 0 deletions
diff --git a/challenge-141/polettix/blog.txt b/challenge-141/polettix/blog.txt
new file mode 100644
index 0000000000..f552f2276d
--- /dev/null
+++ b/challenge-141/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/12/01/pwc141-number-divisors/
diff --git a/challenge-141/polettix/blog1.txt b/challenge-141/polettix/blog1.txt
new file mode 100644
index 0000000000..860d7d21f8
--- /dev/null
+++ b/challenge-141/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2021/12/01/pwc141-like-numbers/
diff --git a/challenge-141/polettix/perl/ch-1.pl b/challenge-141/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..1f90a42ea0
--- /dev/null
+++ b/challenge-141/polettix/perl/ch-1.pl
@@ -0,0 +1,28 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+sub count_divisors ($n) {
+ my $c = 2; # 1, $n
+ for my $d (2 .. $n / 2) {
+ ++$c unless $n % $d;
+ }
+ return $c;
+}
+
+sub number_divisors ($n) {
+ my $i = 1;
+ my @retval;
+ while ($n > 0) {
+ if (count_divisors($i) == 8) {
+ push @retval, $i;
+ --$n;
+ }
+ ++$i;
+ }
+ return @retval;
+}
+
+say for number_divisors(shift // 10);
diff --git a/challenge-141/polettix/perl/ch-2.pl b/challenge-141/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..a0890b03a5
--- /dev/null
+++ b/challenge-141/polettix/perl/ch-2.pl
@@ -0,0 +1,20 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+sub like_numbers ($m = 1234, $n = 2) {
+ my @m = split m{}mxs, $m;
+ my $bits = @m;
+ my $N = 2 ** $bits - 2;
+ my $c = 0;
+ for my $i (1 .. $N) {
+ my @b = split m{}mxs, sprintf "%0${bits}b", $i;
+ my $v = join '', map { $b[$_] ? $m[$_] : () } 0 .. $#m;
+ ++$c unless $v % $n;
+ }
+ return $c;
+}
+
+say like_numbers(@ARGV);
diff --git a/challenge-141/polettix/raku/ch-1.raku b/challenge-141/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..a201149d96
--- /dev/null
+++ b/challenge-141/polettix/raku/ch-1.raku
@@ -0,0 +1,120 @@
+#!/usr/bin/env raku
+use v6;
+
+sub next-prime-after ($p) { # $p is prime
+ state %nxt = 2 => 3, 3 => 5, 5 => 7, 7 => 11;
+ state $max= 7;
+ while ($p > $max) {
+ $max= %nxt{$max};
+ %nxt{$max} = $max+ 2;
+ %nxt{$max} += 2 until %nxt{$max}.is-prime;
+ }
+ return %nxt{$p};
+}
+
+class BasicPriorityQueue {
+ has @!items;
+ has &!before;
+
+ submethod BUILD (:&!before = {$^a < $^b}, :@items) {
+ @!items = '-';
+ self.enqueue($_) for @items;
+ }
+
+ #method dequeue ($obj) <-- see below
+ method elems { @!items.end }
+ # method enqueue ($obj) <-- see below
+ method is-empty { @!items.elems == 1 }
+ method size { @!items.end }
+ method top { @!items.end ?? @!items[1] !! Any }
+
+ method dequeue () { # includes "sink"
+ return unless @!items.end;
+ my $r = @!items.pop;
+ ($r, @!items[1]) = (@!items[1], $r) if @!items.end >= 1;
+ my $k = 1;
+ while (my $j = $k * 2) <= @!items.end {
+ ++$j if $j < @!items.end && &!before(@!items[$j + 1], @!items[$j]);
+ last if &!before(@!items[$k], @!items[$j]);
+ (@!items[$j, $k], $k) = (|@!items[$k, $j], $j);
+ }
+ return $r;
+ }
+
+ method enqueue ($obj) { # includes "swim"
+ @!items.push: $obj;
+ my $k = @!items.end;
+ (@!items[$k/2, $k], $k) = (|@!items[$k, $k/2], ($k/2).Int)
+ while $k > 1 && &!before(@!items[$k], @!items[$k/2]);
+ return self;
+ }
+}
+
+class A7 {
+ has Int $!A = 2;
+ method current () { $!A ** 7 }
+ method move-on () { $!A = next-prime-after($!A) }
+}
+
+class A3B1 {
+ has $!queue = BasicPriorityQueue.new(
+ before => {$^a[2] < $^b[2]},
+ items => [[2, 3, 24, 0], [2, 3, 54, 1], ],
+ );
+ method current () { return $!queue.top[2] }
+ method move-on () {
+ my ($A, $B, $value, $twist) = $!queue.dequeue.Slip;
+ my $next-B = next-prime-after($B);
+ my @new = [$A, $next-B],; # this always appears
+ my $next-A = next-prime-after($A);
+ @new.push: [$next-A, $B]
+ if $next-A < $B && next-prime-after($next-A) == $B; # fork!
+ for @new -> $item {
+ ($A, $B) = $item.Slip;
+ $item.push: $twist ?? ($A * $B ** 3) !! ($A ** 3 * $B);
+ $item.push: $twist;
+ $!queue.enqueue($item);
+ }
+ }
+}
+
+class A1B1C1 {
+ has $!queue = BasicPriorityQueue.new(
+ before => {$^a[3] < $^b[3]},
+ items => [[2, 3, 5, 30], ]
+ );
+ method current() { return $!queue.top[3] }
+ method move-on() {
+ my ($A, $B, $C, $value) = $!queue.dequeue.Slip;
+ my ($n-A, $n-B, $n-C) = ($A, $B, $C).map: {next-prime-after($^a)};
+ my @new = [$A, $B, $n-C], ;
+ @new.push: [$A, $n-B, $C] if $n-B < $C;
+ @new.push: [$n-A, $B, $C] if $n-A < $B;
+ for @new -> $item {
+ ($A, $B, $C) = $item.Slip;
+ $item.push: $A * $B * $C;
+ $!queue.enqueue($item);
+ }
+ }
+}
+
+class EnumerateEighters {
+ has $!a7 = A7.new();
+ has $!a3b1 = A3B1.new();
+ has $!a1b1c1 = A1B1C1.new();
+ method get() {
+ my $A = $!a7.current;
+ my $B = $!a3b1.current;
+ my $C = $!a1b1c1.current;
+ my $retval = ($A, $B, $C).min;
+ if ($retval == $A) { $!a7.move-on }
+ elsif ($retval == $B) { $!a3b1.move-on }
+ else { $!a1b1c1.move-on }
+ return $retval;
+ }
+}
+
+sub MAIN (Int $n = 10) {
+ my $x = EnumerateEighters.new;
+ $x.get.put for 1 .. $n;
+}
diff --git a/challenge-141/polettix/raku/ch-2.raku b/challenge-141/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..d3ab9d49c7
--- /dev/null
+++ b/challenge-141/polettix/raku/ch-2.raku
@@ -0,0 +1,20 @@
+#!/usr/bin/env raku
+use v6;
+
+sub MAIN (Int:D $m = 1234, Int:D $n = 2) {
+ like-numbers($m, $n).put;
+}
+
+sub like-numbers (Str() $m, Int:D $n) {
+ my @m = $m.comb(/\d/);
+ my $bits = @m.elems;
+ my $template = '%0' ~ $bits ~ 'b';
+ my $N= 2 ** $bits - 1;
+ my $c = 0;
+ for 0 ^..^ $N -> $i {
+ my @b = $template.sprintf($i).comb(/<[0 1]>/);
+ my $v = (0 .. @m.end).map({ @b[$_] > 0 ?? @m[$_] !! '' }).join('');
+ ++$c if $v %% $n;
+ }
+ return $c;
+}