# Befunge

**Befunge**is a stack-based esoteric programming language which differs from conventional languages in that programs are arranged on a two-dimensional grid. 'Arrow' instructions direct the control flow to the left, right, up or down, and loops are constructed by sending the control flow in a circle.

Table of contents |

2 Sample Befunge code 3 Instructions in Befunge |

## History

The language was originally created by Chris Pressey in 1993, as an attempt to devise a language as hard to compile as possible - note that the 'p' command allows for self-modifying code. Nevertheless, a number of compilers have subsequently been written. A number of extensions to the original 'Befunge-93' specification also exist, including Funge-98, which extends the concept to an arbitrary number of dimensions and can be multithreaded, with multiple instruction pointers operating simultaneously on the same space.## Sample Befunge code

This arrow technique is demonstrated in the random number generator program below:

vv < < 2 ^ v< v13v4 ^ ^ > >?> ?>5^ v v v97v6 v v< 8 . > > ^ ^<

## Instructions in Befunge

`0-9` | Push this number on the stack |

`+` | Addition: Pop a and b, then push a+b |

`-` | Subtraction: Pop a and b, then push b-a |

`*` | Multiplication: Pop a and b, then push a*b |

`/` | Integer division: Pop a and b, then push b/a, rounded down. If a is zero, ask the user what result they want. |

`%` | Modulo: Pop a and b, then push the remainder of the integer division of b/a. If a is zero, ask the user what result they want. |

`!` | Logical NOT: Pop a value; if the value is zero, push 1, otherwise zero. |

``` | Greater than: Pop a and b, then push 1 if b>a, otherwise zero. |

`>` | Move right |

`<` | Move left |

`^` | Move up |

`v` | Move down |

`?` | Move in a random direction |

`_` | Pop a value; move right if value=0, left otherwise |

`|` | Pop a value; move down if value=0, up otherwise |

`"` | Start string mode: push each character's ASCII value all the way up to the next `"` |

`:` | Duplicate value on top of the stack |

`\\` | Swap two values on top of the stack |

`$` | Pop value from the stack |

`.` | Pop value and output as an integer |

`,` | Pop value and output as ASCII character |

`#` | Trampoline: Skip next cell |

`g` | Pop y and x, then pushes ASCII value of the character at that position in the program |

`p` | Pop y, x and v, then change the character at the position x/y in the program to the character with ASCII value v |

`&` | Ask user for a number and push it |

`~` | Ask user for a character and push ASCII value |

`@` | End program |