For encrypting strings this region of chars is given (in this order!):
* all letters (ascending, first all UpperCase, then all LowerCase)
* all digits (ascending)
* the following chars: `.,:;-?! '()$%&"` 
These are 77 chars! (This region is zero-based.)
Write two methods: 
```python
def encrypt(text)
def decrypt(encrypted_text)
```
Prechecks:
1. If the input-string has chars, that are not in the region, throw an Exception(C#, Python) or Error(JavaScript).
2. If the input-string is null or empty return exactly this value!
For building the encrypted string:
1. For every second char do a switch of the case.
2. For every char take the index from the region. Take the difference from the region-index of the char before (from the input text! Not from the fresh encrypted char before!). (Char2 = Char1-Char2)
Replace the original char by the char of the difference-value from the region. In this step the first letter of the text is unchanged.
3. Replace the first char by the mirror in the given region. (`'A' -> '"'`, `'B' -> '&'`, ...)
Simple example:
* Input:  `"Business"`
* Step 1: `"BUsInEsS"`
* Step 2: `"B61kujla"`
  * `B -> U`
    * `B (1) - U (20) = -19`
    * `-19 + 77 = 58`
    * `Region[58] = "6"`
  * `U -> s`
    * `U (20) - s (44) = -24`
    * `-24 + 77 = 53`
    * `Region[53] = "1"`
* Step 3: `"&61kujla"`
This kata is part of the Simple Encryption Series:
Simple Encryption #1 - Alternating Split
Simple Encryption #2 - Index-Difference
Simple Encryption #3 - Turn The Bits Around
Simple Encryption #4 - Qwerty
Have fun coding it and please don't forget to vote and rank this kata! :-)
from string import ascii_lowercase as l, ascii_uppercase as u, digits as di
encrypt=lambda s:doall(s)
decrypt=lambda s:doall(s,True)
def doall(s,d=False):
    if not s:return s
    all_char = list(u+l+di+".,:;-?! '()$%&" + '"')
    s = "".join([j.swapcase() if i & 1 else j for i, j in enumerate(s)]) if not d else s
    new,well = [],[all_char[-1-all_char.index(s[0])]]
    for i in range(len(s) - 1):
        c_ = well[-1] if d else s[i]
        t_ = s[i + 1]
        diff = all_char.index(c_) - all_char.index(t_)
        well.append(all_char[diff])
        new.append(all_char[diff])
    encode = all_char[-1 - all_char.index(s[0])] + "".join(new)
    decode = "".join([j.swapcase()if i&1 else j for i,j in enumerate("".join(well))])
    return [encode,decode][d]
from string import ascii_lowercase as l, ascii_uppercase as u, digits as di
encrypt=lambda s:doall(s)
decrypt=lambda s:doall(s,True)
def doall(s,d=False):
    if not s:return s
    all_char = list(u+l+di+".,:;-?! '()$%&" + '"')
    s = "".join([j.swapcase() if i & 1 else j for i, j in enumerate(s)]) if not d else s
    new,well = [],[all_char[-1-all_char.index(s[0])]]
    for i in range(len(s) - 1):
        c_ = well[-1] if d else s[i]
        t_ = s[i + 1]
        diff = all_char.index(c_) - all_char.index(t_)
        well.append(all_char[diff])
        new.append(all_char[diff])
    encode = all_char[-1 - all_char.index(s[0])] + "".join(new)
    decode = "".join([j.swapcase()if i&1 else j for i,j in enumerate("".join(well))])
    return [encode,decode][d]