Stroke+-, also +{/|\}-
, is an esoteric structured programming language.
With only four instructions, it aims to be the simplest Turing-complete structured programming language possible.
It uses conditional loops and an unbounded number of non-negative integer variables along with manipulation of their values.
Stroke+- is an extension of Stroke that is even simpler but at the cost of sacrificing Turing completeness.
Stroke+- code consists of stroke symbols /
, |
, \
, and arithmetic signs +
, -
.
All other symbols are ignored.
Instr | Name | Meaning |
---|---|---|
+var |
Increment | Increments the value of the variable |
-var |
Decrement | Decrements the value of the variable |
/var |
Loop start | Enters a new loop if the variable is non-zero |
\ |
Loop end | Jumps back to the matching loop start |
The example code in Stroke+-:
+ |
/ |
- |
+ ||
\
+ |||
can be translated into the following pseudocode:
inc var0
while var0
dec var0
inc var1
inc var2
Optionally, the instruction for output !
may be implemented.
A Stroke+- program runs on a theoretically infinite tape of non-negative integer cells that are randomly accessible via variables denoted by consecutive vertical stroke symbols (|
) in unary form starting from zero. For instance, |
refers to the variable indexed by 0, ||
refers to the variable indexed by 1, |||
refers to the variable indexed by 2, and so on.
(White spaces are added only for the sake of readability.)
The simplest program is the empty program:
As variable 0 is never reset, the program loops forever:
+ | / | \
Moves the value in variable 0 to 1:
MOV 0 1:
/ |
- | dec 0
+ || inc 1
\
Copies the value in variable 0 to 1 using 2 as an auxiliary:
CPY 0 1:
/ |
- | dec 0
+ || inc 1
+ ||| inc 2
\
/ |||
- ||| dec 2
+ | inc 0
\
Sets the value of variable 0 to zero:
CLR 0:
/ |
- |
\
Adds the values in 0 and 1 to 0:
ADD 0 1:
/ ||
- ||
+ |
\
Conditional branching (IF) can be simulated via loops:
IF 0:
CPY 0 2 aux 2
/ |||
/ ||| - ||| \ clr aux 2
do something conditionally...
\
Computes the Fibonacci sequence in 0 using 1 and 2 as auxiliaries:
FIB:
+ |||||
/ ||||| forever
MOV 1 2
MOV 0 1
CPY 2 0
ADD 1 2
\
For computing "Hello World" the numeric values must interpreted as a string. It can achieved by defining a binary alphabet:
Symbol | Binary |
---|---|
|
000 |
d |
001 |
e |
010 |
H |
011 |
l |
100 |
o |
101 |
r |
110 |
W |
111 |
The binary number 011010100100101000111101110100001
then corresponds to "Hello World".
To be concise, eight variables can be used and concatenated to represent the output.
They must contain values 00011
, 01010
, 01001
, 01000
, 11110
, 11101
, 00001
:
+ | + | + |
+ || + || + || + || + || + || + || + || + || + ||
+ ||| + ||| + ||| + ||| + ||| + ||| + ||| + ||| + |||
+ |||| + |||| + |||| + |||| + |||| + |||| + |||| + ||||
+ ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + |||||
+ |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + ||||||
+ |||||||
Stroke+- is Turing complete according to the structured program theorem, as conditional branching (selection) can easily be simulated via loops.
npm i strokepm
const strokepm = require('strokepm')
strokepm('+|/|-|+||\\+|||') // [0, 1, 1]