いくらなんでも長過ぎる。

というわけで添削というか書き直し。

JavaScript

こんなもんでしょ。

#!/usr/bin/js
// decode
print(function(s){
  var d = {};
  for (var i = 0; i < 36; i++){
    d['0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.charAt(i)]
    = '456789ABCDE2FGHIJKL0MNOP1QRS3TUVWXYZ'.charAt(i);
  }
  return s.replace(/./g, function(m){return d[m]})
}('8MLDQ6TUI6TFMLRHAANRA6Q8EFLDMQ86II2O32S5J13JXOJ'));
// encode
print(function(s){
  var e = {};
  for (var i = 0; i < 36; i++){
    e['456789ABCDE2FGHIJKL0MNOP1QRS3TUVWXYZ'.charAt(i)]
    = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.charAt(i);
  }
  return s.replace(/./g, function(m){return e[m]})
}('CONGRATULATIONSKEEPSEARCHINGORCALL6176390570X10'));

Perl

だともっと短く。まさに一行野郎。

#!/usr/bin/perl -l
$_ = '8MLDQ6TUI6TFMLRHAANRA6Q8EFLDMQ86II2O32S5J13JXOJ';
# decode
tr/0-9A-Z/4-9A-E2F-L0M-P1Q-S3T-Z/;
print;
# encode
tr/4-9A-E2F-L0M-P1Q-S3T-Z/0-9A-Z/;
print;

要するに単一換字式暗号。総当たりだと36!通りだけど、そこまで大変じゃないし、しかも暗号表が「あまりシャッフルされていない」ので、単換字暗号だと当たりを付ければ解くのはそれほど難しくないはずだけど、アルファベットだけではなく数字がハッシュされているのがポイントか。

GEPTKHTSEP3F1GHS