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
▀▄█▌▐░▒▓
Paradigm(s) imperative
Designed by User:Ø
Appeared in 2026
Memory system cell-based
Dimensions one-dimensional
Computational class turing-complete
Reference implementation reference implementation written in Python
Influenced by Brainfuck
File extension(s) .shade


▀▄█▌▐░▒▓ is the trivial brainfuck substitution TrivialBrainfuckSubstitution("▓", "▒", "█", "░", "▌", "▐", "▀", "▄"). Every ASCII symbol is replaced with a Unicode block/shade character. 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!)

Implementations

Python

A minimal reference implementation:

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])))