2D-Reverse

From Esolang
Jump to: navigation, search

2D-Reverse is a esoteric programming language invented by User:Zzo38. It is a reversible programming language. There are 2 memory-spaces, which are 2D infinite in all directions, and the value of each is 2 integers, a horizontal value and vertical value (it can be represented by a ordered pair or a complex number), all values are starting at zero. Each memory space has its own pointer. There is also 1 program pointer that can be in one space in the program, and a direction (N, S, E, W). It starts at the $ and going east. The program pointer will wrap around the program area.

Commands

  • \ or / = Program pointer reflects off of the mirror.
  • 1 = Move first memory pointer in same direction as program pointer is moving.
  • 2 = Move second memory pointer in same direction as program pointer is moving.
  • $ = Program starts here.
  • @ = Program can end here.
  • s = Swap values at first memory pointer and second memory pointer.
  • X = Acts as / if value at first memory pointer (both horizontal and vertical) is zero, or \ if is non-zero.
  • + = Value at first memory pointer is adjusted 1 space by direction of program pointer. (Ex: (0,0) W = (-1,0) and (6,7) N = (6,8))
  • = = Horizontal value of value at first memory pointer is XORed by horizontal value of value at second memory pointer.
  • x = Acts as \ if horizontal value at first memory pointer is zero, or / if is non-zero.
  • C = If program pointer east, then value at first memory pointer is rotated clockwise (as a complex number: multiply by -i), if program pointer west, then value at first memory pointer is rotated counter-clockwise (as a complex number: multiply by +i), if north or south then it does nothing.
  • . or space = Does nothing.
  • ; = Program pointer jumps to next command past next ; in same direction as it is moving. If there isn't any, then it wraps around the program area to the next ; command.

Examples

If value at pointer is (1,0) or (0,0), it will switch the value:

 /+X+\
$X \..@
 \.../

Move memory pointer right

$1@

Move memory pointer left

 /.\
$\1\@
 \./

Loop while not zero (put inside-loop code at * and extend the other lines with periods or spaces to match the length):

      /.2*.\
      =    .
$2s+s=X....x=2@
      \..../

I believe this makes it Turing-complete.