Java

Javaで実装する「ひんたぼ語」変換

sasakiyu
sasakiyu
たけしの挑戦状、舞台化おめでとうございます。

舞台「たけしの挑戦状 ビヨンド」

ひんたぼ語とは

1986年にファミリーコンピュータ向けに発売された伝説のクソゲー「たけしの挑戦状」。ひんたぼ語はそのゲームの登場するひんたぼ島の住人が使用する言語で、「あ」→「い」や「う」→「え」のように日本語の仮名を1文字シフトしたような言語です(ただし濁点「゛」は半濁点「゜」に変換するなど少し特殊)。

あくまのちから て゛へ゛るまん → いけみはつきり と゜ほ゜れみっ

見た瞬間ひるんでしまうようなひんたぼ語ですが、使用する文字の範囲やシフトする文字数が決まっているため、シーザー暗号の要領で日本語⇔ひんたぼ後の変換が可能です。

Javaで実装するシーザー暗号 シーザー暗号とは 概要 シーザー暗号とは単一換字式暗号のひとつで、文字列の各文字を辞書順に3文字分シフトして暗号文を作る暗...

たけしの挑戦状とは

「たけしの挑戦状」は1986年12月10日に発売された、アクションアドベンチャーゲームです。このゲームの企画に参加し、アイディアを出したのは、タレント、映画監督として現在も活躍しているビートたけし氏。皮肉にみちたネタの数々、不条理ともいえる難易度など、それまでにはなかった型破りなゲームとして、多くの話題を呼びました。

[VC たけしの挑戦状 より]

実装のポイント

変換処理自体に特に注意しなければないことはありません。対象とする文字、対応する文字さえ押さえておけば、シンプルに実装することができます。

対象とする文字

  • 「あ」から「ん」までのひらがな、一部の記号、数字が対象
  • 濁音と半濁音については、濁点と半濁点を切り離し、それらもシフトする
  • 小文字は「っ」「ゃ」「ゅ」「ょ」のみ
  • 記号は「?」「゛」「゜」「×」「ー」のみ

対象する文字

日本語ひんたぼ語
日本語ひんたぼ後
゛(※)
×
×ー(※)
 
01
12
23
89
90(※)

※実際の文字の対応が不明確なものがあるが、復号化の都合上一部想定で対応させている

実装方法

アルファベットの範囲であれば単純なカウントアップで十分ですが、マルチバイト文字が対象のため Apache Commons Lang3 の StringUtils.replaceChars() を使用した方法が簡単です。

下はMavenでの定義例ですが、プロジェクト管理ツールを使っていない場合はこちらからjarをダウンロードしてプロジェクトに追加してください。

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

ソースコード

変換対象となる文字を並べた文字列(あいうえお..)、対応する文字を並べた文字列(いうえおか..)をStringUtils.replaceChars() に渡すことで、1文字ずつ文字列を変換できます。元の言語に戻す場合は引数を入れ替えてください。

package net.develman.convert;

import org.apache.commons.lang3.StringUtils;

public class HintaboEncode {

    final static String NIHONGO = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんっゃゅょ?゛゜×ー0123456789";
    final static String HINTABO = "いうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんっゃゅょ?゛゜×ーあ1234567890";

    public static final void main(String[] args) {

        //変換対象の文字列
        String source = "て゛へ゛るまん";

        System.out.println("変換する文字列      :" + source);

        //ひんたぼ語に変換する
        String hintabo = toHintabo(source);

        System.out.println("変換後(日本語→ひんたぼ語):" + hintabo);

        //ひんたぼ語に変換する
        String nihongo = toNihongo(hintabo);

        System.out.println("変換後(ひんたぼ語→日本語):" + nihongo);
    }

    /**
     * 日本語→ひんたぼ語
     */
    public static String toHintabo(String str) {
        return StringUtils.replaceChars(str, NIHONGO, HINTABO);
    }

    /**
     * ひんたぼ語→日本語
     */
    public static String toNihongo(String str) {
        return StringUtils.replaceChars(str, HINTABO, NIHONGO);
    }
}

実行結果

変換する文字列      :て゛へ゛るまん
変換後(日本語→ひんたぼ語):と゜ほ゜れみっ
変換後(ひんたぼ語→日本語):て゛へ゛るまん

さらに

対象外の文字列(漢字、カタカナ等)を除外したり、「だ」から「た」「゛」へ濁音を分解したりといった手間を加えることで、変換不可にならないようにしましょう。

余談

2019年9月現在、「たけしの挑戦状 ビヨンド」のHPにアクセスすると「きむっけ゜せあっ」としか表示されません。日本語に直すと「かみんく゛すーん」です。乞うご期待ってことですね。

ABOUT ME
sasakiyu
ひ弱で優しい少年だったが、デーモンと合体。 強大な力を得つつも人間の心を失わないデベルマンとなる。