# 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 2022 Unknown Python `.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 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=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

2. Paste the code below into a file named `twofour.py`.
3. Make a `code.tf` file in the same directory (folder) as `twofour.py`.
4. Open "Command Prompt" app.
5. 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`.
6. 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... ')
```