aboutsummaryrefslogtreecommitdiff
path: root/challenge-156/0rir
diff options
context:
space:
mode:
authorrir <rirans@comcast.net>2022-03-18 21:37:29 -0400
committerrir <rirans@comcast.net>2022-03-18 21:37:29 -0400
commit00656b906e80fdff991ea2b848a2829a09333a0b (patch)
tree07f85361335d441f7d2aebf20b03105416b74df7 /challenge-156/0rir
parent06477d3bb07f9671a815a61cb265f7f0c25b6119 (diff)
downloadperlweeklychallenge-club-00656b906e80fdff991ea2b848a2829a09333a0b.tar.gz
perlweeklychallenge-club-00656b906e80fdff991ea2b848a2829a09333a0b.tar.bz2
perlweeklychallenge-club-00656b906e80fdff991ea2b848a2829a09333a0b.zip
wc156
Diffstat (limited to 'challenge-156/0rir')
-rw-r--r--challenge-156/0rir/raku/ch-1.raku12
-rw-r--r--challenge-156/0rir/raku/ch-2.raku94
2 files changed, 106 insertions, 0 deletions
diff --git a/challenge-156/0rir/raku/ch-1.raku b/challenge-156/0rir/raku/ch-1.raku
new file mode 100644
index 0000000000..d23a382034
--- /dev/null
+++ b/challenge-156/0rir/raku/ch-1.raku
@@ -0,0 +1,12 @@
+#!/usr/bin/env raku
+# :vim ft=raku sw=4 expandtabs
+use v6.d;
+
+#1 Pernicious Numbers
+
+(gather {
+ for 1…∞ {
+ .take if .base(2).split('').grep( '1' ).chars.is-prime()
+ }
+})[0..9].join( ', ', :skip-empty ).say;
+
diff --git a/challenge-156/0rir/raku/ch-2.raku b/challenge-156/0rir/raku/ch-2.raku
new file mode 100644
index 0000000000..d47c7ce64c
--- /dev/null
+++ b/challenge-156/0rir/raku/ch-2.raku
@@ -0,0 +1,94 @@
+#!/usr/bin/env raku
+# :vim ft=raku sw=4 expandtabs
+use v6.d;
+
+# 2 Weird Number
+
+my $n = 5;
+
+my \TEST = False;
+
+if TEST {
+ my @w = 70, 836, 4030, 5830, 7192, 7912, 9272, 10430, 10570,
+ 10792, 10990, 11410, 11690, 12110, 12530, 12670,
+ 13370, 13510, 13790, 13930, 14770, 15610, 15890,
+ 16030, 16310, 16730, 16870, 17272, 17570, 17990,
+ 18410, 18830, 18970, 19390, 19670;
+
+ for 10, 12, 20, 21, 5000, 88,
+ 70, 836, 4030, 5830, 7192, 7912, 9272, 10430, 10570,
+ 10792, 10990, 11410, 11690, 12110, 12530, 12670,
+ 13370, 13510, 13790, 13930, 14770, 15610, 15890,
+ 16030, 16310, 16730, 16870, 17272, 17570, 17990,
+ 18410, 18830, 18970, 19390, 19670
+ -> $x {
+ if is_weird($x) {
+ die unless $x == @w.any;
+ say $x;
+ }else{
+ die unless $x == @w.none;
+ }
+ }
+}
+
+sub MAIN( Int $x = 70 ) {
+ my @state = is_weird( $x);
+ present( | @state);
+ exit;
+}
+
+sub is_weird( Int $n where $n > 1, --> Any ) {
+
+ my @proper = ( 1 … Int($n/2) ).grep: $n %% *;
+ my $sum = [+] @proper;
+
+ if $n ≥ $sum { return ( False, @proper, $n, [], 'gte') but False; }
+
+ my $diff = $sum - $n;
+ my @equalizer = @proper.grep( * ≤ $diff).combinations;
+ sink @equalizer.shift;
+ for @equalizer -> @e {
+ if $diff == [+] @e {
+ return (False, @proper, $n, @e, 'match') but False;
+ }
+ }
+ return ( True, @proper, $n, [], 'fine') but True;
+}
+
+sub present( Bool $flag, @proper, Int $n, @variance, Str $annot ) {
+ say "Input: \$n = $n\nOutput: $flag.Int()\n";
+ _format( $flag, @proper, $n, @variance, $annot );
+}
+
+sub _format( Bool $flag, @p, Int $n, @variance, Str $annot ) {
+ given $annot {
+ when 'gte' {
+ say "Since the proper divisor" ~ _format_list(@p)
+ ~ " sum to " ~ ([+] @p)
+ ~ " which is not greater than $n.";
+ }
+ when 'match' {
+ say "Since the proper divisor", _format_list(@p),
+ " sum to ", ( [+] @p), " but the subset",
+ _format_list((@p (-) @variance).Hash.keys.sort).substr(5),
+ " does sum to $n." ;
+ }
+ when 'fine' {
+ say "Since the proper divisors of $n "
+ ~ _format_list( @p ).substr( 2) ~ " sums to "
+ ~ ([+] @p) ~ " and no subset of divisors sums to $n.";
+ }
+ default { die "bad annot -- unreachable w/ $n";
+ }
+ }
+ return;
+}
+
+sub _format_list( @list --> Str ) {
+ given @list.elems {
+ when 1 { return "is @list[0] " }
+ when 2 { return "s are @list[0] and @list[1] " }
+ default { return "s are @list[0..*-2].join(', ') and @list[*-1]" }
+ }
+ die "unreachable";
+}