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:C
collect:Collect
do
do
{C L#R}
{Collect L#R}
end
end

OddRows = {Filter Rows fun {$ L#_} {Not {Even L}} end}
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>