最速になる translate() 関数を考える
叩かれ台ならすぐに思いつくのだけれど、「最速」となると・・・
<!DOCTYPE html> <title></title> <script> (function () { var hankaku = [ ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[','\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~' ]; var zenkaku = [ ' ','!','”','#','$','%','&','’','(',')','*','+',',','−','.','/', '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?', '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', 'P','Q','R','S','T','U','V','W','X','Y','Z','[','¥',']','^','_', '‘','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z','{','|','}','〜' ]; var haiueo = [ 'ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ', 'ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ', '。', '「', '」', '、', '・', 'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゙', '゚' ].concat (hankaku); var zaiueo = [ 'ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ','ダ','ヂ','ヅ','デ','ド','バ', 'ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ', '。','「','」','、','・','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ー', 'ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ', 'チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ', 'ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','゛','゜' ].concat (zenkaku); var z2aiueo = [ 'カ゛','キ゛','ク゛','ケ゛','コ゛','サ゛','シ゛','ス゛','セ゛','ソ゛','タ゛','チ゛','ツ゛','テ゛','ト゛','ハ゛', 'ヒ゛','フ゛','ヘ゛','ホ゛','ハ゜','ヒ゜','フ゜','へ゜','ホ゜', '。','「','」','、','・','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ー', 'ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ', 'チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ', 'ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','゛','゜' ].concat (zenkaku); var zhaiueo = [ 'が','ぎ','ぐ','げ','ご','ざ','じ','ず','ぜ','ぞ','だ','ぢ','づ','で','ど','ば', 'び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ', '。','「','」','、','・','を','ぁ','ぃ','ぅ','ぇ','ぉ','ゃ','ゅ','ょ','っ','ー', 'あ','い','う','え','お','か','き','く','け','こ','さ','し','す','せ','そ','た', 'ち','つ','て','と','な','に','ぬ','ね','の','は','ひ','ふ','へ','ほ','ま','み', 'む','め','も','や','ゆ','よ','ら','り','る','れ','ろ','わ','ん','゛','゜' ].concat (zenkaku); function translate (string, ary1, ary2) { var result = []; var len = string.length; var ary0 = string.split (''); var i; var idx; for (i = 0; i < len; i++) { idx = ary1.indexOf (ary0[i]); result[i] = (idx < 0) ? ary0[i]: ary2[idx]; } return result.join (''); } // 前方一致で置き換える function translate2 (string, ary1, ary2) { var result = []; var max = string.length; var cnt = 0; var idx = 0; var len; var tgt; var I = ary1.length; var i; // ary1.sort (comparisonOfLength); while (cnt < max) { next: { for (i = 0; i < I; i++) { len = String(ary1[i]).length; tgt = string.substring (cnt, cnt + len); idx = ary1.indexOf (tgt); if (-1 < idx) { result.push (ary2[idx]); cnt += len; break next; } } result.push (string.substring (cnt, cnt+1)); cnt++; } } return result.join (''); } function comparisonOfLength (a, b) { var len_a = a.length; var len_b = b.length; return (len_b - len_a) - (len_a - len_b); } function toHankaku (string) { return translate (string, zenkaku, hankaku); } function toZenkaku (string) { return translate (string, hankaku, zenkaku); } function toZenkakuKATAKANA (string) { return translate2 (string, haiueo, zaiueo); } function toHankakuKATAKANA (string) { return translate (string, zaiueo, haiueo); } this.covertCharacter = { toHankaku : toHankaku, toZenkaku : toZenkaku, toZenkakuKATAKANA : toZenkakuKATAKANA, toHankakuKATAKANA : toHankakuKATAKANA } })(); var zen = 'ゲッ!ヤツラニ、ギャフントイワセタイモノダ!'; document.write([zen, covertCharacter.toHankakuKATAKANA (zen)].join("<br>")); </script>