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++;
}
}
}
}