New page wikitext, after the edit (new_wikitext) | '{{Distinguish/Confusion|8}}
:''Note that 81 is always italicized.''
{{infobox proglang
|name=''81''
|paradigms=Imperative
|author=[[User:Waffelz]]
|year=[[:Category:2025|2025]]
|memsys=[[:Category:Cell-based|Cell-based]]
|dimensions=one-dimensional
|class=[[:Category:Turing complete|Turing complete]]
|files=<code>*.81</code>
}}
== About ==
''81'' is an esolang created by [[User:Waffelz|waffelz]] during class because he was bored. It is entirely based on base-81 literals, whose digits are listed in the table below:
{|class=wikitable style="font-family: Monospace; font-size: 12px"
|- style="background: black; color: white"; align="center"
| || X0 || X1 || X2 || X3 || X4 || X5 || X6 || X7 || X8 || X9
|- align="center"
| style="background: black; color: white" | 0X || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9
|- align="center"
| style="background: black; color: white" | 1X || A || B || C || D || E || F || G || H || I || J
|- align="center"
| style="background: black; color: white" | 2X || K || L || M || N || O || P || Q || R || S || T
|- align="center"
| style="background: black; color: white" | 3X || U || V || W || X || Y || Z || a || b || c || d
|- align="center"
| style="background: black; color: white" | 4X || e || f || g || h || i || j || k || l || m || n
|- align="center"
| style="background: black; color: white" | 5X || o || p || q || r || s || t || u || v || w || x
|- align="center"
| style="background: black; color: white" | 6X || y || z || ! || @ || # || $ || % || ^ || & || *
|- align="center"
| style="background: black; color: white" | 7X || + || / || | || \ || < || > || ~ || ` || ? || =
|- align="center"
| style="background: black; color: white" | 8X || _ || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" |
|}
In ''81'' code, number literals are surrounded in brackets (<code>[...]</code>), and memory addresses are surrounded in braces (<code>{...}</code>). It has a set of 28 opcodes, which are Turing-complete.
== Memory ==
There are 43,046,721 memory cells, indexed from [0] to [ _ _ _ ], all initialized as 0. They can store integers from 0–15,009,4635,296,999,120, or [0] to [ _ _ _ _ _ _ _ _ ]. It has built-in 5 registers — an accumulator (<code>A</code>), 3 general-purpose registers (<code>RX</code>/<code>RY</code>/<code>RZ</code>), and an overflow flag (<code>V</code>).
== Commands ==
''(<code>M1</code>/<code>M2</code> represent arbitrary memory addresses, <code>C1</code>/<code>C2</code> represent arbitrary number literals, and <code>label</code> represents an arbitrary label.)''
{|class=wikitable
|-
| style="font-family: Monospace; font-size: 12px" | CPY C1 M1 || Copies the value of C1 to M1.
|-
| style="font-family: Monospace; font-size: 12px" | INC M1 || Increment the value of M1.
|-
| style="font-family: Monospace; font-size: 12px" | DEC M1 || Decrement the value of M1.
|-
| style="font-family: Monospace; font-size: 12px" | ADD C1 C2 || Add the values of C1 and C2 and store it in the accumulator.
|-
| style="font-family: Monospace; font-size: 12px" | SUB C1 C2 || Subtract the values of C1 and C2 and store it in the accumulator.
|-
| style="font-family: Monospace; font-size: 12px" | MUL C1 C2 || Multiply the values of C1 and C2 and store it in the accumulator.
|-
| style="font-family: Monospace; font-size: 12px" | DIV C1 C2 || Divide the values of C1 and C2 and store it in the accumulator, rounding down if necessary.
|-
| style="font-family: Monospace; font-size: 12px" | POW C1 C2 || Raise the value of C1 to the value of C2 and store it in the accumulator.
|-
| style="font-family: Monospace; font-size: 12px" | CLR M1 || Reset the value of M1 to 0.
|-
| style="font-family: Monospace; font-size: 12px" | SWP M1 M2 || Swap the values of M1 and M2.
|-
| style="font-family: Monospace; font-size: 12px" | EQL C1 C2 || Store 1 in the accumulator if C1 is equal to C2, else 0.
|-
| style="font-family: Monospace; font-size: 12px" | NEQ C1 C2 || Store 1 in the accumulator if C1 is not equal to C2, else 0.
|-
| style="font-family: Monospace; font-size: 12px" | GRT C1 C2 || Store 1 in the accumulator if C1 is greater than C2, else 0.
|-
| style="font-family: Monospace; font-size: 12px" | LSS C1 C2 || Store 1 in the accumulator if C1 is less than C2, else 0.
|-
| style="font-family: Monospace; font-size: 12px" | ) label || Define a label for use with JMP or related commands.
|-
| style="font-family: Monospace; font-size: 12px" | JMP label || Move code execution to the specified label.
|-
| style="font-family: Monospace; font-size: 12px" | JEQ C1 C2 label || Move code execution to the specified label if C1 is equal to C2, else continue normally.
|-
| style="font-family: Monospace; font-size: 12px" | JNQ C1 C2 label || Move code execution to the specified label if C1 is not equal to C2, else continue normally.
|-
| style="font-family: Monospace; font-size: 12px" | JGR C1 C2 label || Move code execution to the specified label if C1 is greater than to C2, else continue normally.
|-
| style="font-family: Monospace; font-size: 12px" | JLS C1 C2 label || Move code execution to the specified label if C1 is less than C2, else continue normally.
|-
| style="font-family: Monospace; font-size: 12px" | JCD C1 label || Move code execution to the specified label if C1 is 1, else continue normally.
|-
| style="font-family: Monospace; font-size: 12px" | RET || Move code execution to the instruction after the last executed JMP (or related) command.
|-
| style="font-family: Monospace; font-size: 12px" | OUT C1 || Output the Unicode character whose codepoint is stored in C1.
|-
| style="font-family: Monospace; font-size: 12px" | INP || Take one character as input and store its Unicode codepoint in the accumulator.
|-
| style="font-family: Monospace; font-size: 12px" | †NOU C1 || Output the number in C1 in base 10.
|-
| style="font-family: Monospace; font-size: 12px" | †NIN || Take one base-10 number as input and store it in the accumulator.
|-
| style="font-family: Monospace; font-size: 12px" | HLT || Halt the program.
|-
| style="font-family: Monospace; font-size: 12px" | NOP || No-op (does nothing).
|}
''†This operator exists solely for user-friendliness. The programmer must use base 81 internally.''
<br>
''Note: A <code>HLT</code> command is not required for a program.''
== Syntax/Semantics ==
The syntax of ''81'' is very simple. Every command is on its own newline, followed by its arguments separated by one space.
<br>
''81'' has two types of comments — a normal (inline) comment, and a header. Inline comments are delimited via <code>@</code>, and everything after is ignored by the runtime. A header comment must be on its own line, and is surrounded by three equal signs (<code>=== ... ===</code>).
== Example Programs ==
:''Note: These programs contain the original comments from the draft of 81.''
=== “Hello, World!” ===
OUT [/] @ H (72)
OUT [1K] @ e (101)
OUT [1R] @ l (108)
OUT [1R] @ l (108)
OUT [1U] @ o (111)
OUT [i] @ , (44)
OUT [W] @ (32)
OUT [16] @ W (87)
OUT [1U] @ o (111
OUT [1X] @ r (114)
OUT [1R] @ l (108)
OUT [1J] @ d (100)
OUT [X] @ ! (33)
HLT
=== Fibonacci Numbers ===
=== input collection ===
NIN @ iteration count
CPY A G0
=== edge cases ===
JEQ G0 [0] _
JEQ G0 [1] c1
JEQ G0 [2] c2
=== prepare memory ==
CPY [0] {0}
CPY [1] {1}
DEC G0
DEC G0
=== set up output ===
OUT {0}
OUT [D]
OUT {1}
=== main loop ===
) loop
ADD {0} {1} @ calculate the next number based on
@ the current ones in memory
JCD V err @ jump to )err on an overflow
OUT [D] @ output a space, then the number
NOU A @ this stops trailing spaces in the
CPY {0} A @ program’s output.
SWP {0} {1} @ keep only what’s needed for the next
DEC G0 @ iteration
JGR G0 0 loop
=== 0 edge case ===
) _
HLT
=== 1 edge case ===
) c1
NOU {0}
HLT
=== 2 edge case ===
) c2
NOU {0}
OUT [D]
NOU {1}
HLT
=== overflow error ===
) err
OUT [*] @ E (69)
OUT [1X] @ r (114)
OUT [1X] @ r (114)
=== Primality Check ===
=== input collection ===
NIN @ the number to check
CPY RX A
=== handle n = 0 or 1 edge cases ===
JLS RX [2] N/A
=== prepare memory ===
CPY RY [2] @ the current integer being divided
=== main loop ===
) loop
@ if RY^2 > RX, and the loop is still going (meaning
@ it passed), stop the program
MUL RY RY
JGR A RX p
@ if RX % RY != 0, stop the program
DIV RX RY
MUL A RY
SUB RX A
JEQ A [0] _
@ increment RY and loop
INC RY
JMP loop
=== primality check indeterminant ===
) N/A
OUT [?] @ N (78)
OUT [l] @ / (47)
OUT [$] @ A (65)
HLT
=== primality check passed (prime) ===
) p
OUT [_4] @ T (84)
HLT
=== primality check failed (not prime) ===
) _
OUT [+] @ F (70)
HLT
[[Category:Low-level]]
[[Category:Cell-based]]
[[Category:Unimplemented]]
[[Category:Languages]]
[[Category:2025]]
[[Category:Turing complete]]' |
Lines added in edit (added_lines) | [
0 => '{{Distinguish/Confusion|8}}',
1 => ':''Note that 81 is always italicized.''',
2 => '',
3 => '{{infobox proglang',
4 => ' |name=''81''',
5 => ' |paradigms=Imperative',
6 => ' |author=[[User:Waffelz]]',
7 => ' |year=[[:Category:2025|2025]]',
8 => ' |memsys=[[:Category:Cell-based|Cell-based]]',
9 => ' |dimensions=one-dimensional',
10 => ' |class=[[:Category:Turing complete|Turing complete]]',
11 => ' |files=<code>*.81</code>',
12 => '}}',
13 => '',
14 => '== About ==',
15 => '''81'' is an esolang created by [[User:Waffelz|waffelz]] during class because he was bored. It is entirely based on base-81 literals, whose digits are listed in the table below:',
16 => '',
17 => '{|class=wikitable style="font-family: Monospace; font-size: 12px"',
18 => '|- style="background: black; color: white"; align="center"',
19 => '| || X0 || X1 || X2 || X3 || X4 || X5 || X6 || X7 || X8 || X9',
20 => '|- align="center"',
21 => '| style="background: black; color: white" | 0X || 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9',
22 => '|- align="center"',
23 => '| style="background: black; color: white" | 1X || A || B || C || D || E || F || G || H || I || J',
24 => '|- align="center"',
25 => '| style="background: black; color: white" | 2X || K || L || M || N || O || P || Q || R || S || T',
26 => '|- align="center"',
27 => '| style="background: black; color: white" | 3X || U || V || W || X || Y || Z || a || b || c || d',
28 => '|- align="center"',
29 => '| style="background: black; color: white" | 4X || e || f || g || h || i || j || k || l || m || n',
30 => '|- align="center"',
31 => '| style="background: black; color: white" | 5X || o || p || q || r || s || t || u || v || w || x',
32 => '|- align="center"',
33 => '| style="background: black; color: white" | 6X || y || z || ! || @ || # || $ || % || ^ || & || *',
34 => '|- align="center"',
35 => '| style="background: black; color: white" | 7X || + || / || | || \ || < || > || ~ || ` || ? || =',
36 => '|- align="center"',
37 => '| style="background: black; color: white" | 8X || _ || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" | || style ="background: black; color: white" |',
38 => '|}',
39 => '',
40 => 'In ''81'' code, number literals are surrounded in brackets (<code>[...]</code>), and memory addresses are surrounded in braces (<code>{...}</code>). It has a set of 28 opcodes, which are Turing-complete.',
41 => '',
42 => '== Memory ==',
43 => 'There are 43,046,721 memory cells, indexed from [0] to [ _ _ _ ], all initialized as 0. They can store integers from 0–15,009,4635,296,999,120, or [0] to [ _ _ _ _ _ _ _ _ ]. It has built-in 5 registers — an accumulator (<code>A</code>), 3 general-purpose registers (<code>RX</code>/<code>RY</code>/<code>RZ</code>), and an overflow flag (<code>V</code>). ',
44 => '',
45 => '== Commands ==',
46 => '''(<code>M1</code>/<code>M2</code> represent arbitrary memory addresses, <code>C1</code>/<code>C2</code> represent arbitrary number literals, and <code>label</code> represents an arbitrary label.)''',
47 => '',
48 => '{|class=wikitable',
49 => '|-',
50 => '| style="font-family: Monospace; font-size: 12px" | CPY C1 M1 || Copies the value of C1 to M1.',
51 => '|-',
52 => '| style="font-family: Monospace; font-size: 12px" | INC M1 || Increment the value of M1.',
53 => '|-',
54 => '| style="font-family: Monospace; font-size: 12px" | DEC M1 || Decrement the value of M1.',
55 => '|-',
56 => '| style="font-family: Monospace; font-size: 12px" | ADD C1 C2 || Add the values of C1 and C2 and store it in the accumulator.',
57 => '|-',
58 => '| style="font-family: Monospace; font-size: 12px" | SUB C1 C2 || Subtract the values of C1 and C2 and store it in the accumulator.',
59 => '|-',
60 => '| style="font-family: Monospace; font-size: 12px" | MUL C1 C2 || Multiply the values of C1 and C2 and store it in the accumulator.',
61 => '|-',
62 => '| style="font-family: Monospace; font-size: 12px" | DIV C1 C2 || Divide the values of C1 and C2 and store it in the accumulator, rounding down if necessary.',
63 => '|-',
64 => '| style="font-family: Monospace; font-size: 12px" | POW C1 C2 || Raise the value of C1 to the value of C2 and store it in the accumulator.',
65 => '|-',
66 => '| style="font-family: Monospace; font-size: 12px" | CLR M1 || Reset the value of M1 to 0.',
67 => '|-',
68 => '| style="font-family: Monospace; font-size: 12px" | SWP M1 M2 || Swap the values of M1 and M2.',
69 => '|-',
70 => '| style="font-family: Monospace; font-size: 12px" | EQL C1 C2 || Store 1 in the accumulator if C1 is equal to C2, else 0.',
71 => '|-',
72 => '| style="font-family: Monospace; font-size: 12px" | NEQ C1 C2 || Store 1 in the accumulator if C1 is not equal to C2, else 0.',
73 => '|-',
74 => '| style="font-family: Monospace; font-size: 12px" | GRT C1 C2 || Store 1 in the accumulator if C1 is greater than C2, else 0.',
75 => '|-',
76 => '| style="font-family: Monospace; font-size: 12px" | LSS C1 C2 || Store 1 in the accumulator if C1 is less than C2, else 0.',
77 => '|-',
78 => '| style="font-family: Monospace; font-size: 12px" | ) label || Define a label for use with JMP or related commands.',
79 => '|-',
80 => '| style="font-family: Monospace; font-size: 12px" | JMP label || Move code execution to the specified label.',
81 => '|-',
82 => '| style="font-family: Monospace; font-size: 12px" | JEQ C1 C2 label || Move code execution to the specified label if C1 is equal to C2, else continue normally.',
83 => '|-',
84 => '| style="font-family: Monospace; font-size: 12px" | JNQ C1 C2 label || Move code execution to the specified label if C1 is not equal to C2, else continue normally.',
85 => '|-',
86 => '| style="font-family: Monospace; font-size: 12px" | JGR C1 C2 label || Move code execution to the specified label if C1 is greater than to C2, else continue normally.',
87 => '|-',
88 => '| style="font-family: Monospace; font-size: 12px" | JLS C1 C2 label || Move code execution to the specified label if C1 is less than C2, else continue normally.',
89 => '|-',
90 => '| style="font-family: Monospace; font-size: 12px" | JCD C1 label || Move code execution to the specified label if C1 is 1, else continue normally.',
91 => '|-',
92 => '| style="font-family: Monospace; font-size: 12px" | RET || Move code execution to the instruction after the last executed JMP (or related) command.',
93 => '|-',
94 => '| style="font-family: Monospace; font-size: 12px" | OUT C1 || Output the Unicode character whose codepoint is stored in C1.',
95 => '|-',
96 => '| style="font-family: Monospace; font-size: 12px" | INP || Take one character as input and store its Unicode codepoint in the accumulator.',
97 => '|-',
98 => '| style="font-family: Monospace; font-size: 12px" | †NOU C1 || Output the number in C1 in base 10.',
99 => '|-',
100 => '| style="font-family: Monospace; font-size: 12px" | †NIN || Take one base-10 number as input and store it in the accumulator.',
101 => '|-',
102 => '| style="font-family: Monospace; font-size: 12px" | HLT || Halt the program.',
103 => '|-',
104 => '| style="font-family: Monospace; font-size: 12px" | NOP || No-op (does nothing).',
105 => '|}',
106 => '',
107 => '''†This operator exists solely for user-friendliness. The programmer must use base 81 internally.''',
108 => '<br>',
109 => '''Note: A <code>HLT</code> command is not required for a program.''',
110 => '',
111 => '== Syntax/Semantics ==',
112 => 'The syntax of ''81'' is very simple. Every command is on its own newline, followed by its arguments separated by one space.',
113 => '<br>',
114 => '''81'' has two types of comments — a normal (inline) comment, and a header. Inline comments are delimited via <code>@</code>, and everything after is ignored by the runtime. A header comment must be on its own line, and is surrounded by three equal signs (<code>=== ... ===</code>).',
115 => '',
116 => '== Example Programs ==',
117 => ':''Note: These programs contain the original comments from the draft of 81.''',
118 => '=== “Hello, World!” ===',
119 => ' OUT [/] @ H (72)',
120 => ' OUT [1K] @ e (101)',
121 => ' OUT [1R] @ l (108)',
122 => ' OUT [1R] @ l (108)',
123 => ' OUT [1U] @ o (111)',
124 => ' OUT [i] @ , (44)',
125 => ' OUT [W] @ (32)',
126 => ' OUT [16] @ W (87)',
127 => ' OUT [1U] @ o (111',
128 => ' OUT [1X] @ r (114)',
129 => ' OUT [1R] @ l (108)',
130 => ' OUT [1J] @ d (100)',
131 => ' OUT [X] @ ! (33)',
132 => ' HLT',
133 => '',
134 => '=== Fibonacci Numbers ===',
135 => ' === input collection ===',
136 => ' NIN @ iteration count',
137 => ' CPY A G0',
138 => ' ',
139 => ' === edge cases ===',
140 => ' JEQ G0 [0] _',
141 => ' JEQ G0 [1] c1',
142 => ' JEQ G0 [2] c2',
143 => ' ',
144 => ' === prepare memory ==',
145 => ' CPY [0] {0}',
146 => ' CPY [1] {1}',
147 => ' DEC G0',
148 => ' DEC G0',
149 => ' ',
150 => ' === set up output ===',
151 => ' OUT {0}',
152 => ' OUT [D]',
153 => ' OUT {1}',
154 => ' ',
155 => ' === main loop ===',
156 => ' ) loop',
157 => ' ADD {0} {1} @ calculate the next number based on',
158 => ' @ the current ones in memory',
159 => ' ',
160 => ' JCD V err @ jump to )err on an overflow',
161 => ' ',
162 => ' OUT [D] @ output a space, then the number',
163 => ' NOU A @ this stops trailing spaces in the',
164 => ' CPY {0} A @ program’s output.',
165 => ' ',
166 => ' SWP {0} {1} @ keep only what’s needed for the next',
167 => ' DEC G0 @ iteration',
168 => ' JGR G0 0 loop',
169 => ' ',
170 => ' === 0 edge case ===',
171 => ' ) _',
172 => ' HLT',
173 => ' ',
174 => ' === 1 edge case ===',
175 => ' ) c1',
176 => ' NOU {0}',
177 => ' HLT',
178 => ' ',
179 => ' === 2 edge case ===',
180 => ' ) c2',
181 => ' NOU {0}',
182 => ' OUT [D]',
183 => ' NOU {1}',
184 => ' HLT',
185 => ' ',
186 => ' === overflow error ===',
187 => ' ) err',
188 => ' OUT [*] @ E (69)',
189 => ' OUT [1X] @ r (114)',
190 => ' OUT [1X] @ r (114)',
191 => '',
192 => '=== Primality Check ===',
193 => ' === input collection ===',
194 => ' NIN @ the number to check',
195 => ' CPY RX A',
196 => ' ',
197 => ' === handle n = 0 or 1 edge cases ===',
198 => ' JLS RX [2] N/A',
199 => ' ',
200 => ' === prepare memory ===',
201 => ' CPY RY [2] @ the current integer being divided',
202 => ' ',
203 => ' === main loop ===',
204 => ' ) loop',
205 => ' @ if RY^2 > RX, and the loop is still going (meaning',
206 => ' @ it passed), stop the program',
207 => ' MUL RY RY',
208 => ' JGR A RX p',
209 => ' ',
210 => ' @ if RX % RY != 0, stop the program',
211 => ' DIV RX RY',
212 => ' MUL A RY',
213 => ' SUB RX A',
214 => ' JEQ A [0] _',
215 => ' ',
216 => ' @ increment RY and loop',
217 => ' INC RY',
218 => ' JMP loop',
219 => ' ',
220 => ' === primality check indeterminant ===',
221 => ' ) N/A',
222 => ' OUT [?] @ N (78)',
223 => ' OUT [l] @ / (47)',
224 => ' OUT [$] @ A (65)',
225 => ' HLT',
226 => ' ',
227 => ' === primality check passed (prime) ===',
228 => ' ) p',
229 => ' OUT [_4] @ T (84)',
230 => ' HLT',
231 => ' ',
232 => ' === primality check failed (not prime) ===',
233 => ' ) _',
234 => ' OUT [+] @ F (70)',
235 => ' HLT',
236 => '',
237 => '[[Category:Low-level]] ',
238 => '[[Category:Cell-based]] ',
239 => '[[Category:Unimplemented]] ',
240 => '[[Category:Languages]]',
241 => '[[Category:2025]]',
242 => '[[Category:Turing complete]]'
] |