https://github.com/rohitpaulk/befunge-ruby
A befunge interpreter written in Ruby
https://github.com/rohitpaulk/befunge-ruby
interpreter readability ruby rubygem
Last synced: 11 months ago
JSON representation
A befunge interpreter written in Ruby
- Host: GitHub
- URL: https://github.com/rohitpaulk/befunge-ruby
- Owner: rohitpaulk
- License: mit
- Created: 2016-03-12T06:59:41.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2017-05-02T17:07:45.000Z (about 9 years ago)
- Last Synced: 2025-06-28T12:09:36.438Z (12 months ago)
- Topics: interpreter, readability, ruby, rubygem
- Language: Ruby
- Homepage: http://www.rubydoc.info/github/rohitpaulk/befunge-ruby/master
- Size: 12.7 KB
- Stars: 2
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# Befunger
Befunge (without the 'r' at the end!) is a two-dimensional esoteric programming language invented in 1993 by Chris Pressey with the goal of being as difficult to compile as possible. (Source: [esolangs.org](https://esolangs.org/wiki/Befunge))
Befunger is an interpreter for Befunge written in Ruby. I wrote this as an answer to [this Kata on codewars](https://www.codewars.com/kata/befunge-interpreter).
### Installation
Add this line to your application's Gemfile:
```ruby
gem 'befunger'
```
And then execute:
$ bundle install
Or install it yourself as:
$ gem install befunger
## Usage
```
require 'befunger'
Befunge.run(code)
```
## Specification
This is the [original problem statement](https://www.codewars.com/kata/befunge-interpreter) I wrote this for:
Your task is to write a method which will interpret Befunge-93 code! Befunge-93 is a language in which the code is presented not as a series of instructions, but as instructions scattered on a 2D plane; your pointer starts at the top-left corner and defaults to moving right through the code. Note that the instruction pointer wraps around the screen! There is a singular stack which we will assume is unbounded and only contain integers. While Befunge-93 code is supposed to be restricted to 80x25, you need not be concerned with code size. Befunge-93 supports the following instructions
- `0-9` Push this number onto 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, push zero.
- `%` Modulo: Pop a and b, then push the b%a. If a is zero, push zero.
- `!` Logical NOT: Pop a value. If the value is zero, push 1; otherwise, push zero.
- `` ` `` Greater than: Pop a and b, then push 1 if b>a, otherwise push zero.
- `>` Start moving right.
- `<` Start moving left.
- `^` Start moving up.
- `v` Start moving down.
- `?` Start moving in a random cardinal 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. If there is nothing on top of the stack, push a 0.
- `\` Swap two values on top of the stack. If there is only one value, pretend there is an extra 0 on bottom of the stack.
- `$` Pop value from the stack and discard it.
- `.` Pop value and output as an integer.
- `,` Pop value and output the ASCII character represented by the integer code that is stored in the value.
- `#` Trampoline: Skip next cell.
- `p` A "put" call (a way to store a value for later use). Pop y, x and v, then change the character at the position (x,y) in the program to the character with ASCII value v.
- `g` A "get" call (a way to retrieve data in storage). Pop y and x, then push ASCII value of the character at that position in the program.
- `@` End program.
- ` ` (i.e. a space) No-op. Does nothing.
Here's an example:
```
>987v>.v
v456< :
>321 ^ _@
```
will create the output `123456789`.
## Development
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/rohitpaulk/befunge-ruby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).