# Make $21$ out of $1,5,6,7$ (challenge).

Here is a small mathematical challenge.

You have to use once and only once each of the four numbers $1,5,6,7$ in order to obtain, via the help of the usual operators ($+,-,/,*$ together with parenthesis) in order to obtain the number $21$.

Example of an unsuccessful computation: $6*5-7-1=22\neq 21$

• $6 / (1 - 5/7)$ ${}$ – Cocopuffs Jun 12 '13 at 19:33
• @Cocopuffs Arghh you beat me! – Kaish Jun 12 '13 at 19:35
• Hint : Give this problem to a (non-)mathematician friend and bet that he can't solve it in 1 hour without googling it. You may often win... – user81566 Jun 12 '13 at 20:43

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fractions import Fraction

L=[Fraction(1),Fraction(5),Fraction(6),Fraction(7)]
O={'+':10,'-':10,'*':10,'/':10}
N=Fraction(21)

P = {'+':lambda x,y:x+y,
'-':lambda x,y:x-y,
'*':lambda x,y:x*y,
'/':lambda x,y:x/y}

def postfix_search(rest, stk):
if len(stk) >= 2:
y = (v2, r2) = stk.pop()
x = (v1, r1) = stk.pop()
for opr in O:
if O[opr] > 0 and not (opr == '/' and v2 == 0):
stk += [(P[opr](v1, v2), '('+r1+opr+r2+')')]
O[opr] -= 1
if postfix_search(rest, stk): return 1
O[opr] += 1
stk.pop()
stk += [x, y]
elif not rest:
v, r = stk[0]
if v == N: print(r)
return v == N
for x in list(rest):
rest.remove(x)
stk += [x]
if postfix_search(rest, stk):
return True
stk.pop()
rest += [x]

if __name__ == "__main__":
postfix_search(list(zip(L, map(str, L))), [])


Run