この記事はフィヨルドブートキャンプ Advent Calendar 2023 の1日目の記事です。
フィヨルドブートキャンプというプログラミングスクールに入ってしばらく経った。いろいろな課題をクリアしていくが、その中でオリジナルnpmをつくる、という課題があったのでこれをつくった。
日本語をゴリラ語に、ゴリラ語を日本語に変換するものである。
なぜこれをつくったか
エンジニアと人生コミュニティという集まりで、一時期ゴリラが流行っていた。何人かがゴリラになって、語尾にウホをつけたり、「ウホ」スタンプが作成されたりした。ちょうど私もウホ語を理解したいと思っていたため、このような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をしらないと解けないようなゴリラ暗号をつくれるようにしたい。合言葉的なあれ。
フィヨルドブートキャンプはもうちょっとがんばりたい。