Ethiopian multiplication: Difference between revisions
Content deleted Content added
Added Oz example. |
→{{header|Oz}}: improved readibility |
||
Line 1,063: | Line 1,063: | ||
=={{header|Oz}}== |
=={{header|Oz}}== |
||
<lang oz>declare |
<lang oz>declare |
||
fun {Halve X} X div 2 end |
fun {Halve X} X div 2 end |
||
fun {Double X} X * 2 end |
fun {Double X} X * 2 end |
||
fun {Even X} {Abs X mod 2} == 0 end %% standard function: Int.isEven |
fun {Even X} {Abs X mod 2} == 0 end %% standard function: Int.isEven |
||
fun {EthiopicMult X Y} |
fun {EthiopicMult X Y} |
||
X >= 0 = true %% assert: X must not be negative |
X >= 0 = true %% assert: X must not be negative |
||
Rows = for |
Rows = for |
||
L in X;L>0;{Halve L} |
L in X; L>0; {Halve L} %% C-like iterator: "Init; While; Next" |
||
R in Y;true;{Double R} |
R in Y; true; {Double R} |
||
collect: |
collect:Collect |
||
do |
|||
{Collect L#R} |
|||
end |
|||
OddRows = {Filter Rows |
OddRows = {Filter Rows LeftIsOdd} |
||
RightColumn = {Map OddRows SelectRight} |
|||
in |
in |
||
{Sum RightColumn} |
|||
{FoldL OddRows fun {$ Z _#R} Z+R end 0} |
|||
end |
end |
||
%% Helpers |
|||
fun {LeftIsOdd L#_} {Not {Even L}} end |
|||
fun {SelectRight _#R} R end |
|||
fun {Sum Xs} {FoldL Xs Number.'+' 0} end |
|||
in |
in |
||
{Show {EthiopicMult 17 34}}</lang> |
{Show {EthiopicMult 17 34}}</lang> |