マトリョーシカ的日常

ワクワクばらまく明日のブログ。

ウホウホゴリラnpmをつくった。


この記事はフィヨルドブートキャンプ Advent Calendar 2023 の1日目の記事です。

 フィヨルドブートキャンプというプログラミングスクールに入ってしばらく経った。いろいろな課題をクリアしていくが、その中でオリジナルnpmをつくる、という課題があったのでこれをつくった。

www.npmjs.com


 日本語をゴリラ語に、ゴリラ語を日本語に変換するものである。

なぜこれをつくったか

 エンジニアと人生コミュニティという集まりで、一時期ゴリラが流行っていた。何人かがゴリラになって、語尾にウホをつけたり、「ウホ」スタンプが作成されたりした。ちょうど私もウホ語を理解したいと思っていたため、このようなnpmを作ることになった。

ウとホの二進数

 まずは日本語をウホ語に置き換えることを考えないといけない。単純にやるなら文字をウとホの二進数におきかえればいい。文字コードを二進数に変換し、その0と1をウとホに置き換える。

let charCode = "あ".codePointAt(0);
let binaryCharCode = charCode.toString(2);
console.log(charCode); // => 12354
console.log(binaryCharCode); // => 11000001000010

let uhoWord = binaryCharCode.replace(/0/g, "ウ").replace(/1/g, "ホ");

console.log(uhoWord); //ホホウウウウウホウウウウホウ


ただ、これでは1文字に対して変換される文字数が多すぎる。もうちょっと工夫が必要だ。まず、扱う文字を限定した。アルファベットの大文字とひらがなのみにした。アルファベットの小文字とカタカナはウホ語変換は可能だが、逆変換の際はそれぞれ大文字とひらがなに置き換わるようにした。

console.log(Gorilla.convertToUho("バナナくれ"));

// Output: ホッホウーホ ホッホウホッ ホッホウホッ ウ?ウーッ ホホゥウホホ

console.log(
  Gorilla.convertToHuman(
    "ホッホウーホ ホッホウホッ ホッホウホッ ウ?ウーッ ホホゥウホホ"
  )
);

// Output: ばななくれ

つぎは文字コードをシフトして扱うようにした。例えば、ひらがな「あ」の文字コードは10進数で12354となる。これをある定数で減ずる。アルファベット「A」のコードは65だ。これも別種類の定数で減ずる。そうして扱う文字のコードがすべて256以内で収まるようにする。こうすれば16進数で2桁に置き換えることが可能だ。

一意となるウホ

 こうして扱う文字は2桁のウホに置き換えることになった。そのウホをどうとるか。一意にならないといけない。今回のゴリラnpmは以下のように設定している。

const replacementPatterns = [
  "ウゥ",
  "ウッホ",
  "ウホッ",
  "ウホウ",
  "ウホホ",
  "ウホー",
  "ウホ?",
  "ウーッ",
  "ウーホ",
  "ウ!",
  "ウ?",
  "ホゥ",
  "ホッホ",
  "ホホッ",
  "ホホゥ",
  "ホ!",
]; 


 組み合わせを考えるのが難しかった。任意の2つの要素が組み合わさったとき、ほかの要素で表現ができないようにしないといけないのだ。文字を多くすればいいが、それではまた冗長なウホが生成されてしまう。組み合わさった時のゴリラっぽさも残しておきたかった。

 こうして完成した。

さらなる高みへ

 まだ、やり残したことは多い。このゴリラ語はまだ圧縮できるのではないか。ゴリラ圧縮機能を設けて、よりスタイリッシュなゴリラにしたい。あとはハッシュなどを用いて特定のseedをしらないと解けないようなゴリラ暗号をつくれるようにしたい。合言葉的なあれ。

 フィヨルドブートキャンプはもうちょっとがんばりたい。

Unsplash Marek Piwnicki