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.
ZeroBF
ZeroBF is a compression scheme for Brainfuck invented by User:Zzo38, the program is encoded as a single number. Assume the tape is unbounded in both directions and all cells start at zero.
At each step, you do: Divide the number by the number of possible commands, write the command according to the remainder, and then set the number to quotient. Repeat until number is zero.
At beginning of program: 0=, 1=+ 2=- 3=. After a + not in a loop if a > hasn't appeared yet: 0=+ 1=> 2=[ 3=. After a + in a loop if a > hasn't appeared yet: 0=+ 1=> 2=[ 3=. 4=] After a - not in a loop if a > hasn't appeared yet: 0=- 1=> 2=[ 3=. After a - in a loop if a > hasn't appeared yet: 0=- 1=> 2=[ 3=. 4=] After a + not in a loop: 0=+ 1=< 2=> 3=[ 4=. After a + in a loop: 0=+ 1=< 2=> 3=[ 4=. 5=] After a - not in a loop: 0=- 1=< 2=> 3=[ 4=. After a - in a loop: 0=- 1=< 2=> 3=[ 4=. 5=] After a < not in a loop: 0=< 1=- 2=+ 3=[ 4=. 5=, After a < in a loop: 0=< 1=- 2=+ 3=[ 4=. 5=, 6=] After a > not in a loop: 0=> 1=- 2=+ 3=[ 4=. 5=, After a > in a loop: 0=> 1=- 2=+ 3=[ 4=. 5=, 6=] After a [ if a > hasn't appeared yet: 0=, 1=+ 2=- 3=. 4=> 5=[ After a [: 0=, 1=+ 2=- 3=. 4=< 5=> 6=[ After a ] not in a loop: 0=, 1=+ 2=- 3=. 4=< 5=> After a ] in a loop with nothing before the loop that just ended: 0=, 1=+ 2=- 3=. 4=< 5=> After a ] in a loop: 0=, 1=+ 2=- 3=. 4=< 5=> 6=] After a , not in a loop: 0=, 1=+ 2=- 3=. 4=< 5=> 6=[ After a , in a loop: 0=, 1=+ 2=- 3=. 4=< 5=> 6=[ 7=] After a . not in a loop: 0=, 1=+ 2=- 3=. 4=< 5=> 6=[ After a . in a loop: 0=, 1=+ 2=- 3=. 4=< 5=> 6=[ 7=]
Note: This list assumes that the program might use binary I/O. For a program that does not use binary I/O, a . cannot appear directly after a ]
If each cell stores 1 bit, it can be simplified to (* toggles the bit):
At beginning of program: 0=, 1=* 2=. After a * not in a loop if > hasn't appeared yet: 0=. 1=[ 2=> After a * in a loop if > hasn't appeared yet: 0=. 1=[ 2=> 3=] After a * not in a loop: 0=. 1=[ 2=> 3=< After a * in a loop: 0=. 1=[ 2=> 3=] 4=< After a < not in a loop: 0=. 1=, 2=* 3=[ 4=< After a < in a loop: 0=. 1=, 2=* 3=[ 4=< 5=] After a > not in a loop: 0=. 1=, 2=* 3=[ 4=> After a > in a loop: 0=. 1=, 2=* 3=[ 4=> 5=] After a [ if a > hasn't appeared yet: 0=, 1=* 2=. 3=> 4=[ After a [: 0=, 1=* 2=. 3=< 4=> 5=[ After a ] not in a loop: 0=, 1=* 2=. 3=< 4=> After a ] in a loop with nothing before the loop that just ended: 0=, 1=* 2=. 3=< 4=> After a ] in a loop: 0=, 1=* 2=. 3=< 4=> 5=] After a , not in a loop: 0=, 1=* 2=. 3=< 4=> 5=[ After a , in a loop: 0=, 1=* 2=. 3=< 4=> 5=[ 6=] After a . not in a loop: 0=, 1=* 2=. 3=< 4=> 5=[ After a . in a loop: 0=, 1=* 2=. 3=< 6=> 5=[ 6=]