We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.

Yurt

From Esolang
Jump to navigation Jump to search

Yurt is an esolang created by User:ChuckEsoteric08 which is a variation of Minsky machine and Incrementing machine and inspired by the fact that many similar languages to it (See "See also" section) had nested if statements and Yurt was made as a variation without them

Description

Yurt works on a tape with finite amount of unsigned and unbounded cells (but 8 cells are enough, as seen in the proof). Program, which is in an implicit infinite loop, is made out of one-character instructions:

  • ! - increment current cell
  • \ - move tape pointer to the right once, if on the last cell it wraps around to the first
  • {...} - if current cell is equal to the next cell do the code in the brackets, else skip it. As noted before it can't be nested

Three-symbol version

Because of the fact that nested ifs aren't possible start and end of a statement can be represented as one character:

  • |...|

Computational class

Yurt is Turing-complete with the tape of 8 cells, to show that we will provide a proof by translating a variant of Minsky machine called Wheel Minsky Machine (same that was used for Needle's proof) into it:

Wheel Minsky machine

Language has 2 registers: A and B. Programs are inside an infinite loop.

INC x y

Increment x and move y commands forward.

DEC x y

Decrement x (if 0 do nothing) and move y commands forward.

IF x y

If x is 0 move y commands forward, else execute next one.

JMP x

Jumps x commands forward. Halting the program can be simulated by replacing x with the length of a program

Building blocks

We will use some shorthands for each piece of code to shorten our translation:

LEFT = \\\\ \\\
+a = +
-a = \+ LEFT
+b = \\+ LEFT LEFT
-b = \\\+ LEFT LEFT LEFT
+c = \\\\+ LEFT LEFT LEFT LEFT
-c = \\\\\+ LEFT LEFT LEFT LEFT LEFT
+d = \\\\\\+ LEFT LEFT LEFT LEFT LEFT LEFT
-d = \\\\\\\+ LEFT LEFT LEFT LEFT LEFT LEFT LEFT
a( ... ) = { ... }
b( ... ) = \\ { LEFT LEFT ... \\ } LEFT LEFT
c( ... ) = \\\\ { LEFT LEFT LEFT LEFT ... \\\\ } LEFT LEFT LEFT LEFT
d( ... ) = \\\\\\ { LEFT LEFT LEFT LEFT LEFT LEFT ... \\\\\\ } LEFT LEFT LEFT LEFT LEFT LEFT

And also:

[x;y] - command x written y times

WMM to Yurt

After making our building blocks it is trivial to translate each instruction (see note for instrictions at the start of a program):

  • INC A y:
-c c( +a [+c;y] )
  • INC B y:
-c c( +b [+c;y] )
  • DEC A y:
-c c( -a [+c;y] )
  • DEC B y:
-c c( -b [+c;y] )
  • IF A y
-c +d +d c( +c -d ) a( -d ) d( [+c;y-1] +d ) -d d( +d ) -d
  • IF B y
-c +d +d c( +c -d ) b( -d ) d( [+c;y-1] +d ) -d d( +d ) -d
  • JMP x
-c c( [+c;y] )

Note about the first instruction

As you can see all command translations start with -c but when it is the start of a program it could lead to unwanted results. As such first translated instruction does not have it and after the last command translated -c is put.

See also