Super Stack!

From Esolang
Jump to navigation Jump to search

Super Stack! is a stack-based esoteric programming language by User:Orange.

How programs are run

Programs consist of keywords separated by spaces, tabs, and/or newlines. There is only one stack the program can manipulate.


Instruction Description
123 Push a number onto the stack.
add Pop two numbers, add them, and push the result.
sub Pop two numbers, subtract the first from the second, and push the result.
mul Pop two numbers, multiply them, and push the result.
div Pop two numbers, divide the first from the second, and push the result.
mod Pop two numbers, perform modulus on the first and second, and push the result.
random Pop the top number, and push a random number from 0 to the number popped minus 1. So if you have the number 5 and you use random, you will get 0, 1, 2, 3, or 4.
and Pop two numbers, and them, and push the result.
or Pop two numbers, or them, and push the result.
xor Pop two numbers, xor them, and push the result.
nand Pop two numbers, nand them, and push the result.
not Pop the top number, not it, and push the result.
  • For all logic commands, 0 is false, and anything else is true (negative or positive).
  • When pushing results 1 is true and 0 is false.
output Pop the top number and output it as a number followed by a space.
input Get a single number from input and push it.
outputascii Pop the top number and output as an ascii character.
inputascii Get a string of characters from input and push each ascii character on the stack backwards, so the first letter in the string is on the top, and the last letter of the string is on the bottom.
pop Pop the top number and discard it.
swap Swap the top two numbers.
cycle Put the top number on the bottom of the stack.
rcycle Put the bottom number on the top of the stack.
dup Duplicate the top number.
rev Reverse the entire stack.
if While loop. If the top number is true, loop. Does not pop top number.
fi End loop.
quit End program.
debug Output entire stack. (Does not pop anything.)

Example Programs

Hello, World!

0 33 100 108 114 111 87 32 44 111 108 108 101 72
if outputascii fi

First, push ASCII codes onto the stack for "Hello, World!" Then while there are nonzero numbers on the stack output them.

Cat program

    if outputascii fi `output-stack
    10 outputascii


  • 1 is pushed and then a while loop is entered. The 1 makes the loop run forever.
  • 0 is pushed so we can tell when input ends.
  • Input is pushed onto the stack.
  • While the top number is not 0, pop and output number.
  • Pop the 0.
  • Push 10 and output it(new line).
  • The stack now only has the number 1 on it, so the program will loop again.

As you can see keywords can be separated by spaces or newlines.

Fibonacci sequence

0 1
    dup output
    dup cycle add
  • Push 0 and 1 on the stack to start the fib.
  • If for an infinite loop.
  • Output the top of stack.
  • Dup top number then put it on the back of the stack.
  • Add the top two.
  • Loop. Top of the stack will always be more than 0.

Guess the pass code

58 101 100 111 67 32
115 115 97 80 32
114 101 116 110 69
if outputascii fi pop


`compare each letter
109 sub
not if pop
97 sub
not if pop
114 sub
not if pop
115 sub
not if pop
104 sub
not if pop
	100 101 116 110 97 114 71 32
	115 115 101 99 99 65
	if outputascii fi pop
fi fi fi fi fi

71 78 79 82 87
if outputascii fi pop

A little game. Guess what the password is.


The stupid fizzbuzz problem.

    dup 101 add
    dup output
    dup 3 mod
    not if
        0 122 122 105 102 `fizz
        if outputascii fi pop
    fi pop
    dup 5 mod
    not if
        0 122 122 117 98 `buzz
        if outputascii fi pop
    fi pop
    10 outputascii `newline
    1 add


Simple chat bot

1 if pop
   0 58 116 117 112 110 105
   if outputascii fi pop
   inputascii 0
   5 random
   if pop
       cycle if cycle fi
   0 fi pop
   0 58 116 117 112 116 117 111
   if outputascii fi pop
   cycle if dup outputascii cycle fi
   10 outputascii
1 fi

First the program gets a string inputted onto the stack. Strings are represented by a 0 and then a series of characters that lead up to the next string. After the input, we randomly cycle from string to string. Then, we output the string and loop the program.


Computational Class

Super Stack! is Turing-complete. Its only data structure is actually more "powerful" than a simple stack, due to commands instructions like cycle and rcycle. It is easy to transpose any given brainfuck into an equivalent Super Stack! program, for instance using the following algorithm:

  • Begin the program with the code -1 0.
  • Replace every brainfuck instruction by the matching Super Stack! instruction sequence in the conversion table below:
brainfuck Super Stack!
> cycle dup 1 add not if 0 swap not fi pop
< rcycle dup 1 add not if not swap cycle dup fi pop
+ 254 sub if 255 add fi
- dup not if swap 255 add swap not fi pop 1 sub
. dup outputascii
, pop inputascii
[ if
] fi

Note that this conversion is far from being efficient; its only purpose is to prove that Super Stack! is brainfuck-equivalent. It emulates an infinite tape, navigating with cycle and rcycle, pushing an extra 0 every time -1 is on top. It is assumed that the tape is right- and left-infinite and that brainfuck cells contain numbers between 0 and 255, with wrapping for + and -. It is also assumed that inputascii reads one character only, which may be slightly inconsistent with the specifications above.