O_o
O_o is a brainfuck derivative by User:BoundedBeans that formats its code like elongated eyebrow raise emojis. It is mostly equivalent to brainfuck, except that it has a stack for each tape cell.
Encoding
- Start with brainfuck instructions.
- Assign them to binary according to this:
>
⇒000
<
⇒001
+
⇒010
-
⇒011
.
⇒100
,
⇒101
[
⇒110
]
⇒111
- Concatenate 2 instructions along with binary value of instruction *I (we'll get to *I later)
- Take the resulting 8 bits and split into two halves.
- For the first half, convert into unary with symbol
O
and add one extra symbol. - Concatenate the resulting string with
_
. - For the second half, convert into unary with symbol
o
and add one extra symbol. - Concatenate the two halves.
- Add newline.
- Repeat for every pair of instructions.
Now you have a line of O_o, representing 2 brainf*** commands and two extra bits. Those extra bits are the value of *I.
Also, on the left half of capital O's, there can be a digit 0 to make no commands, allowing *I to be executed on an odd instruction, and allowing odd numbers of instructions in a program. This will use a different unary format on the right, where it will be a 5-bit number in unary containing the command and *I. This is because the instructions are split between the two sides in weird ways.
*I
So what is *I? Well, it's an extra command. It's represented by two bits.
O_o has a stack for every cell, and *I manipulates it.
Here are the commands of *I:
Binary code | Stack operation |
---|---|
00
|
Nothing |
01
|
Push the value of the current cell to the current stack |
10
|
Pop into the cell |
11
|
Pop the top element off of the currently pointed stack, and push it to the stack of the cell to the right of the pointer. |
The stack is treated as 0 if popped when there is nothing; an error should not be thrown. This can be used to pop until the stack is empty by using the not 0 loop.
Examples
Cat
OOOOOOOOOOOO_ooooooooo OOOOOOOOOO_ooooo 0_ooooooooooooooooooooooooooooo
Hello world
O_ooooooooo OOOOO_ooooooooo OOOOO_ooooooooo OOOOO_ooooooooo OOOOOO_ooooooooo OOOOOOO_ooooo OOOOO_ooooooooo OOOOO_ooooooooo OOOOO_ooooooooo OOOOO_ooooooooo OOOOO_o OOOOOOOOOOOOOOO_ooooo OOOOOOOOO_o O_ooooooooo O_ooooooooooooo OOOOOOOOOOOOO_ooooooooo OOOOOOOOOOOOOOO_ooooooooo OOOOO_o OOOOO_ooooooooo O_ooooooooo OOOOO_ooooooooo OOOOOOOOOOOOO_o OOOOOOOOOOOOO_ooooooooooooo O_ooooooooo OOOOO_ooooooooo OOO_ooooo OOOOO_ooooooooo OOOOO_o OOOOOOOOOOOOOOO_ooooo OOOO_ooooooooooooo O_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOOOO_o OOOOOOO_o OOOOO_ooooooooo OOOOOO_o OOOOOOOOO_ooooooooo OOOOO_ooooooooo OOOOOOOOO_o OOOOOOOO_o OOO_ooooo OOOOOO_ooooooooo OO_ooooooooo OOOOO_o OOOOOO_ooooooooooooo O_o OOOOOOOOOOOOOOO_ooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOOOO_o OO_o OOOOO_ooooooooo OOOOOO_o OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOO_ooooooooooooo OOOOOOOO_o O_ooooooooo OOOOOOOOO_o OOOOOO_o
Interpreter
- Common Lisp implementation of the O_o programming language. The program embraces, besides the interpreter, an encoder, as well as a brainfuck-to-O_o converter.