2014年10月26日

C#で文字変換表に基く文字列の変換

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その44

■問題 (出題者: mc さん)
UNIXのtrコマンドや、Perlのtr演算子のように、指定した対応づけに従って文字を変換する関数を作成して下さい。
予め言語内に用意されている場合は、(1)一般的な使用法と、(2)より進んだ使用方法を提示して下さい。

'ABCDEF'と'abcdef'等すべて対応する文字を書く必要があるものを、(1)基本版、'A-Z'と'a-z'のように"-"で範囲を指定できるものを(2)拡張版、2を更に発展させたものを(3)発展版とします。任意のものを選んで解答して下さい。
実行例. (与えられた文字列が、"typewriter"の場合)
tr 'qwertyuiop' 'QWERTYUIOP' "typewriter"
=> TYPEWRITER
1
2
3
4
5
6
7
8

;; 基本版/Arc
(def tr (orig subst str)
  (tostring
   (each c str
     (pr (aif (pos c orig) (subst it) c)))))

(tr "qwertyuiop" "QWERTYUIOP" "typewriter")
;=>"TYPEWRITER"



ここでは、基本版だけのコードを書きました。
問題文には、"変換する関数"とありますが、C#らしくここではクラスTranscoderを定義することとしました。

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace Doukaku.Org {
    class Transcoder {
        private Dictionary<char,char> dict = new Dictionary<char,char>();

        public Transcoder(string from, string to) {
            for (int i = 0; i < to.Length; i++ )
               dict.Add(from[i], to[i]);
        }

        public string Execute(string s) {
            StringBuilder sb = new StringBuilder();
            foreach (var c in s) {
                if (dict.ContainsKey(c))
                    sb.Append(dict[c]);
                else
                    sb.Append(c);               
            }
            return sb.ToString();
        }
    }
}

あまりにも普通すぎるコードですが、まあ良しとしましょう。 普通が一番です。
このクラスの使用例は、こんな感じ。

class Program {
    static void Main(string[] args) {
        Transcoder tr = new Transcoder("qwertyuip","QWERTYUIP");
        Console.WriteLine(tr.Execute("typewriter"));
        Console.ReadLine();
    }
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52383411