30 lines
2.1 KiB
Brainfuck
30 lines
2.1 KiB
Brainfuck
-,+[ 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
|
|
|