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.

▀▄█▌▐░▒▓

From Esolang
Jump to navigation Jump to search
Shade
Designed by {{{author}}}
Appeared in 2026
Dimensions 1
Computational class Unknown
Reference implementation Unimplemented

▀▄█▌▐░▒▓ is an esoteric programming language created by User:Ø in 2026. It is a direct reskin of Brainfuck: identical semantics, but every command is replaced with a Unicode block/shade character instead of an ASCII symbol. The name comes from the block elements' informal name, "shade characters."

Programs are stored in .shade files, which begin with a short text header before the actual code, distinguishing Shade files from plain Brainfuck source.

Instructions

Shade uses the same eight commands as Brainfuck, mapped onto eight Unicode block/shade characters (U+2580–U+2593):

Shade Unicode Brainfuck equivalent Meaning
U+2588 FULL BLOCK + Increment the byte at the pointer
U+2591 LIGHT SHADE - Decrement the byte at the pointer
U+2592 MEDIUM SHADE < Move the pointer left
U+2593 DARK SHADE > Move the pointer right
U+2580 UPPER HALF BLOCK [ Jump forward past the matching if the current byte is zero
U+2584 LOWER HALF BLOCK ] Jump back to the matching if the current byte is nonzero
U+258C LEFT HALF BLOCK . Output the current byte as a character
U+2590 RIGHT HALF BLOCK , Input a character and store its value at the pointer

Any character other than the eight above is treated as a comment and ignored, in keeping with Brainfuck tradition.

File format

A .shade file consists of a header, a separator, and a body:

SHADE v1
; anything on a line starting with a semicolon is a comment
---
(program code goes here, using the eight shade characters)
  • Line 1 must read SHADE v1, identifying the file and format version.
  • The line --- marks the end of the header and the start of the program body.
  • Everything after --- is scanned for the eight instruction characters; all other characters (including whitespace, comments, and decorative box-drawing) are ignored.

Examples

Hi

Increments the cell to 72 ('H'), prints it, increments to 105 ('i'), prints it:

SHADE v1
---
████████████████████████████████████████████████████████████████████████▌█████████████████████████████████▌

Hello, World!

A direct transliteration of the canonical Brainfuck Hello World program, substituting shade characters one-for-one for their Brainfuck equivalents:

SHADE v1
---
████████▀▓████▀▓██▓███▓███▓█▒▒▒▒░▄▓█▓█▓░▓▓█▀▒▄▒░▄▓▓▌▓░░░▌███████▌▌███▌▓▓▌▒░▌▒▌███▌░░░░░░▌░░░░░░░░▌▓▓█▌▓██▌

(Output: Hello World!)

Implementation

Python

A minimal reference interpreter:

<syntaxhighlight lang="python"> import sys

OPS = "█░▒▓▀▄▌▐" # incr, decr, left, right, loop-start, loop-end, out, in

def load(path):

   with open(path, encoding='utf-8') as f:
       lines = f.read().splitlines()
   if not lines or not lines[0].startswith("SHADE"):
       raise ValueError("Not a valid .shade file (missing 'SHADE v1' header)")
   body_start = lines.index("---") + 1
   code = "\n".join(lines[body_start:])
   return "".join(c for c in code if c in OPS)

def run(code):

   tape = [0] * 30000
   ptr = pc = 0
   out = []
   stack, match = [], {}
   for i, c in enumerate(code):
       if c == "▀":
           stack.append(i)
       elif c == "▄":
           j = stack.pop()
           match[i], match[j] = j, i
   while pc < len(code):
       c = code[pc]
       if c == "█": tape[ptr] = (tape[ptr] + 1) % 256
       elif c == "░": tape[ptr] = (tape[ptr] - 1) % 256
       elif c == "▒": ptr -= 1
       elif c == "▓": ptr += 1
       elif c == "▀":
           if tape[ptr] == 0: pc = match[pc]
       elif c == "▄":
           if tape[ptr] != 0: pc = match[pc]
       elif c == "▌": out.append(chr(tape[ptr]))
       elif c == "▐": tape[ptr] = ord(sys.stdin.read(1) or "\0")
       pc += 1
   return "".join(out)

if __name__ == "__main__":

   print(run(load(sys.argv[1])))

</syntaxhighlight>

See also