about summary refs log tree commit diff stats
path: root/examples/rot13.bf
blob: bfcde736680cf1364deca089b53ef5e449230e51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[ ROT13 in Brainfuck
from https://en.wikipedia.org/wiki/Brainfuck#ROT13
]

-,+[                         Read first character and start outer character reading loop
-[                       Skip forward if character is 0
>>++++[>++++++++<-]  Set up divisor (32) for division loop
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
<+<-[                Set up dividend (x minus 1) and enter division loop
>+>+>-[>>>]      Increase copy and remainder / reduce divisor / Normal case: skip forward
<[[>+<-]>>+>]    Special case: move remainder back to divisor and increase quotient
<<<<<-           Decrement dividend
]                    End division loop
]>>>[-]+                 End skip loop; zero former divisor and reuse space for a flag
>--[-[<->+++[-]]]<[         Zero that flag unless quotient was 2 or 3; zero quotient; check flag
++++++++++++<[       If flag then set up divisor (13) for second division loop
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
>-[>+>>]         Reduce divisor; Normal case: increase remainder
>[+[<+>-]>+>>]   Special case: increase remainder / move it back to divisor / increase quotient
<<<<<-           Decrease dividend
]                    End division loop
>>[<+>-]             Add remainder back to divisor to get a useful 13
>[                   Skip forward if quotient was 0
-[               Decrement quotient and skip forward if quotient was 1
-<<[-]>>     Zero quotient and divisor if quotient was 2
]<<[<<->>-]>>    Zero divisor and subtract 13 from copy if quotient was 1
]<<[<<+>>-]          Zero divisor and add 13 to copy if quotient was 0
]                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
<[-]                     Clear remainder from first division if second division was skipped
<.[-]                    Output ROT13ed character from copy and clear it
<-,+                     Read next character
]                            End character reading loop