Ethiopian multiplication: Difference between revisions

Content added Content deleted
m (→‎{{header|Python}}: No more list comprehension :()
(→‎{{header|Python}}: Move table out of function)
Line 2,391: Line 2,391:


<lang python>from itertools import izip, takewhile
<lang python>from itertools import izip, takewhile

halve = lambda x: x // 2
halve = lambda x: x // 2
double = lambda x: x * 2
double = lambda x: x * 2
even = lambda x: x % 2 == 0
even = lambda x: x % 2 == 0

def iterate(function, arg):
def iterate(function, arg):
while 1:
while 1:
yield arg
yield arg
arg = function(arg)
arg = function(arg)

halves = lambda x: takewhile(lambda v: v >= 1, iterate(halve, x))
halves = lambda x: takewhile(lambda v: v >= 1, iterate(halve, x))
doubles = lambda x: iterate(double, x)
doubles = lambda x: iterate(double, x)
table = lambda x, y: izip(halves(x), doubles(y))


def ethiopian(multiplier, multiplicand):
def ethiopian(multiplier, multiplicand):
table = list(izip(halves(multiplier), doubles(multiplicand)))
result = sum(q for p, q in table(multiplier, multiplicand)
result = sum(q for p, q in table if not even(p))
if not even(p))
return result</lang>
return result</lang>