diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-07-24 19:41:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-24 19:41:09 +0100 |
| commit | 790f6820bfd345552dcb09528de829579badd863 (patch) | |
| tree | 0e0191b22b5d84991bb8f5ec44d4d890942e9c17 | |
| parent | faf09413f65585bd884239b5e2459035ae2b3323 (diff) | |
| parent | e42d91f8e1900f77c4abb70d043644f984bb330e (diff) | |
| download | perlweeklychallenge-club-790f6820bfd345552dcb09528de829579badd863.tar.gz perlweeklychallenge-club-790f6820bfd345552dcb09528de829579badd863.tar.bz2 perlweeklychallenge-club-790f6820bfd345552dcb09528de829579badd863.zip | |
Merge pull request #6491 from wambash/challenge-week-174
solutions week 174
| -rw-r--r-- | challenge-174/wambash/raku/ch-1.raku | 20 | ||||
| -rw-r--r-- | challenge-174/wambash/raku/ch-2.raku | 60 |
2 files changed, 80 insertions, 0 deletions
diff --git a/challenge-174/wambash/raku/ch-1.raku b/challenge-174/wambash/raku/ch-1.raku new file mode 100644 index 0000000000..6d06638635 --- /dev/null +++ b/challenge-174/wambash/raku/ch-1.raku @@ -0,0 +1,20 @@ +#!/usr/bin/env raku + +sub is-disarium-number ($n) { + $n == [+] $n.comb Z** 1 .. * +} + +multi MAIN (Bool :test($)!) { + use Test; + is is-disarium-number($_),True, "$_ is disarium" for 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175, 518, 598, 1306, 1676, 2427, 2646798, 12157692622039623539; + is is-disarium-number($_),False, "$_ is not disarium" for 10, 134, 577; + done-testing; +} + +multi MAIN (UInt $k=19) { + ^∞ + andthen .hyper + andthen .grep: &is-disarium-number + andthen .head: $k + andthen .Supply.tap: *.put +} diff --git a/challenge-174/wambash/raku/ch-2.raku b/challenge-174/wambash/raku/ch-2.raku new file mode 100644 index 0000000000..2481005720 --- /dev/null +++ b/challenge-174/wambash/raku/ch-2.raku @@ -0,0 +1,60 @@ +#!/usr/bin/env raku + +sub iter-perm2rank ( Capture ( :@perm, :@seq=Empty ) ) { + my $h := @perm.head; + \( + :perm( |@perm.skip.map: {$_ - ($_ > $h)} ), + :seq( $h, |@seq ), + ) +} + +sub iter-rank2perm (Capture (:@seq, :@adepts,:@perm = Empty)) { + my $h = @seq.head; + \( + :seq( @seq.skip ), + :adepts( |@adepts.head($h), |@adepts.skip( $h+1 ) ), + :perm( |@perm, @adepts[$h] ), + ) +} + +sub permutation2rank (+@perm) { + \( :@perm, ), &iter-perm2rank ... *.<perm>.elems == 0 + andthen .tail + andthen .<seq> + andthen .skip Z* [\*] 1..∞ + andthen .sum +} + +sub rank2permutation ($rank, $n) { + $rank + andthen .polymod: 1..$n + andthen \(:seq(.reverse.skip),:adepts(^$n) ), &iter-rank2perm ... *.<adepts>.elems == 0 + andthen .tail.<perm> +} + +multi MAIN (Bool :test($)!) { + use Test; + is iter-rank2perm( \(:seq(1,1),:adepts(^3)) ).<adepts>, (0,2); + is iter-perm2rank( \(:perm(1,2,0)) ).<perm>, (1,0); + is permutation2rank(0,1,2,3,4),0; + is rank2permutation(4,5), (0,1,4,2,3); + for 1..5 { + subtest { + is permutation2rank(.value),.key, $_ for permutations(^$_).pairs; + }, "perm2rank n=$_"; + } + for 1..5 -> $n { + subtest { + is rank2permutation(.key, $n),.value, $_ for permutations(^$n).pairs; + }, "perm2rank n=$n"; + } + subtest { + is permutation2rank(rank2permutation($_, 20)), $_ for (1 .. [*] 1..20).roll(4) + }, "perm2rank rank2perm n=20 (random)"; + + done-testing; +} + +multi MAIN ( $k,$n=10 ) { + say rank2permutation $k, $n +} |
