zero = lambda f: lambda x: x
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add = lambda n: lambda m: m(succ)(n)
mult = lambda n: lambda m: n(lambda p: add(p)(m))(zero)
two = succ(one)
three = succ(two)
four = succ(three)
five = succ(four)
six = succ(five)
seven = succ(six)
eight = succ(seven)
nine = succ(eight)
ten = succ(nine)
fifty = mult(ten)(five)
TRUE = one
FALSE = zero
IS_ZERO = lambda n: n(lambda x: FALSE)(TRUE)
IF = lambda condition: lambda success: lambda failure: condition(lambda x: success)(failure)
NAND = lambda a: lambda b: IF(a)(IF(b)(FALSE)(TRUE))(TRUE)
NOT = lambda a: NAND(a)(a)
AND = lambda a: lambda b: NOT(NAND(a)(b))
OR = lambda a: lambda b: NAND(NOT(a))(NOT(b))
XOR = lambda a: lambda b: OR(AND(a)(NOT(b)))(AND(b)(NOT(a)))
YCOMB = lambda f: f(f)
PAIR = lambda a: lambda b: lambda cond: IF(cond)(b)(a)
STACK = PAIR(zero)(PAIR(zero)(zero))
LEN = lambda stack: stack(zero)
PUSHED = lambda stack: lambda element: PAIR(succ(LEN(stack)))(PAIR(element)(stack))
TOP = lambda stack: stack(one)(zero)
POPPED = lambda stack: stack(one)(one)
AT = lambda stack: lambda n: TOP(n(POPPED)(stack))
RANGE = lambda n: n(lambda stack: PUSHED(stack)(LEN(stack)))(STACK)
pred = lambda n: TOP(RANGE(n))
sub = lambda m: lambda n: TOP(n(POPPED)(RANGE(succ(m))))
REDUCE = YCOMB(lambda s: lambda f: lambda seq: lambda start: IF(IS_ZERO(LEN(seq)))(lambda:start)(lambda:f(s(s)(f)(POPPED(seq))(start))(TOP(seq)))())
MAP = lambda f: lambda seq: REDUCE(lambda rest: lambda cur: PUSHED(rest)(f(cur)))(seq)(STACK)
FILTER = lambda f: lambda seq: REDUCE(lambda rest: lambda cur: IF(f(cur))(PUSHED(rest)(cur))(rest))(seq)(STACK)
GREATER_THAN = YCOMB(lambda s: lambda m: lambda n: IF(IS_ZERO(m))(lambda: FALSE)(lambda: IF(IS_ZERO(n))(lambda: TRUE)(lambda: s(s)(pred(m))(pred(n)))())())
LESS_THAN = lambda m: lambda n: GREATER_THAN(n)(m)
EQUALS = lambda m: lambda n: NOT(OR(GREATER_THAN(m)(n))(LESS_THAN(m)(n)))
REVERSED = lambda stack: MAP(lambda idx: AT(stack)(idx))(RANGE(LEN(stack)))
CONCAT = lambda stack_a: lambda stack_b: REDUCE(lambda rest: lambda cur: PUSHED(rest)(cur))(stack_a)(stack_b)
divide = YCOMB(lambda s: lambda q: lambda d: IF(LESS_THAN(q)(d))(lambda:zero)(lambda:succ(s(s)(sub(q)(d))(d)))())
mod = YCOMB(lambda s: lambda x: lambda y: IF(LESS_THAN(x)(y))(lambda:x)(lambda:s(s)(sub(x)(y))(y))())
divisible = lambda x: lambda y: IS_ZERO(mod(x)(y))
ORD = lambda n: add(n)(add(mult(four)(ten))(eight))
numeral_to_string = YCOMB(lambda s: lambda n: IF(LESS_THAN(n)(ten))(lambda:PUSHED(STACK)(ORD(n)))(lambda:PUSHED(s(s)(mod(n)(ten)))(ORD(divide(n)(ten))))())
fizz = PUSHED(PUSHED(PUSHED(PUSHED(STACK)(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(ten)(ten))(five)))(add(mult(seven)(ten))(zero))
buzz = PUSHED(PUSHED(PUSHED(PUSHED(STACK)(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(add(mult(one)(ten))(one))(ten))(seven)))(add(mult(six)(ten))(six))
fizzbuzz = PUSHED(PUSHED(PUSHED(PUSHED(PUSHED(PUSHED(PUSHED(PUSHED(STACK)(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(add(mult(one)(ten))(one))(ten))(seven)))(add(mult(nine)(ten))(eight)))(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(add(mult(one)(ten))(two))(ten))(two)))(add(mult(ten)(ten))(five)))(add(mult(seven)(ten))(zero))
fb = lambda n: PUSHED(IF(divisible(n)(three))(IF(divisible(n)(five))(fizzbuzz)(fizz))(IF(divisible(n)(five))(buzz)(numeral_to_string(n))))(ten)
JOIN = lambda seq: REDUCE(CONCAT)(seq)(STACK)
to_list = YCOMB(lambda s: lambda i: lambda seq: [i(TOP(seq))] + s(s)(i)(POPPED(seq)) if i(LEN(seq)) else [])(lambda n: n(lambda a: a+1)(0))
print "".join(map(chr, to_list(JOIN(MAP(fb)(RANGE(fifty))))))