BrainPi

From Esolang
Jump to navigation Jump to search

BrainPi is an esolang invented by User:None1 on the Pi day of 2024 (2024/3/14). It is like Goldfuck except that it uses Pi instead of phi.

BrainPi logo

Examples

Hello World

3.1415926835897932384426433832695028841971893993721058206749445923073164062812089986280378253421190679821490865132803066450938446095501822317258594081284815174502041027029385216055596446229689549303819694288109756656334465284754482334867831653712019091456085669834603486704543266481133936071602491419737245878066063155851748875209209628092540917155643676925903600123305308488204965213881469512415116099330572703637595912530921871173819326717931551185080744823799927495973518857525248917279381830159491295336733824406566434860213549463952447371907023

Cat Program

3.1415926532897932384676433832795008841971698993751058259749445923079

Truth Machine

3.14159365358479323046264338367950288419416939937510182097494459730781640128620799862801482534711706768214808051328630664709384410955098223172595940812848113745028010270103852115555964462296895493538196402881097566597344611847564823372678316527170190914564855

Nope. interpreter

3.1415926335897939384626453832795628841972693993731058209749455923048164062462089983280348233421170879821483865132803066470538446093505822357253594581284819174502881027019285211065596446299489549303811644283109756659344461264756482137867832652712029091456985669233603486124543266082133930072602421412737545870069063155881743815206209628232540917553643670925903690113305605488201665213861469519815116092330572733657596919530928861173819326917931151185481744623799697495673018857527244912279388830119498298336736624406564430860212949463957247371901021798603437027703392171764931767529846748184666694071320005581271451635608247857713027577898091736371780214686409012279534301865495852710507962796892189235429199561151290219008640349181598436297747513099605187092113439999983129780499512

Output the first 7 digits of pi (3.1415926)

3.1415926635897931384626453832795928841978693993721058209049445923078264062662089981280348263421170079821481865132893066470038446094505822417253594581284811174552841037019385911055592446229489579303819694288109726659334411284756452337867861652712019491456486669234673486104643266482139936072692491412437245871066063155861748815249209628282540917143643678925503600119305305438204665313841468519415116004330572603657598919530951861173919326117938051185489744623797627495674518857522248912276381830113491298338733624406526430860413949466952247381907021398609437021

(Originally +++++++[>+++++++<-]>++.-----.+++.+++.---.++++.++++.-------.++++. in BF)

Interpreter in Python

Requires the precreal package which implements float without precision loss. As the package is written in pure Python, running large programs (e.g.: Hello World program) may be a bit slow.

import sys,precreal
def bf(code):
    s1=[]
    s2=[]
    matches={}
    tape=[0]*1000000
    for i,j in enumerate(code):
        if j=='[':
            s1.append(i)
        if j==']':
            m=s1.pop()
            matches[m]=i
            matches[i]=m
    cp=0
    p=0
    while cp<len(code):
        if code[cp]=='+':
            tape[p]=(tape[p]+1)%256
        if code[cp]=='-':
            tape[p]=(tape[p]-1)%256
        if code[cp]==',':
            tape[p]=ord(sys.stdin.read(1))%256
        if code[cp]=='.':
            print(chr(tape[p]),end='')
        if code[cp]=='<':
            p-=1
        if code[cp]=='>':
            p+=1
        if code[cp]=='[':
            if not tape[p]:
                cp=matches[cp]
        if code[cp]==']':
            if tape[p]:
                cp=matches[cp]
        cp+=1
def fuck2bf(code):
    cleancode=''
    for i in code:
        if i in '!#':
            cleancode+=i
    cp=0
    table='     ><+-,.[]'
    b=''
    while cp<len(cleancode):
        idx=cleancode.index('#',cp)-cp
        b+=table[idx]
        cp+=idx+1
    return b
def run(code):
    bf(fuck2bf(code))
code=input()[2:]
pi_digits=str(precreal.pi(len(code)))[2:]
ef_code=''
for i,j in enumerate(code):
    if pi_digits[i]!=j:
        ef_code+='#'
    else:
        ef_code+='!'
run(ef_code)