Brainfuck z kodowaniem długości przebiegu, 49 bajtów
Ponieważ w Brainfuck nie ma żadnych zmiennych, po prostu użyłem standardowego wejścia i wyjścia.
Kod 32+
powinien być interpretowany +
przez tłumacza jako 32 s. Po prostu zastąp je ręcznie, jeśli Twój tłumacz nie obsługuje RLE.
>,[32->+<[16-<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.
Wersja rozszerzona (nie RLE): (91 bajtów)
>,[-------------------------------->+<[----------------<[>++<-]>[<+>-]>-<]>[<<.[-]>>-]<,]<.
Kod zakłada, że EOF jest zakodowany jako 0.
Wyjaśnienie
Używany jest następujący układ:
+---+---+------+
| x | a | flag |
+---+---+------+
Gdzie x
jest drukowany bajt ASCII, a
jest znakiem ze standardowego wejścia i flag
wynosi 1, jeśli a
był spacją.
>, Read a character a into the second cell
[ While not EOF:
32- Decrease a by 32 (a -= ' ')
>+< Set the flag to 1
[ If a was not a space:
16- Decrease by 16 more ('0' == 32+16)
<[>++<-] a += 2*x
>[<+>-] Move it back (x = a)
>-< Reset the flag, it was not a space.
]>
[ If a was a space (flag == 1):
<<.[-] Print and reset x
>>- Reset the flag
]
<, Read the next caracter a
]
<. Print the last character x