Blindfolded Arithmetic/compile from Minsky machine

From Esolang
Jump to navigation Jump to search

This python program by User:Jan jelo compiles Minsky machine program into Blindfolded Arithmetic program(state 0 means halt,and program starts from state 1). Basically,a encodes two counters in 2^A*3^B form(It is initialized to 1 by the program),c is used as an instruction pointer(Also initialized to 1 by the program.),i is used to generate constants and store intermediate results(Non-zero input is required),other registers are used to store intermediate results.

Test if x and y are equal by 1/((x-y)*(x-y)+1)(This is used to compare the instruction pointer with a constant).

Test if counter A is equal to 0 by a-a/2*2,test if counter B is equal to 0 by (1+a-a/3*3)/2.

Increase counter A by a=a*2,decrease counter A by a=a/2.

Increase counter B by a=a*3,decrease counter B by a=a/3.

x=[cond]?y:z is equivalent to x=y*[cond]+z*(1-[cond]).

Output will be the value of a when the program halts.

program='''
inc a 2
inc a 3
inc a 4
inc b 5
dec a 4 0
'''
def compile(program):
    p=[[x for x in x.split(' ')
        if x in{'inc','dec','a','b'}or x.isdigit()]
       for x in program.split('\n')if x!='']
    res='i=i/i\nd=a*a\nd=d+i\nd=i/d\na=a+d\nd=c*c\nd=d+i\nd=i/d\nc=c+d\n'
    #i=1;a=1 if a==0 else a;c=1 if c==0 else c
    i=1
    #test if x==y:1/((x-y)*(x-y)+1)
    #test if x==0:1/(x*x+1)
    #test if A==0:a-a/2*2
    #test if B==0:(1+(a-a/3*3))/2
    #inc A:a=a*2
    #inc B:a=a*3
    #dec A:a=a/((A!=0)+1)
    #dec B:a=a/((B!=0)*2+1)
    for x in p:
        if(x[0],x[1])==('inc','a'):
            res+='d=c*i\n'+i*'d=d-i\n'+'d=d*d\nd=d+i\nd=i/d\nd=d+i\n'
            # d = (c=={i})+1
            res+='a=a*d\n'
            # inc A if d==2
            res+='d=d-i\nd=i-d\nc=c*d\nd=1-d\n'+int(x[2])*'c=c+d\n'
            # c = x[2] if d else c
            res+='i=a*i\ni=c/c\n'
            # exit if c==0
        if(x[0],x[1])==('inc','b'):
            res+='d=c*i\n'+i*'d=d-i\n'+'d=d*d\nd=d+i\nd=i/d\ni=i+i\nd=d*i\ni=i/i\nd=d+i\n'
            # d = (c=={i})*2+1
            res+='a=a*d\n'
            # inc B if d==3
            res+='d=d-i\ni=i+i\nd=d/i\ni=i/i\nd=i-d\nc=c*d\nd=1-d\n'+int(x[2])*'c=c+d\n'
            # c = x[2] if d else c
            res+='i=a*i\ni=c/c\n'
            # exit if c==0
        if(x[0],x[1])==('dec','a'):
            res+='d=c*i\n'+i*'d=d-i\n'+'d=d*d\nd=d+i\nd=i/d\n'
            # d = (c=={i})
            res+='i=i+i\nb=a/i\nb=b*i\ni=i/i\nb=a-b\nb=i-b\n'
            # b = (A!=0)
            res+='b=b+i\na=a/b\nb=b-i\n'
            # inc A
            res+='e=e-e\n'+int(x[2])*'e=e+b\n'+'b=i-b\ni=i-i\n'+int(x[3])*'i=i+b\n'+'e=e+i\ni=a/a\ne=e*d\nd=i-d\ni=c*d\nc=e+i\ni=a/a\n'
            # c =(x[2]if b else x[3])if d else c
            res+='i=a*i\ni=c/c\n'
            # exit if c==0
        if(x[0],x[1])==('dec','b'):
            res+='d=c*i\n'+i*'d=d-i\n'+'d=d*d\nd=d+i\nd=i/d\n'
            # d = (c=={i})
            res+='b=i*i\ni=i+i\ni=i+b\nb=a/i\nb=b*i\ni=i/i\nb=a-b\nb=b+i\ni=i+i\nb=b/i\ni=i/i\nb=i-b\n'
            # b = (B!=0)
            res+='i=i+i\nb=b*i\ni=i/i\nb=b+i\na=a/b\nb=b-i\ni=i+i\nb=b/i\ni=i/i\n'
            # inc B
            res+='e=e-e\n'+int(x[2])*'e=e+b\n'+'b=i-b\ni=i-i\n'+int(x[3])*'i=i+b\n'+'e=e+i\ni=a/a\ne=e*d\nd=i-d\ni=c*d\nc=e+i\ni=a/a\n'
            # c =(x[2]if b else x[3])if d else c
            res+='i=a*i\ni=c/c\n'
            # exit if c==0
        i+=1
    return res
a=compile(program)
r'''
a=a.replace('/','//')
a=map(lambda x:f'  {x}\n',a.split('\n'))
a='a,b,c,d,e=[0]*5;i=int(input())\ntry:\n while True:\n'+''.join(a)+'except:\n print(i)'
'''
print(a)

(Commenting out raw string quotation marks will produce a python code equivalent to Blindfolded Arithmetic code.)

For this example,the output will be:

i=i/i
d=a*a
d=d+i
d=i/d
a=a+d
d=c*c
d=d+i
d=i/d
c=c+d
d=c*i
d=d-i
d=d*d
d=d+i
d=i/d
d=d+i
a=a*d
d=d-i
d=i-d
c=c*d
d=1-d
c=c+d
c=c+d
i=a*i
i=c/c
d=c*i
d=d-i
d=d-i
d=d*d
d=d+i
d=i/d
d=d+i
a=a*d
d=d-i
d=i-d
c=c*d
d=1-d
c=c+d
c=c+d
c=c+d
i=a*i
i=c/c
d=c*i
d=d-i
d=d-i
d=d-i
d=d*d
d=d+i
d=i/d
d=d+i
a=a*d
d=d-i
d=i-d
c=c*d
d=1-d
c=c+d
c=c+d
c=c+d
c=c+d
i=a*i
i=c/c
d=c*i
d=d-i
d=d-i
d=d-i
d=d-i
d=d*d
d=d+i
d=i/d
i=i+i
d=d*i
i=i/i
d=d+i
a=a*d
d=d-i
i=i+i
d=d/i
i=i/i
d=i-d
c=c*d
d=1-d
c=c+d
c=c+d
c=c+d
c=c+d
c=c+d
i=a*i
i=c/c
d=c*i
d=d-i
d=d-i
d=d-i
d=d-i
d=d-i
d=d*d
d=d+i
d=i/d
i=i+i
b=a/i
b=b*i
i=i/i
b=a-b
b=i-b
b=b+i
a=a/b
b=b-i
e=e-e
e=e+b
e=e+b
e=e+b
e=e+b
b=i-b
i=i-i
e=e+i
i=a/a
e=e*d
d=i-d
i=c*d
c=e+i
i=a/a
i=a*i
i=c/c

and the program should output 81(3^4).