仕事がはじまってしまいました。

さっそく、絶望的なまでの低レベルすぎる内容でした。

予想はしていましたが・・・

連休あけで、ブルーすぎるのでちょっと簡単な謎解きをしてみました。

割と初期のころから遊んでおります、「とある魔術の禁書目録 幻想収束」。

現在、NieRとコラボ中で、コラボ無いで(自称)不幸な男、上条当麻に届いたメッセージがあります。

まぁ、上の画像を見てもらうとおり、以下のことが分かります。

1. 文字は「0〜9、a〜f」で記述さていていること

2. メッセージであること

3. 先頭の文字が「e」であること

上記のことから、「ユニコード」である可能性が高いと判断。

じゃ、推測どおりであるか確認してみたいと思います。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  //             e6    9c    ac    e5    bd    93    e3    81    ab    e3    80    81
  char a[] = { 0xe6, 0x9c, 0xac, 0xe5, 0xbd, 0x93, 0xe3, 0x81, 0xab, 0xe3, 0x80, 0x81, 0x00 };
  //             e6    9c    ac    e5    bd    93    e3    81    ab    e3    81    82 
  char b[] = { 0xe6, 0x9c, 0xac, 0xe5, 0xbd, 0x93, 0xe3, 0x81, 0xab, 0xe3, 0x81, 0x82, 0x00 };
  //             e3    82    8a    e3    81    8c    e3    81    a8    e3    81   86
  char c[] = { 0xe3, 0x82, 0x8a, 0xe3, 0x81, 0x8c, 0xe3, 0x81, 0xa8, 0xe3, 0x81, 0x86, 0x00 };
  //             e3    81    94    e3    81    96    e3    81    84    e3    81    be
  char d[] = { 0xe3, 0x81, 0x94, 0xe3, 0x81, 0x96, 0xe3, 0x81, 0x84, 0xe3, 0x81, 0xbe, 0x00 };
  //             e3    81    97    e3    81    9f    e3    80    82
  char e[] = { 0xe3, 0x81, 0x97, 0xe3, 0x81, 0x9f, 0xe3, 0x80, 0x82, 0x00 };
  
  printf("%s,", a);
  printf("%s,", b);
  printf("%s,", c);
  printf("%s,", d);
  printf("%s\n", e);
  
  exit(0);
}

っというわけでサッくとやってみました。

さて、実行結果をごらんいただきますと分かりますとおり、「UNICODE」で、「本当に、本当にありがとうございました。」と出力されました。

つまり

e69cace5bd93e381abe38081(本当に、)
e69cace5bd93e381abe38182(本当にあ)
e3828ae3818ce381a8e38186(りがとう)
e38194e38196e38184e381be(ございま)
e38197e3819fe38082(した。)

と表示されていたことが分かります。

ちなみに、昔は2バイト文字(EUCやJIS)でしたが、unicodeは3〜4バイト使用されているため、あるハッシュ計算をすると一意性が担保できずに、大変こまったことが起こって僕の歯が3本かけたり割れたりするほどのプロジェクトがありました。

こちらは、まだクリアできていません。

つえぇよ。