[Math] Make $21$ out of $1,5,6,7$ (challenge).

puzzlerecreational-mathematics

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$

Best Answer

See Generate a number by using a given list of numbers and arithmetic operators

This is an adjusted part of the answer from Ray

#!/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

$ ./generate.py
(6/(1-(5/7)))

My ideas with arbitrary functions

$\varphi$ is Eulers totient function

  • $\varphi(5 \cdot 6-7)-1 = \varphi(23)-1 = 22-1 = 21$
  • $\varphi((1+7) \cdot 6)+5= \varphi(48)+5=16+5=21$