Qwerty Reverse Polish Notation
Jump to navigation
Jump to search
Qwerty Reverse Polish Notation is a Reverse Polish notation calculator that is designed to be generally Turing-complete. In Qwerty Reverse Polish Notation (QRPN), almost all opcodes (except literals, references, labels and variables) are as small as 1 keystroke. The opcodes are separated by space (" ").
Quick Reference
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
| ~ not | ! pop | @ getn | # putn | $ swap | % mod | ^ pow | & and | * mul | ( dec | ) inc | _ neg | + add |
| ` xor | 1 ---- | 2 ---- | 3 ---- | 4 ---- | 5 ---- | 6 ---- | 7 ---- | 8 ---- | 9 ---- | 0 ---- | - sub | = eq |
+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------+--------+--------+
| Q | W | E 10^x | R root | T atan | Y | U | I | O | P | { shl | } shr | | or |
| q | w | e exp | r sqrt | t tan | y | u | i | o | p | [ flr | ] ceil | \ roun |
+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------+--------+--------+
| A | S asin | D | F | G | H | J | K | L log | : dup | " |########|########|
| a abs | s sin | d | f | g | h | j | k | l ln | ; | ' |########|########|
+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------+--------+--------+
| Z | X | C acos | V | B | N | M max | < lt | > gt | ? rand |########|########|########|
| z | x exit | c cos | v | b bool | n | m min | , getc | . putc | / div |########|########|########|
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
Turing-Complete?
Brainfuck programs can be transformed into Qwerty RPN by using the array technique above. Here is the basic procedure of translating Brainfuck to Qwerty RPN.
The variable i tracks the program counter. The header of the code is therefore 0=i, which initializes it.
- - and +: Get the value, increase or decrease it, and write back:
$i $$ ( $i =$or$i $$ ) $i =$ - < and >: Simply decrease or increase the variable I:
$i ( =i or $i ) =i - Loops ([BODY]): Loops are transformed into goto labels, and the condition is the current memory cell. Let L be a unique label:
>L BODY $i $$ <L - I/O: , and .: , transforms into , $i =$, and . transforms into $i $$ .
See 99 bottles of beer example, translated from BF.
Examples
Ask user to input 2 numbers, and print its sum.
@ @ + #
1 @ 1 - + 9 %
Locals-based factorial
@ =value // value = input_number();
1 =result // result = 1;
$value =i // i = value;
>loop // loop:
$result $i * =result // result *= i;
$i ( =i $i // i --;
<loop // if ($i) { goto loop; }
$result // return result;
without comments:
@ =value 1 =result $value =i >loop $result $i * =result $i ( =i $i <loop $result