Task

Implement functions to encrypt and decrypt a message using the straddling checkerboard method. The checkerboard should take a 28 character alphabet (A-Z plus a full stop and an escape character) and two different numbers representing the blanks in the first row. The output will be a series of decimal digits.

Numbers should be encrypted by inserting the escape character before each digit, then including the digit unencrypted. This should be reversed for decryption.




$key2val = ["A"=>"30", "B"=>"31", "C"=>"32", "D"=>"33", "E"=>"5", "F"=>"34", "G"=>"35",
        "H"=>"0", "I"=>"36", "J"=>"37", "K"=>"38", "L"=>"2", "M"=>"4", "."=>"78", "N"=>"39",
        "/"=>"79", "O"=>"1", "0"=>"790", "P"=>"70", "1"=>"791", "Q"=>"71", "2"=>"792",
        "R"=>"8", "3"=>"793", "S"=>"6", "4"=>"794", "T"=>"9", "5"=>"795", "U"=>"72",
        "6"=>"796", "V"=>"73", "7"=>"797", "W"=>"74", "8"=>"798", "X"=>"75", "9"=>"799",
        "Y"=>"76", "Z"=>"77"];
 
$val2key = array_flip($key2val);
 
function encode(string $s) : string  {
    global $key2val;
 
    $callback = function($c) use ($key2val) { return $key2val[$c] ?? ''; };
 
    return implode(array_map($callback, str_split(strtoupper($s))));
}
 
function decode(string $s) : string {
     global $val2key;
 
     $callback = function($c) use ($val2key) { return $val2key[$c] ?? ''; };
 
     preg_match_all('/79.|7.|3.|./', $s, $m);
 
     return implode(array_map($callback, $m[0]));
}   
 
function main($s) {
    $encoded = encode($s);
    echo $encoded;
    echo "\n";
    echo decode($encoded);    
}
 
main('One night-it was on the twentieth of March, 1888-I was returning');