Goldfuck

From Esolang
Jump to navigation Jump to search

Goldfuck is a derivative of !!Fuck created by User:None1

Syntax

Any Goldfuck program is the golden ratio (or "phi") recited, with wrong digits.

Starting from the digit after the decimal point, a correct digit stands for ! in !!Fuck, while a wrong digit stands for a # in !!Fuck.

Since ! appears more frequently than # in !!Fuck, you can hide any !!Fuck program in a Goldfuck program.

Hint: You can use this program in Brainfuck to generate the digits in the golden ratio.

Example Programs

To make it easy to compare with the golden ratio, here is the correct golden ratio.

1.618033988749894848204586834365638117720309179805762862135448622705
26046281890244970720720418939113748475408807538689175212663386222353
69317931800607667263544333890865959395829056383226613199282902678806
75208766892501711696207032221043216269548626296313614438149758701220
34080588795445474924618569536486444924104432077134494704956584678850
98743394422125448770664780915884607499887124007652170575179788341662
56249407589069704000281210427621771117778053153171410117046665991466
97987317613560067087480710131795236894275219484353056783002287856997
82977834784587822891109762500302696156170025046433824377648610283

Hello World

1.6180339787498948482645868343756381177203391798027628625354486227057604628179024497072052041893961374847560880753838917501266338622233369317934800607667269544333090865989395820056383226613599282902678876752087668922017115962076322212432162691486262963136244381197587012303408058870544547498461856959648644491410443207723449440495658467185098743399422126448770664760915888607499987124037652177575179785341662562424075893697040042812104276517711077780431531314101970466059914669792731762356006708758071018179523489427521942435305478300228985699782971

The same program with wraps (wraps are not allowed in Goldfuck because programs in this esolang can only have numbers and a decimal point):

1.6180339787498948482645868343756381177203391798027628625354486
227057604628179024497072052041893961374847560880753838917501266
338622233369317934800607667269544333090865989395820056383226613
599282902678876752087668922017115962076322212432162691486262963
136244381197587012303408058870544547498461856959648644491410443
207723449440495658467185098743399422126448770664760915888607499
987124037652177575179785341662562424075893697040042812104276517
711077780431531314101970466059914669792731762356006708758071018
179523489427521942435305478300228985699782971

Cat Program

1.6180339880498948482025868343656371177203090798057628601354486227055

Truth Machine

1.61803998874489484920458683466563811772130917980576486213544862070526046181890944970726720418839113738475408407538189175212663346222373693179308006076672638443338608659573958294563832266133992829126788037520876689253171163620703222107321626954852629631361448

The same program with wraps:

1.6180399887448948492045868346656381177213091798057648621354486207
052604618189094497072672041883911373847540840753818917521266334622
237369317930800607667263844333860865957395829456383226613399282912
6788037520876689253171163620703222107321626954852629631361448

Turing Completeness

It is Turing complete because !!Fuck is.

Interpreter

Interpreter in Python, requires the bigfloat package for arbitrary precision decimal.

from bigfloat import *
import sys
def bf(code):
    s=[]
    matches={}
    tape=[0]*1000000
    for i,j in enumerate(code):
        if j=='[':
            s.append(i)
        if j==']':
            m=s.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]==',':
            c=sys.stdin.read(1)
            tape[p]=(ord(c) if c else 0)%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))
def compute_phi(p): # phi computing function, unsure about precision
    num1,den1,prenum1,preden1,num2,den2=1,1,0,1,1,10**p
    while abs((num1*preden1-prenum1*den1)*den2)>=num2*den1*preden1:
        num1,den1,prenum1,preden1=den1+num1,num1,num1,den1
    with precision((p+20)*4):
        x=BigFloat.exact(num1)/BigFloat.exact(den1)
        return str(x)[2:p+2]

def goldfuck(code):
    if not code.replace('.','').isdigit() or code.count('.')!=1: # Verify syntax
        raise SyntaxError('Invalid syntax')
    code=code[2:]
    phi=compute_phi(len(code))
    fuck=''
    for i,j in enumerate(code):
        if phi[i]==j:
            fuck+='!'
        else:
            fuck+='#'
    run(fuck)
goldfuck(input())

See also

  • Pi, encodes brainfuck programs in π.
  • BrainPi, an esolang similar to this one created by the same author on the Pi day.