Brainf**k is the most famous esoteric programming language and is the inspiration for hundreds of other esoteric languages. In fact, there are quite a few languages that are so heavily based off of Brainf**k that the only difference is the characters used. Your challenge is to interpret one of these languages.
Brainf**k
Brainf**k uses these commands:
> Move pointer to the right
< Move pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Trivial Brainf**k Substitution
There are lots of esolangs that are identical to Brainf**k in that they use the same commands, just with different characters/strings signaling the commands. For example, take Ook!:
Brainf**k | Ook | Command
-----------------------------------------------------
> | Ook. Ook? | Move the pointer to the right
< | Ook? Ook. | Move the pointer to the left
+ | Ook. Ook. | Increment the memory cell under the pointer
- | Ook! Ook! | Decrement the memory cell under the pointer
. | Ook! Ook. | Output the character signified by the cell at the pointer
, | Ook. Ook! | Input a character and store it in the cell at the pointer
[ | Ook! Ook? | Jump past the matching Ook? Ook! if the cell under the pointer is 0
] | Ook? Ook! | Jump back to the matching Ook! Ook? if the cell under the pointer is nonzero
Ook is exactly like Brainf**k, except for the syntax.
TrivialBrainfuckSubstitution
is a function defined as:
TrivialBrainfuckSubstitution(string1, string2, string3, string4, string5, string6, string7, string8)
Each string provided substitutes the corresponding Brainf**k character - so string1
will be a substitution for >
, string2
will be a substitution for <
, so on and so forth.
For example, Ook! is equivalent to TrivialBrainfuckSubstitution("Ook. Ook?", "Ook? Ook.", "Ook. Ook.", "Ook! Ook!", "Ook! Ook.", "Ook. Ook!", "Ook! Ook?", "Ook? Ook!")
.
Alphuck is equivalent to TrivialBrainfuckSubstitution("a", "c", "e", "i", "j", "o", "p", "s")
.
The challenge
Implement TrivialBrainfuckSubstitution
.
To elaborate: Given eight strings representing the eight substitutions and a ninth string representing a program, interpret the program as a trivial Brainf** substitution.
Rules
TrivialBrainfuckSubstitution
may take function arguments or command line arguments. These are the only ways it may take the first eight arguments.TrivialBrainfuckSubstitution
can take the ninth argument from standard input, a file, or a literal ninth argument.TrivialBrainfuckSubstitution
must be able to take any ASCII characters as substitutions. It does not have to handle Unicode, and you can assume there are no duplicate elements provided.- Note that the actual function in your code need not be named
TrivialBrainfuckSubstitution
. This is just the title of the function; the actual name in the code can bef
, orx
, or a lambda, or whatever you like. - Your interpreter should not require any spaces between command substitutions. However, it should not break if they are present. To rephrase, it should ignore unrecognized commands, just like normal Brainf**k.
- You may assume that all substitutions are the same length. I.e. you may assume that
AB
,A
, andB
are never in the same substitution set.
Challenge-specific Brainf**k semantics
In your newly-created Brainf**k language:
- You do not need to be able to go left from the start of the tape. (You can choose to allow this.)
- The tape should have a minimum length of 30000. (If you want it can be longer or allocated dynamically.)
- The maximum value of the tape elements must be the maximum value for an integer in your (host) language.
- Input can be read from standard input or a file.
- An attempt to read
EOF
(End Of File) should not cause any undefined behavior.EOF
must simply be stored as would any other character read.
Test cases
Winner
As with code-golf, the shortest submission wins. I won't ever accept an answer unless one is 50 bytes shorter than all others.
Also, as this challenge is somewhat more difficult than others (while certainly not the hardest), I kindly ask that you include an ungolfed version and explanation with your answer.
Challenge-specific Brainf**k semantics
? And if nothing of substance was added, then why are there hundreds of languages based off Brainf**k, that plenty of people use? \$\endgroup\$