Panda Noir

JavaScript の限界を究めるブログです。

ひらがなからローマ字への変換可能パターンを列挙するプログラムをつくった

タイピングソフトを作っていたときに、かなり使えそうなローマ字変換プログラムをつくれたので単体で公開することにしました。たぶんほぼ入力可能な方法は網羅できていると思います。

プログラム概要

たとえば「ちゃっぷりん」を変換するとき、「tyappurinn」ともできますし、「chixyaxtsupurinn」とも入力できます。誰がこんな変態入力するんだ

こうなってくると全パターンを列挙したくなるのがプログラマの性です。しかし、本当の意味で全パターンを列挙するのはアホらしいですよね。「『ちゃ』はtya、tixya、cha、chixyaで入力できる」というように各文字の可能パターンを列挙すれば十分です。

このように各文字の可能パターンを列挙するgetRoman関数を作りました。コードは最後に載せてあります。

使い方

実際に「ちゃっぷりん」を変換してみます。

const str = 'ちゃっぷりん';
let i = 0;
let res = '', difficult;
while (i < str.length) {
    const _res = getRoman(str, i);
    res += _res[0][0]; // 入力可能な中で一番ポピュラーっぽいものを選ぶ
    difficult += _res[0].pop(); // 入力可能入力可能な中で一番めんどくさそうなものを選ぶ
    i += _res[1]; // 変換対象となった文字数の分だけ進める
}
console.log(res);
console.log(difficult);

実行すると

tyappurinn
chixyaxtsupurinn

と出力されます。もちろん全パターン列挙もできます。

const str = 'ちゃっぷりん';
let i = 0;
let res = [''];
while (i < str.length) {
    const [pattern, count] = getRoman(str, i);
    const _res = [];
    for (let j = 0; j < pattern.length; j++)
        _res.push(...res.map(item => item + pattern[j]));
    res = _res;
    i += count;
}
console.log(res);

実行結果はこんな感じです。

[ 'tyappurinn',
  'chappurinn',
  'tixyappurinn',
  'chixyappurinn',
  'tyaxtupurinn',
  'chaxtupurinn',
  'tixyaxtupurinn',
  'chixyaxtupurinn',
  'tyaxtsupurinn',
  'chaxtsupurinn',
  'tixyaxtsupurinn',
  'chixyaxtsupurinn' ]

仕様について

簡単な仕様説明をします。

  • 「っ」の後ろに文字がない、あるいは「っ」の後ろがアルファベットや数字、記号の場合、「「xtu、xtsu」で入力できる」という結果を返す
  • 「ん」を入力する際、直後に「ナ行」「ア行」「ヤ行」が続く、または後ろに文字がない場合、「nnで入力できる」という結果を返す
  • 「ん」を入力する際、上記以外の場合、「nで入力できる」という結果を返す
  • 「ん」の直後で、「ナ行」「ア行」「ヤ行」でない、たとえば「か」の場合、「「ka、nka」で入力できる」という結果を返す

あとはふつうに返します。4番についてのみ解説したいと思います。

たとえば「あんかー」と入力する場合、「anka-」「annka-」のどちらでも入力できます。しかし、「ん」が「n、nnで入力できる」としてしまうとタイピングソフトをつくるときに不都合が生じてしまいます。そこで、「ん」はnのみで入力できるとして、次の「か」が「ka、nkaで入力できる」というようにしました。

今回、ローマ字入力の規格ってないのかなと探したところ、すでに廃止になってました。2017年現在、きちんと決まった規格はないようです。一応このプログラムはJIS X 4063:2000に準拠しています。

コード

JS Bin on jsbin.com

2017/10/1 追記

「laで『ぁ』が打てるしもっとパターン増えるな」という趣旨のコメントをいただきました。たしかにWindows環境ではそうなのですが、Mac版では違った結果となった記憶があった(実機が手元にないのでハッキリとしませんが)のと、今回はブラウザで動くタイピングソフトということだったので環境によらずに入力できる範囲にしようと思いあえて実装しませんでした。しかし、これ単体の時にはlaで「ぁ」が打てるよう設定した方がいいなと思ったので書きました。

ちなみに、「っちゃ」を入力するときに「xtutixa」のほかに「xtutila」「ltutixa」「ltutila」が可能となったために、12パターンだったものが30パターンに膨れ上がりました。

JS Bin on jsbin.com