Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Folds and composition solution in Creative category for Roman Numerals by ale1ster
from functools import reduce as fold
def checkio(data):
#Helper functions
(tuple_first, tuple_add) = (lambda x,y: x, lambda x,y: (x[0]+y[0], x[1]+y[1]))
ud = update_dict = lambda d,k,v,f: {j:(f(v,d[j]) if j == k else d[j]) for j in d}
(pdd, ndd, ncd) = (lambda i: i and (i + (i%2) - 2), lambda i: i+2, lambda i: i+1)
#Function composition
reduce_dig = lambda *fs: fold(lambda f,g: lambda x,y,z: f(*g(x,y,z)), fs)
#Digit functions
dig_9 = lambda acc,dig,pos: (acc, dig, pos) if not dig == 9 else \
(ud(acc, rdigs[ndd(pos)], (1, 0), tuple_first), 0, pos)
dig_4 = lambda acc,dig,pos: (acc, dig, pos) if not dig == 4 else \
(ud(acc, rdigs[ncd(pos)], (1, 0), tuple_first), 0, pos)
dig_gt5 = lambda acc,dig,pos: (acc, dig, pos) if not dig >= 5 else \
(ud(acc, rdigs[ncd(pos)], (0, 1), tuple_add), dig-5, pos)
dig_true = lambda acc,dig,pos: (ud(acc, rdigs[pos], (0, dig), tuple_add), 0, pos)
f_list = [dig_true, dig_gt5, dig_4, dig_9]
rdigs = ['I', 'V', 'X', 'L', 'C', 'D', 'M', '']
num = fold(lambda acc,v: reduce_dig(*f_list)(acc, *v)[0],
zip(list(map(int, str(data)[::-1])), range(0, len(rdigs), 2)),
{rd:(0, 0) for rd in rdigs})
return fold(lambda acc,v: acc + ((v[1]+rdigs[pdd(v[0])])*num[v[1]][0]) + (v[1]*num[v[1]][1]),
enumerate(rdigs, 0), '')[::-1]
July 9, 2014
Comments: