Two Four
Two Four is an esoteric programming language by User:00Her0. It is named for its Four instructions, each of which are written as Two bits.
Designed by | 00Her0 |
---|---|
Appeared in | 2022 |
Computational class | Unknown |
Major implementations | Python |
File extension(s) | .tf |
Concepts
Input Layer | The input layer is a tape of 16 bits. The Bitfield becomes this when the program is run. |
SOBA | SOBA stands for Selected One Bit Accumulator. It is a position on the Bitfield. |
Bitfield | A tape of 16 bits, 0..F. Although this is 1D, it's often formatted as a 4x4 "field". |
Tapes | Programs in Two Four are written on multiple tapes. In the current interpreter, a newline represents the end of a tape. |
Instructions
"soba" refers to the position of the soba, while "mem@soba" refers to the value at the soba.
00 | if mem@soba==0, soba+=4, else, soba+=1. |
11 | mem@soba++ (equivalent to mem@soba=!mem@soba). Even, consecutive calls also do soba++. |
10 | soba=0. |
01 | if mem@soba==0, skip the rest of this tape. |
Note: white space is ignored.
Examples
Boolean Operators
"AND" program:
00 01 00 11
Explanation:
Takes two bits as input at memory 0 and 1, and writes its output to memory 2.
Input 00 or 01:
00
moves soba to 401
skips the rest of the program
Input 10:
00
moves soba to 101
skips the rest of the program
Input 11:
00
moves soba to 101
does nothing00
moves soba to 211
writes output (1)
"OR" program:
11 01 00 11 01 00 11 10 11 11 11 11 11
"NOT" program:
11
Explanation:
Takes one bit as input at memory 0, and writes its output to memory 0 (yes, the same position.)
Input 1:
11
writes 0 to memory 0
Input 0:
11
writes 1 to memory 0
Turing Completeness
Two Four is almost certainly not Turing-Complete because it has a limited amount of data storage.
Implementations
Python Interpreter
I know that Python isn't the best language for implementations because it's not as fast as, say, C derivates, but I am familiar with it, and Two Four is very simple, so take this for now. C++ interpreter coming soon! Some notes:
- There is no way to change the input layer other than to edit the
input_layer
variable. - There is a
config
variable that currently only has one value:step
. When it's true, the field prints it's value after each instruction is executed. Otherwise, the field just prints it's value after all instructions have been executed. - This code isn't the cleanest. Updates might come.
- This code removes all white space and turns newlines into
;;
. I think it still count as an interpreted language though...
# Two Four Interpreter # By 00Her0 input_layer=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] field=list(input_layer) soba=0 one_calls=0 skip=False code_path='code.tf' cd=open(code_path, 'r') code=cd.read() code=code.replace('\n',';;').replace(' ',"") #print(code) CONFIG={ "step":False } while True: for i in range(0,len(code),2): sel_token=code[i]+code[i+1] if not skip: if sel_token=='11': one_calls=one_calls+1 if one_calls%2==0: if field[soba]==1: field[soba]=0 else: field[soba]=1 soba+=1 if soba>15: soba=0 else: if field[soba]==1: field[soba]=0 else: field[soba]=1 elif sel_token=='00': one_calls=0 if field[soba]==0: for i in range(0,4): soba+=1 if soba>15: soba=0 else: soba+=1 if soba>15: soba=0 elif sel_token=='01': one_calls=0 if field[soba]==0: skip=True elif sel_token=='10': one_calls=0 soba=0 if sel_token==';;': one_calls=0 skip=False if CONFIG['step']: for i in range(0,len(field)): print(str(field[i]),end="") if (i+1)/2%2==0: print("") if (i+1)/8%2==0: print("") if not CONFIG['step']: for i in range(0,len(field)): print(str(field[i]),end="") if (i+1)/2%2==0: print("") if (i+1)/8%2==0: print("") print('***') field=list(input_layer) soba=0 one_calls=0 skip=False inp=input('Press ENTER to run again... ')
Running
Windows
- Download Python 3
- Paste the code below into a file named
twofour.py
. - Make a
code.tf
file in the same directory (folder) astwofour.py
. - Open "Command Prompt" app.
- type
cd path/to/twofour
, replacingpath/to/twofour
with your path to the folder containingtwofour.py
. Something likeC:/Users/Administrator/python_projects/twofour
. - type
py twofour.py
.
Others
Currently I don't have any instructions for running Two Four on others, but it should be fairly similar. If you have a Mac or Linux computer and don't mind writing up steps for running, please do! However, you can run it in your browser via an online python interpreter. But, you will have to use a modified interpreter. To change the Two Four code the interpreter is running you will just have to change the code
variable, since online python interpreters don't typically have support for file reading. here it is:
# Two Four Interpreter # By 00Her0 input_layer=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] field=list(input_layer) soba=0 one_calls=0 skip=False code=""" 11 00 11 00 11 """ code=code.replace('\n',';;').replace(' ',"") #print(code) CONFIG={ "step":False } while True: for i in range(0,len(code),2): sel_token=code[i]+code[i+1] if not skip: if sel_token=='11': one_calls=one_calls+1 if one_calls%2==0: if field[soba]==1: field[soba]=0 else: field[soba]=1 soba+=1 if soba>15: soba=0 else: if field[soba]==1: field[soba]=0 else: field[soba]=1 elif sel_token=='00': one_calls=0 if field[soba]==0: for i in range(0,4): soba+=1 if soba>15: soba=0 else: soba+=1 if soba>15: soba=0 elif sel_token=='01': one_calls=0 if field[soba]==0: skip=True elif sel_token=='10': one_calls=0 soba=0 if sel_token==';;': one_calls=0 skip=False if CONFIG['step']: for i in range(0,len(field)): print(str(field[i]),end="") if (i+1)/2%2==0: print("") if (i+1)/8%2==0: print("") if not CONFIG['step']: for i in range(0,len(field)): print(str(field[i]),end="") if (i+1)/2%2==0: print("") if (i+1)/8%2==0: print("") print('***') field=list(input_layer) soba=0 one_calls=0 skip=False inp=input('Press ENTER to run again... ')