 # rot 13 program in branflakes lmfao

Feb 23rd, 2021
1,421
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. This program enciphers its input with the ROT13 cipher. To do this, it must map characters A-M (ASCII 65-77) to N-Z (78-90), and vice versa. Also it must map a-m (97-109) to n-z (110-122) and vice versa. It must map all other characters to themselves; it reads characters one at a time and outputs their enciphered equivalents until it reads an EOF (here assumed to be represented as either -1 or "no change"), at which point the program terminates.
2. The basic approach used is as follows. Calling the input character x, divide x-1 by 32, keeping quotient and remainder. Unless the quotient is 2 or 3, just output x, having kept a copy of it during the division. If the quotient is 2 or 3, divide the remainder ((x-1) modulo 32) by 13; if the quotient here is 0, output x+13; if 1, output x-13; if 2, output x.
3. Regarding the division algorithm, when dividing y by z to get a quotient q and remainder r, there is an outer loop which sets q and r first to the quotient and remainder of 1/z, then to those of 2/z, and so on; after it has executed y times, this outer loop terminates, leaving q and r set to the quotient and remainder of y/z. (The dividend y is used as a diminishing counter that controls how many times this loop is executed.) Within the loop, there is code to increment r and decrement y, which is usually sufficient; however, every zth time through the outer loop, it is necessary to zero r and increment q. This is done with a diminishing counter set to the divisor z; each time through the outer loop, this counter is decremented, and when it reaches zero, it is refilled by moving the value from r back into it.
5.    -[                       Skip forward if character is 0
6.        >>++++[>++++++++<-]  Set up divisor (32) for division loop
7.                               (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
8.        <+<-[                Set up dividend (x minus 1) and enter division loop
9.            >+>+>-[>>>]      Increase copy and remainder / reduce divisor / Normal case: skip forward
10.            <[[>+<-]>>+>]    Special case: move remainder back to divisor and increase quotient
11.            <<<<<-           Decrement dividend
12.        ]                    End division loop
13.    ]>>>[-]+                 End skip loop; zero former divisor and reuse space for a flag
14.    >--[-[<->+++[-]]]<[         Zero that flag unless quotient was 2 or 3; zero quotient; check flag
15.        ++++++++++++<[       If flag then set up divisor (13) for second division loop
16.                               (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
17.            >-[>+>>]         Reduce divisor; Normal case: increase remainder
18.            >[+[<+>-]>+>>]   Special case: increase remainder / move it back to divisor / increase quotient
19.            <<<<<-           Decrease dividend
20.        ]                    End division loop
21.        >>[<+>-]             Add remainder back to divisor to get a useful 13
22.        >[                   Skip forward if quotient was 0
23.            -[               Decrement quotient and skip forward if quotient was 1
24.                -<<[-]>>     Zero quotient and divisor if quotient was 2
25.            ]<<[<<->>-]>>    Zero divisor and subtract 13 from copy if quotient was 1
26.        ]<<[<<+>>-]          Zero divisor and add 13 to copy if quotient was 0
27.    ]                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
28.    <[-]                     Clear remainder from first division if second division was skipped
29.    <.[-]                    Output ROT13ed character from copy and clear it