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.
==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 4
*01 skips the rest of the program
Input 10:
*00 moves soba to 1
*01 skips the rest of the program
Input 11:
*00 moves soba to 1
*01 does nothing
*00 moves soba to 2
*11 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) as twofour.py.
# Open "Command Prompt" app.
# type cd path/to/twofour, replacing path/to/twofour with your path to the folder containing twofour.py. Something like C:/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... ')
Category:Languages Category:Implemented Category:2022