diff options
Diffstat (limited to 'challenge-092/andinus/README.org')
| -rw-r--r-- | challenge-092/andinus/README.org | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/challenge-092/andinus/README.org b/challenge-092/andinus/README.org new file mode 100644 index 0000000000..c4f5da3378 --- /dev/null +++ b/challenge-092/andinus/README.org @@ -0,0 +1,75 @@ +#+SETUPFILE: ~/.emacs.d/org-templates/level-2.org +#+HTML_LINK_UP: ../index.html +#+OPTIONS: toc:2 +#+EXPORT_FILE_NAME: index +#+DATE: 2020-12-08 +#+TITLE: Challenge 090 + +* Task 2 - Ethiopian Multiplication +You are given two positive numbers $A and $B. + +Write a script to demonstrate [[https://threesixty360.wordpress.com/2009/06/09/ethiopian-multiplication/][Ethiopian Multiplication]] using the given +numbers. +** Raku +- Program: [[file:perl/ch-2.raku]] + +Start by taking =$A= & =$B= which are defined to be =Int= & positive. +#+BEGIN_SRC raku +sub MAIN ( + #= positive numbers + Int $A is copy where * > 0, + Int $B is copy where * > 0 +) { + ... +} +#+END_SRC + +Here's relevant part from the link that was given above: +#+BEGIN_QUOTE +Start with the two numbers on top. Halve one, ignoring any remainders or +fractions, and double the other, stopping when you get to 1. + +14 & 12 +7 & 24 +3 & 48 [See how I ignored the fact that halving 7 leaves 1 left over?] +1 & 96 <— Stop here. + +Now look at the numbers on the right. Some are across from an even +number: in this case, 12 is across from the original 14. Ignore those, +and add the rest. So we’ll add 24, 48, and 96, which were across from +odd numbers, and get 168. And that’s the product! Isn’t that cool? +#+END_QUOTE + +We do the same thing & also print the instructions. +#+BEGIN_SRC raku +my %sets; + +say "Ethopian Multiplication.\n"; +say "Start with $A, $B."; +say "Divide $A by 2 & multiple $B by 2 at each step."; +say "Continue until $A equals 1. Drop the remainder, both should be Integer.\n"; + +say "$A, $B"; +while True { + %sets{$A} = $B.Int; + $A = ($A / 2).Int; + $B = ($B * 2).Int; + last if $A < 1; + say "$A, $B"; +} + +say "\nNow to find the product, simply add all the numbers on right side of ','."; +say "But skip those numbers which have an even number on the left side.\n"; + +my Int $product = 0; +for %sets.sort({.key.Int}).reverse -> $pair { + if $pair.key % 2 != 0 { + $product += $pair.value; + say "- Adding ", $pair.value, " to product."; + } else { + say "- Skipping ", $pair.value, " because ", $pair.key, " is even."; + } +} + +say "\nProduct: $product"; +#+END_SRC |
