Mariofuck
Mariofuck is a esolang made by Mihai Popa. It's Brainfuck, but you only use 1-letter names of Nintendo characters instead of symbols to make programs.
Table
| Command | Meaning (in full name) | Brainfuck equivalent | Description |
|---|---|---|---|
M |
Mario | >
|
Move the pointer to the right |
L |
Luigi | <
|
Move the pointer to the left |
Y |
Yoshi | +
|
Increment the memory cell at the pointer |
C |
Captain Toad | -
|
Decrement the memory cell at the pointer |
K |
Lakitu | .
|
Output the character signified by the cell at the pointer |
T |
Toad | ,
|
Input a character and store it in the cell at the pointer |
D |
Toadette | [
|
Jump past the matching B if the cell at the pointer is 0
|
B |
Blue Toad | ]
|
Jump back to the matching D if the cell at the pointer is nonzero
|
Everything other than "M","L","Y","C","K","T","D","B" and is a comment and it's ignored. But if you comment with these, it's executed as a command and it's a error.
Examples
Hello, World!
YYYYYYYYDMYYYYYYYYLCBMYYYYYYYYKMYYYYYYYYDMYYYYYYYYYYYYLCBMYYYYYKYYYYYYYKKYYYKMYYYYYYYYDMYYYYYLCBMYYYYKCCCCCCCCCCCCKLLLLYYYYYYYYYYYYYYYKMMKYYYKCCCCCCKCCCCCCCCKMMYK
Rickrolling, by printing all the lyrics of "Never Gonna Give You Up"
Too long. See here: Mariofuck/Rickroll
99 Bottles Of Beer
Quite long. See here: Mariofuck/99 Bottles Of Beer
Implementer
Ruby
#!/usr/bin/ruby
eval 'm=Hash.new(p=0);'+ARGF.read.gsub(
/./,
'M'=>'p+=1;',
'L'=>'p-=1;',
'Y'=>'m[p]+=1;',
'C'=>'m[p]-=1;',
'D'=>'(',
'B'=>')while((m[p]&=255)!=0);',
'K'=>'putc m[p];',
'T'=>'m[p]=STDIN.getbyte if !STDIN.eof;')
Python
Version 1 (forked from ChatGPT), longer
Note: edited by myself. See the Numberfuck interpreter, coded by ChatGPT. Still is optimized for everything, including printing the full lyrics of the song Never Gonna Give You Up.
def interpret():
code = input("Enter Mariofuck code: ")
memory = [0] * 30000
pointer = 0
output_string = ""
code_length = len(code)
code_pointer = 0
loop_stack = []
commands = {
'M': lambda: nonlocal_pointer('+'),
'L': lambda: nonlocal_pointer('-'),
'Y': lambda: increment_memory(),
'C': lambda: decrement_memory(),
'K': lambda: output_to_string(),
'T': lambda: take_input(),
'D': lambda: start_loop(),
'B': lambda: end_loop()
}
def nonlocal_pointer(op):
nonlocal pointer
if op == '+':
pointer += 1
else:
pointer -= 1
def increment_memory():
nonlocal memory, pointer
memory[pointer] = (memory[pointer] + 1) % 256
def decrement_memory():
nonlocal memory, pointer
memory[pointer] = (memory[pointer] - 1) % 256
def output_to_string():
nonlocal memory, pointer, output_string
output_string += chr(memory[pointer])
def take_input():
nonlocal memory, pointer
user_input = input("Enter input (1 character): ")
memory[pointer] = ord(user_input[0])
def start_loop():
nonlocal memory, pointer, code_pointer, loop_stack
if memory[pointer] == 0:
count = 1
while count != 0 and code_pointer < code_length - 1:
code_pointer += 1
if code[code_pointer] == 'D':
count += 1
elif code[code_pointer] == 'B':
count -= 1
else:
loop_stack.append(code_pointer)
def end_loop():
nonlocal code_pointer, loop_stack
if memory[pointer] != 0:
code_pointer = loop_stack[-1]
else:
loop_stack.pop()
while code_pointer < code_length:
command = code[code_pointer]
if command in commands:
commands[command]()
code_pointer += 1
print("Output:", output_string)
interpret()
Version 2 (created by PrySigneToFry), shorter
import sys
def interpretion(code):
s=[]
matches={}
tape=[0]*1000000
for i,j in enumerate(code):
if j=='B':
s.append(i)
if j=='D':
m=s.pop()
matches[m]=i
matches[i]=m
cp=0
p=0
while cp<len(code):
if code[cp]=='Y':
tape[p]=(tape[p]+1)%256
if code[cp]=='C':
tape[p]=(tape[p]-1)%256
if code[cp]=='K':
c=sys.stdin.read(1)
tape[p]=(ord(c) if c else 0)%256
if code[cp]=='T':
print(chr(tape[p]),end=)
if code[cp]=='M':
p-=1
if code[cp]=='L':
p+=1
if code[cp]=='B':
if not tape[p]:
cp=matches[cp]
if code[cp]=='D':
if tape[p]:
cp=matches[cp]
cp+=1
interpretion(sys.stdin.read())
Computational class
Mariofuck is turing-complete because Brainfuck and Numberfuck are also turing-complete!
See also
- Numberfuck, a variant with numbers
- 锟斤拷烫烫烫fuck, a variant with hanzis