golfuck
Jump to navigation
Jump to search
golfuck is an extension of brainfuck invented by User:A. It is created in order to write short programs. In addition to brainfuck, golfuck adds a stack.
Commands added(still extending)
{}:repeat while the top of the stack is not "0". $:starts an infinite loop %:ends an infinite loop : input a string and push it into the stack. ; output the top of the stack. ' output the whole line. This command is specifically for printing hello, world. It will only execute after every other code is executed. ! pop the stack * duplicate the top of the stack | set the current pointing byte as the top of the stack ^ pop the top value of the stack to the current pointing byte @ push the current pointing value into the stack ` swap 2 top elements ? concentrates the top 2 elements of the stack if the two elements are strings; add them if they are integers. # execute the top element of the stack as the program, then pop the stack (x) push the string x into the stack r replace all the *s in a string, and all the **s as *. "" replace the output using regular expressions. E.g. "a,"+1",b" finds "a", sets the replacing at one character behind, and replaces the characters equal length as the first search as "b". 9 prints the 99 bottles of beer lyrics.
Example programs
Hello, world!
'Hello, world!
Cat program
$:;%
Quine(Directly translated from GolfScript)
(*#)*#
Truth-machine
:{;};
99 bottles of beer program
(* bottles of beer on the wall, * bottles of beer. Take one down and pass it around,) (* bottles of beer on the wall.)(99)=|![`*r;!-`*r;!]"1,"+9",""0,"+0",no more"
Another cheating way:
9
Computational class
golfuck is Turing-complete, as it can be shown to be computationally equivalent to Underload: the golfuck commands `*!?()#
correspond to the TC subset of Underload commands ~:!*()^
.
Partial implementation in C++
Temporarily written here because it is short. This is a part of it with the brainfuck commands and the commands (, ), ', *, ":" and ";" .
#include<stdio.h> #include<string> #include<iostream> #include<stack> #include<stdlib.h> using namespace std; int c,d[999999],a[999999],i,p,l,it;//c:char; d:code; a:array; i:iterator; p:pointer; l:level //it: int temp stack<string> s; //s:stack string t,t2; int main(int j,char *k[]){//j:argc; k:argv ios::sync_with_stdio(false);//make it faster FILE *f=fopen(k[1],"r"); for(;(c=fgetc(f))!=EOF;i++)d[i]=c; for(i=0;d[i]>0;i++){ if(d[i]==43)a[p]++;//+ if(d[i]==45)a[p]--;//- if(d[i]==62)p++;//> if(d[i]==60)p--;//< if(d[i]==46)putchar(a[p]);//. if(d[i]==44)a[p]=getchar();//, if(d[i]==91&&!a[p])//[ for(l=0;i++;){ if(d[i]==93&&!l)break; if(d[i]==91)l++; if(d[i]==93)l--; }//] if(d[i]==93&&a[p]) for(l=0;i--;){ if(d[i]==91&&!l)break; if(d[i]==93)l++; if(d[i]==91)l--; } if(d[i]=='%') while(d[i]!='$')i--; if(d[i]==':') cin>>t; s.push(t); if(d[i]==';') cout<<s.top(); if(d[i]=='\'') { i++; while(d[i]!='\n') { printf("%c",d[i]); i++; if(d[i]=='\0')break; } } if(d[i]=='*') s.push(s.top()); if(d[i]=='(') { i++; int le=0,n=0; while(d[i]!=')'||le!=0) { if(d[i]=='(') { t+="("; le++; } else if(d[i]==')') { t+=")"; le--; } else t+=d[i]; i++; } } } }