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.
Angelfrick
| Paradigm(s) | imperative |
|---|---|
| Designed by | User:Acidbytes.h |
| Appeared in | 2026 |
| Type system | untyped |
| Memory system | cell-based |
| Dimensions | one-dimensional |
| Computational class | Turing complete |
| Reference implementation | angelfrick.cpp (C++) |
| Influenced by | brainfuck |
| File extension(s) | .angelfrick |
Angelfrick is the trivial brainfuck substitution TrivialBrainfuckSubstitution("ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]", "SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]", "HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]", "PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]", "aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]", "giBBERIsHghEjVIYOCNjnIRjVjjKwbXvqgvCFguHytTRdeS@><+-.,[]", "pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[]", "fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[]").
Commands
| brainfuck | Angelfrick | Bytes | Meaning |
|---|---|---|---|
> |
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[] |
46 | Move the pointer right |
< |
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[] |
55 | Move the pointer left |
+ |
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[] |
57 | Increment the current cell |
- |
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[] |
66 | Decrement the current cell |
. |
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[] |
49 | Output the current cell as a character |
, |
giBBERIsHghEjVIYOCNjnIRjVjjKwbXvqgvCFguHytTRdeS@><+-.,[] |
56 | Read one character into the current cell |
[ |
pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[] |
51 | Jump past the matching close if the current cell is zero |
] |
fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[] |
51 | Jump back to the matching open if the current cell is nonzero |
Six of the eight keywords are built on real English words. giBBERIsHghEjVIYOCNjnIRjVjjKwbXvqgv is not; the author ran out of long words before running out of commands, and the input instruction is therefore keyboard mash. That the language uses hippopotomonstrosesquippedaliophobia — the fear of long words — as its increment instruction is intentional.
Syntax
Matching rules
- Keywords are matched by case-sensitive prefix comparison, and any byte that does not begin a keyword is skipped. Whitespace between keywords is therefore optional, and so is its absence: a valid program may be written one keyword per line, or as a single unbroken six-kilobyte word.
- Because unrecognised text is discarded, all non-keyword text is a comment. Angelfrick source can be embedded in prose with no comment delimiter.
- No keyword occurs as a substring of another at a nonzero offset, so prefix matching is unambiguous.
Case
The casing is the substance of the language rather than decoration. It is not alternating, not word-initial, and not derived from anything; it is simply a fixed arbitrary pattern per keyword that a programmer must reproduce byte for byte. Two consequences follow:
- The keywords are no longer legible as the English words they are built from.
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISmust be transcribed rather than read, which removes the one affordance a long-word substitution normally has. - The trailing
cfguhyttrdesis cased differently in every keyword —CfGUhYTTrDeS,CFguhYtTRdeS,cFguHyTtrdes, and so on. There is consequently no common suffix that a find-and-replace or a single regular expression can key on, which is the usual way trivial brainfuck substitutions are compiled.
Encoding
The close-loop keyword ends with £ (U+00A3), which is not ASCII. The reference implementation compares raw bytes, so source files must be UTF-8: under Latin-1 the pound sign is one byte rather than two, the close-loop keyword never matches, and every loop in the program silently fails. A Latin-1 copy of the Hello World program below emits thirteen bytes of noise instead of its greeting rather than reporting an error.
File encoding is therefore part of the language specification. Note the asymmetry — the open-loop keyword uses the ASCII {, so [ is portable and ] is not.
File extension
Source files must carry the extension .angelfrick. The reference implementation refuses anything else, printing ok, so where is it? and exiting, which makes the extension part of the language rather than a convention.
Memory model
The tape is 30000 cells of char, initialised to zero, with the pointer starting at cell 0. Cells wrap; the pointer is not bounds-checked.
Examples
Hello World!
Translated from the standard 106-command brainfuck Hello World. The result is 5,983 bytes — an expansion of about 56× — to print twelve characters.
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
Cat
The direct translation of ,[.,]:
giBBERIsHghEjVIYOCNjnIRjVjjKwbXvqgvCFguHytTRdeS@><+-.,[]
pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[]
aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]
giBBERIsHghEjVIYOCNjnIRjVjjKwbXvqgvCFguHytTRdeS@><+-.,[]
fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[]
Under the reference implementation this program does not terminate: getchar returns EOF (−1) at end of input, which is stored in the cell as a nonzero value, so the loop runs forever emitting 0xFF. This follows from the implementation's silence on EOF semantics rather than being an intended feature.
Computational class
Angelfrick is a one-to-one substitution of brainfuck's instruction set with no additional state or commands, so it is Turing complete by the same argument as brainfuck, subject to the usual unbounded-tape idealisation.
Implementation
The reference implementation is a single-file C++ interpreter, written in the common subset of C and C++ and using no C++-specific facilities beyond the explicit cast on calloc. It matches keywords with a strncmp prefix macro and, after a match, advances the cursor by one byte rather than by the token length; the remaining bytes of the keyword then fail to match anything and are skipped individually, so each keyword executes exactly once.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define IS(x) (!strncmp(c + i, x, sizeof(x) - 1))
#define OPEN IS("pseUDopseUDOHYpopaRatHYROIDisMcfGUhYTTrDes{><+-.,[]")
#define CLOSE IS("fLoccInAUCiniHiLIpILIfiCaTionCFGUHyTtRDes£><+-.,[]")
int main(int ac , char** av)
{
if (ac < 2 || !strstr(av[1], ".angelfrick")) return fprintf(stderr, "ok, so where is it?\n"), 1;
FILE* f = fopen(av[1], "rb"); if (!f) return perror("Oopsies. You have accidentally typed rm -rf /."), 1;
fseek(f, 0, SEEK_END); long s = ftell(f); rewind(f);
char* c = (char*)calloc(s + 1, 1); fread(c, 1, s, f); fclose(f);
char m[30000] = {0}; int p = 0, i = 0, l;
while (i < s) {
if (IS("ThyROparAtHyROIDectomIzEdCfGUhYTTrDeS$><+-.,[]")) p++;
else if (IS("SUPErcaliFrAgilIStiCeXpiaLIDOcIOUsCFguhYtTRdeS!><+-.,[]")) p--;
else if (IS("HIppoPOToMONStrOSeSQuIPPEdaLioPhOBiacFguHyTtrdes*><+-.,[]")) m[p]++;
else if (IS("PNEumoNoultRAMicroSCOPIcsiLiCoVolCanocONIOSISCFgUhyTtrDeS%><+-.,[]")) m[p]--;
else if (IS("aNTiDiSesTaBLIsHmenTarIaniSmcFGUHYtTRDes&><+-.,[]")) putchar(m[p]);
else if (IS("giBBERIsHghEjVIYOCNjnIRjVjjKwbXvqgvCFguHytTRdeS@><+-.,[]")) m[p] = getchar();
else if (OPEN && !m[p]) for (l = 1; l; ) { ++i; l += OPEN - CLOSE; }
else if (CLOSE && m[p]) for (l = 1; l; ) { --i; l += CLOSE - OPEN; }
i++;
}
free(c);
}
Compile with g++ -O2 -o angelfrick angelfrick.cpp and run as ./angelfrick program.angelfrick. It builds without modification under -std=c++17, c++20 and c++23, emitting only the fread unused-result warning. The source must itself be saved as UTF-8 for the close-loop keyword to be encoded correctly.
Known issues
- The tape pointer is not bounds-checked; a program that walks off either end of the 30000-cell array invokes undefined behaviour.
- Unmatched brackets cause the scanning loops to run past the ends of the buffer.
- EOF is stored as −1 rather than 0 or leaving the cell unchanged, breaking the usual
,[.,]cat idiom (see above). - The extension check uses
strstrrather than testing the end of the filename, sohello.angelfrick.txtis also accepted. - A mis-encoded close-loop keyword fails silently rather than raising an error.
- The return value of
freadis ignored.
Trivia
- Every Angelfrick keyword contains a complete copy of the brainfuck instruction set, and none of those eight characters ever does anything.
- Between them the sigils and the tail use
$ ! * % & @ { [ ] > <, so no keyword can be typed into an interactive shell unquoted without triggering variable expansion, history expansion, globbing, brace expansion, or backgrounding. The decrement keyword additionally contains%, making it a format string. - No keyword is a valid identifier in any mainstream programming language, which forecloses the traditional escape route of compiling programs with the C preprocessor.