diff options
| author | rir <rirans@comcast.net> | 2022-03-18 21:37:29 -0400 |
|---|---|---|
| committer | rir <rirans@comcast.net> | 2022-03-18 21:37:29 -0400 |
| commit | 00656b906e80fdff991ea2b848a2829a09333a0b (patch) | |
| tree | 07f85361335d441f7d2aebf20b03105416b74df7 /challenge-156/0rir | |
| parent | 06477d3bb07f9671a815a61cb265f7f0c25b6119 (diff) | |
| download | perlweeklychallenge-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.raku | 12 | ||||
| -rw-r--r-- | challenge-156/0rir/raku/ch-2.raku | 94 |
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"; +} |
