diff options
| author | Flavio Poletti <flavio@polettix.it> | 2021-12-01 00:03:08 +0100 |
|---|---|---|
| committer | Flavio Poletti <flavio@polettix.it> | 2021-12-01 00:03:08 +0100 |
| commit | d482d8f397d2ec4b935af1ea6e7af71c983327f6 (patch) | |
| tree | 4b1a1a273aae1a22066a0a393270fe83ae2a3820 | |
| parent | 87657d119305f8de1d4322f596a72ae619eacaac (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-141/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-141/polettix/perl/ch-1.pl | 28 | ||||
| -rw-r--r-- | challenge-141/polettix/perl/ch-2.pl | 20 | ||||
| -rw-r--r-- | challenge-141/polettix/raku/ch-1.raku | 120 | ||||
| -rw-r--r-- | challenge-141/polettix/raku/ch-2.raku | 20 |
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; +} |
