Esolang Interpreters #2 - Custom Smallfuck Interpreter
Description:
Esolang Interpreters #2 - Custom Smallfuck Interpreter
About this Kata Series
"Esolang Interpreters" is a Kata Series that originally began as three separate, independent esolang interpreter Kata authored by @donaldsebleung which all shared a similar format and were all somewhat inter-related. Under the influence of a fellow Codewarrior, these three high-level inter-related Kata gradually evolved into what is known today as the "Esolang Interpreters" series.
This series is a high-level Kata Series designed to challenge the minds of bright and daring programmers by implementing interpreters for various esoteric programming languages/Esolangs, mainly Brainfuck derivatives but not limited to them, given a certain specification for a certain Esolang. Perhaps the only exception to this rule is the very first Kata in this Series which is intended as an introduction/taster to the world of esoteric programming languages and writing interpreters for them.
The Language
Smallfuck is an esoteric programming language/Esolang invented in 2002 which is a sized-down variant of the famous Brainfuck Esolang. Key differences include:
- Smallfuck operates only on bits as opposed to bytes
- It has a limited data storage which varies from implementation to implementation depending on the size of the tape
- It does not define input or output - the "input" is encoded in the initial state of the data storage (tape) and the "output" should be decoded in the final state of the data storage (tape)
Here are a list of commands in Smallfuck:
>
- Move pointer to the right (by 1 cell)<
- Move pointer to the left (by 1 cell)*
- Flip the bit at the current cell[
- Jump past matching]
if value at current cell is0
]
- Jump back to matching[
(if value at current cell is nonzero)
As opposed to Brainfuck where a program terminates only when all of the commands in the program have been considered (left to right), Smallfuck terminates when any of the two conditions mentioned below become true:
- All commands have been considered from left to right
- The pointer goes out-of-bounds (i.e. if it moves to the left of the first cell or to the right of the last cell of the tape)
Smallfuck is considered to be Turing-complete if and only if it had a tape of infinite length; however, since the length of the tape is always defined as finite (as the interpreter cannot return a tape of infinite length), its computational class is of bounded-storage machines with bounded input.
More information on this Esolang can be found here.
The Task
Implement a custom Smallfuck interpreter interpreter()
(interpreter
in Haskell and F#, Interpreter
in C#, custom_small_fuck:interpreter/2
in Erlang) which accepts the following arguments:
code
- Required. The Smallfuck program to be executed, passed in as a string. May contain non-command characters. Your interpreter should simply ignore any non-command characters.tape
- Required. The initial state of the data storage (tape), passed in as a string. For example, if the string"00101100"
is passed in then it should translate to something of this form within your interpreter:[0, 0, 1, 0, 1, 1, 0, 0]
. You may assume that all input strings fortape
will be non-empty and will only contain"0"
s and"1"
s.
Your interpreter should return the final state of the data storage (tape) as a string in the same format that it was passed in. For example, if the tape in your interpreter ends up being [1, 1, 1, 1, 1]
then return the string "11111"
.
NOTE: The pointer of the interpreter always starts from the first (leftmost) cell of the tape, same as in Brainfuck.
Good luck :D
Kata in this Series
- Esolang Interpreters #1 - Introduction to Esolangs and My First Interpreter (MiniStringFuck)
- Esolang Interpreters #2 - Custom Smallfuck Interpreter
- Esolang Interpreters #3 - Custom Paintfuck Interpreter
- Esolang Interpreters #4 - Boolfuck Interpreter
Similar Kata:
Stats:
Created | Dec 31, 2016 |
Published | Dec 31, 2016 |
Warriors Trained | 21485 |
Total Skips | 9933 |
Total Code Submissions | 79956 |
Total Times Completed | 4017 |
JavaScript Completions | 792 |
PHP Completions | 195 |
TypeScript Completions | 202 |
Python Completions | 1208 |
Java Completions | 466 |
Ruby Completions | 133 |
Go Completions | 236 |
Swift Completions | 72 |
Haskell Completions | 142 |
Lua Completions | 90 |
C# Completions | 327 |
F# Completions | 38 |
Erlang Completions | 35 |
C++ Completions | 254 |
COBOL Completions | 5 |
Total Stars | 477 |
% of votes with a positive feedback rating | 94% of 935 |
Total "Very Satisfied" Votes | 845 |
Total "Somewhat Satisfied" Votes | 73 |
Total "Not Satisfied" Votes | 17 |
Total Rank Assessments | 8 |
Average Assessed Rank | 4 kyu |
Highest Assessed Rank | 4 kyu |
Lowest Assessed Rank | 5 kyu |