$+-?

From Esolang
Jump to navigation Jump to search

$+-? is a one dimensional cell-based nearly Turing-complete programming language created by User:TheCanon2.

Commands

$+-? has two unbounded registers. $+-? has four commands.

Command Action
$ Go to the other register
+ Increment the register
- Decrement the register
? Skip an instruction if the register != 0

Additionally, $+-? accepts two characters of input at the beginning of every program. 0x0A and the EOF print the register as a Unicode character.

Lowercase letters are used as commands to jump to their uppercase counterparts.

Examples

Hello, World!

$+++++++++A?b$++++++++$-aB$
$+++C?d$++++++++++$-cD$-
+++++++

+++
$++++++++E?f$--------$-eF$---
------------
$+++++++++G?h$++++++$-gH$+
$++++++I?j$++++$-iJ$
+++
------
--------
$++++++++K?l$--------$-kL$---

Truth machine

$++++++F?p$--------$-fP$?z-?nhN$++++++Q?o$++++++++$-qO$+
-$oZ$++++++R?a$++++++++$-rA$H

Two-Time Cat

 
$

XKCD Random Number

$++++++++++A?b$+++++$-aB$++

A+B problem

$------------------------------------------------A?p-$+$aP$

Single-digit addition.

A-B problem

S$?p-$-sP++++++Q?e$++++++++$-qE$

Single-digit subtraction.

Parity calculator

$?$A?e-?o-aEC?d-cD$?p-$dP+++++++++I?j$++++++++$-iJ$---
$+++++++K?l$+++++++$-kL$
-----------------
+++++++++h
OF?g-fG$?q-$gQ++++++++M?n$++++++++++$-mN$-
$+++R?s$+++++++$-rS$
H

Calculates and prints the parity of single and double-digit numbers.

Disan Count

P?e-?o-$+$pE$-$O++++++++++++++++++++++++++++++++++++++++++++++++$-----------------------A?b$
++$-aB

Performs the Disan count for single-digit numbers. By nature of the language, a junk character is printed after every sequence. The first line is too long to be displayed correctly.

Print the Latin alphabet

$++++++++A?b$++++++++$-aB+++++++++++++++++++++++++C?d$+
$-cD$+

Print all of Unicode

A
+a

Flip input

$
$

Computational class

$+-? is nearly Turing-complete for it can simulate a two-register Minsky machine.

+ Increment a register

?a- Decrement the register unless it is equal to zero in which jump to A

However, $+-? (in its unmodified form) is not fully Turing-complete for it cannot represent algorithms that require more than 26 distinct jump commands. The interpreter may be modified to allow for diacritics stacking thereby allowing for infinitely many labels.

Relationship with Brainfuck

Although $+-? is not a Brainfuck derivative in any meaningful way, its syntax was designed with Brainfuck in mind. As such, it is possible to directly transcribe some Brainfuck programs into $+-?.

<  | $
>  | $
+  | +
-  | -
.  | (newline)
[] | A?b(code)aB

Implementations

The following Python script is an interpreter.

cell = 0
cells = [0, 0]
program = []
while True:
    line = input('>p ')
    if not line == "eof":
        program.append(line)
    else:
        program.append("")
        break
program = '\n'.join(program)
#Executes the program
Input = input('>i ')
if len(Input) > 0:
    cells[0] = ord(Input[0])
if len(Input) > 1:
    cells[1] = ord(Input[1])
inst = 0
while inst < len(program):
    if program[inst] == "$":
        cell = (cell + 1) % 2
    elif program[inst] == "+":
        cells[cell] += 1
    elif program[inst] == "-":
        cells[cell] -= 1
    elif program[inst] == "?":
        if cells[cell] != 0:
            inst += 1
    elif program[inst] == "\n":
        print(chr(cells[cell]), end="")
    elif ord(program[inst]) >= 97 and ord(program[inst]) <= 122:
        inst = program.index(chr(ord(program[inst])-32))
    else: pass
    inst += 1

The interpreter uses the symbol eof to mark the end of the program.