diff options
| -rw-r--r-- | challenge-076/mark-anderson/raku/ch-1.raku | 60 | ||||
| -rw-r--r-- | challenge-076/mark-anderson/raku/ch-2.raku | 158 |
2 files changed, 218 insertions, 0 deletions
diff --git a/challenge-076/mark-anderson/raku/ch-1.raku b/challenge-076/mark-anderson/raku/ch-1.raku new file mode 100644 index 0000000000..a458ab46a5 --- /dev/null +++ b/challenge-076/mark-anderson/raku/ch-1.raku @@ -0,0 +1,60 @@ +# with help from https://www.geeksforgeeks.org/minimum-number-of-primes-required-such-that-their-sum-is-equal-to-n/ + +=begin usage + +Usage: raku ch-1.raku 27 + +Output: + +2, 2, 23 +3, 5, 19 +3, 7, 17 +3, 11, 13 +5, 11, 11 +5, 5, 17 +7, 7, 13 + +=end usage + +sub MAIN(UInt $N where $N > 1) { + given $N { + when .is-prime { + say $N; + } + when * %% 2 { + .say for min-primes($N, 2); + } + default { + if ($N-2).is-prime { + .say for min-primes($N, 2); + } + else { + .say for min-primes($N, 3); + } + } + } +} + +sub min-primes(UInt $N, $count) { + my @primes = (sieve(2, 2..$N) xx 2).flat; + + return @primes.combinations($count).grep(*.sum == $N) + .map((*.sort).join(", ")) + .unique; + + sub sieve($n is copy, @list) { + my @primes = @list.grep(* <= $n); + + @primes.append: @list.grep({ $_ > $n and $_ % $n }); + + $n = @primes.first(* > $n); + + if $n**2 <= $N { + sieve($n, @primes); + } + + else { + return @primes; + } + } +} diff --git a/challenge-076/mark-anderson/raku/ch-2.raku b/challenge-076/mark-anderson/raku/ch-2.raku new file mode 100644 index 0000000000..5869d511e9 --- /dev/null +++ b/challenge-076/mark-anderson/raku/ch-2.raku @@ -0,0 +1,158 @@ +=begin usage + +Usage: raku ch-2.raku grid.txt word-list.txt 5 + +Output: + +70 words +align +alose +antes +arose +blunt +blunts +boids +broad +Butea +Buteas +clove +cloven +constitution +constitutions +croon +depart +departed +enter +filch +garlic +gings +goats +grieve +grieves +grith +gurrs +hazard +ileac +ileacs +Ionis +Iteas +liens +lunts +malign +malignant +malls +midst +midsts +neuma +neumas +obans +ought +ovary +parted +pasmo +quash +Raias +raias +rines +ruses +Shrine +Shrines +shrine +shrines +sices +social +soyas +spasm +spasmodic +staun +succor +succors +taars +talose +theorem +theorems +virus +viruses +wifie +wigged + +=end usage + +use Lingua::EN::Inflect:from<Perl5> 'PL'; + +sub MAIN(Str $grid, Str $word-list, UInt $word-length=5) { + my @AoA = $grid.IO.lines.map(*.split(/\s/).Array).Array; + + my @strings = strings(@AoA, $word-length); + + my @words = gather { + for $word-list.IO.lines -> $word { + next if $word.chars < $word-length-1; + + for @strings -> $string { + if $string.contains(uc $word) { + take $word if $word.chars >= $word-length; + my $plural = PL($word); + if $plural.chars >= $word-length and $string.contains(uc $plural) { + take $plural; + } + } + } + } + } + + @words = @words.unique; + say "{@words.elems} words"; + .say for @words; +} + +#| returns an array of strings which consists of the horizontal, vertical, +#| and diagonals of @AoA. It also includes the reverse of each. +sub strings(@AoA, $word-length) { + my @AoA2 = [Z] @AoA; + my @AoA3 = @AoA.reverse; + my @AoA4 = [Z] @AoA3; + + my @strings; + # @AoA horizontal lines + @strings.push: $_ for @AoA.map(*.join); + + # @AoA vertical lines + @strings.push: $_ for (@AoA2).map(*.join); + + # @AoA upper right diagonals + @strings.push: $_ for diagonals(@AoA).map(*.join); + + # @AoA lower left diagonals + @strings.push: $_ for diagonals(@AoA2).map(*.join); + + # @AoA lower right diagonals + @strings.push: $_ for diagonals(@AoA3).map(*.join); + + # @AoA upper left diagonals + @strings.push: $_ for diagonals(@AoA4).map(*.join); + + @strings = @strings.grep(*.chars >= $word-length).unique; + + my @flipped = @strings.map(*.flip); + + @strings.append: @flipped; + + return @strings; +} + +#| there's probably a neat raku trick to get the diagonals. +sub diagonals(@AoA) { + my @diagonals; + + for ^@AoA[0] -> $i { + my @diagonal = gather { + for ^(@AoA[0]-$i) -> $j { + take @AoA[$j][$i+$j] || last; + } + } + @diagonals.push: @diagonal; + } + + return @diagonals; +} |
