blob: 3ce3fafd33f1a51b8dbb503728a997ff505b0484 (
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
|
-,+[ ; 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
|