SHITS
Jump to navigation
Jump to search
SHITS (Simple language witH bITS) is an esolang by User:ChuckEsoteric08 based on brainfuck minimalisations which uses binary tape.
Specification
Language uses right-infinite tape.
Commands
! - flip bit and move to the first cell
> - move right
{...} - while not zero
Optional I/O commands:
* - output bit + - input bit
Computational class
Language is Turing-complete, because it can simulate Cyclic Tag with initial string of 1:
Program start - !>>>!{
; - {>>}>>!{>>}!
0 - {>>}>{!!>>{>>}>>{>>}!>>{>>}}!{>>{>>}>!}!
1 - {>>}>{!!>>{>>}>>{>>}>!>>{>>}>>{>>}!>>{>>}}!{>>{>>}>!}!
Program end - }
It also proves that it is Turing-complete even with maximum nesting depth of 3.
Interpreter
In Python 3
def interpret_shits(program):
brackets = match_brackets(program)
if brackets is None:
raise SyntaxError("brackets are unmatched")
cells = set()
cell_pointer = 0
i = 0
while i < len(program):
c = program[i]
if c == "!":
cells ^= {cell_pointer}
cell_pointer = 0
elif c == ">":
cell_pointer += 1
elif c == "{":
if cell_pointer not in cells:
i = brackets[i]
elif c == "}":
if cell_pointer in cells:
i = brackets[i]
elif c == "*":
print("1" if cell_pointer in cells else "0", end=" ")
elif c == "+":
if input() != "0":
cells.add(cell_pointer)
elif cell_pointer in cells:
cells.remove(cell_pointer)
i += 1
def match_brackets(program):
temp = []
result = {}
for i, c in enumerate(program):
if c == "{":
temp.append(i)
elif c == "}":
if len(temp) == 0:
return None
matched = temp.pop()
result[matched] = i
result[i] = matched
return result if len(temp) == 0 else None
In CDILOI
// ! - flip bit and move to the first cell
// > - move right
// {...} - while loop
// * - output bit
// + - input bit
INP RCODE
CONC @RDATA 0! RDATA
CONC @LDATA ! LDATA
CONC ! @NEST NEST
LBL CMD
IF @RCODE @A HALT
DEL @RCODE CMD RCODE
CONC @CMD @LCODE LCODE
IF @CMD ! FLIP
IF @CMD > RIGHT
IF @CMD * OUT
IF @CMD + INP
IF @CMD { SLOOP
IF @CMD } ELOOP
IF A A CMD
LBL FLIP
DEL @RDATA BIT RDATA
IF @BIT 0 SET1
IF @BIT 1 SET0
LBL SET1
CONC 1 @RDATA RDATA
IF A A LEFT
LBL SET0
CONC 0 @RDATA RDATA
IF A A LEFT
LBL RIGHT
DEL @RDATA BIT RDATA
CONC @BIT @LDATA LDATA
IF @RDATA ! NEWR
IF A A CMD
LBL NEWR
CONC 0 @RDATA RDATA
IF A A CMD
LBL LEFT
DEL @LDATA BIT LDATA
CONC @BIT @RDATA RDATA
IF @LDATA ! CMD
IF A A LEFT
LBL OUT
DEL @RDATA BIT RDATA
CONC @BIT @RDATA RDATA
OUT @BIT
IF A A CMD
LBL INP
DEL @RDATA BIT RDATA
INP BIT
CONC @BIT @RDATA RDATA
IF A A CMD
LBL SLOOP
DEL @RDATA BIT RDATA
CONC @BIT @RDATA RDATA
IF @BIT 0 FIND}
IF A A CMD
LBL FIND}
DEL @RCODE CMD RCODE
CONC @CMD @LCODE LCODE
IF @CMD { INCNEST1
IF @CMD } DECNEST1
IF A A CMD
LBL INCNEST1
CONC * @NEST NEST
IF A A FIND}
LBL DECNEST1
IF @NEST ! CMD
DEL @NEST CMD NEST
IF A A FIND}
LBL ELOOP
DEL @RDATA BIT RDATA
CONC @BIT @RDATA RDATA
IF @BIT 1 FIND{
IF A A CMD
LBL FIND{
DEL @LCODE CMD LCODE
CONC @CMD @RCODE RCODE
IF @CMD { INCNEST2
IF @CMD } DECNEST2
IF A A CMD
LBL INCNEST2
CONC * @NEST NEST
IF A A FIND{
LBL DECNEST2
IF @NEST ! CMD
DEL @NEST CMD NEST
IF A A FIND{
LBL HALT