2015年03月18日

C#であみだくじ

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その78
■問題 (出題者:greentea さん)
次のような書式で与えられた「あみだくじ」があります。 (あみだくじはコード中に埋め込んでも、標準入力や 外部ファイルから読み込んでも、書きやすい方法でかまいません)

A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |

このあみだくじをたどって
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
のように結果を表示させるプログラムを作ってください。

記号 '-' が「入れ替え」を意味するってことが分かれば、それほど難しい問題ではないですね。

using System;
using System.IO;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var lines = File.ReadAllLines("amidakuji.txt");
            Amidakuji amida = new Amidakuji(lines);
            string s = amida.Solve();

            foreach (var line in lines)
                Console.WriteLine(line);
            Console.WriteLine(s);
            Console.ReadLine();
        }
    }
   
    class Amidakuji {
        string[] lines;
        public Amidakuji(string[] lines) {
            this.lines = lines;
        }

        public string Solve() {
            // 先頭には、A,B,C,D,E といった文字が入っている。
            char[] head = lines[0].ToCharArray();
            for (int j = 1; j < lines.Length; j++) {
                for (int k = 1; k < lines[j].Length; k += 2)
                    if (lines[j][k] == '-') {
                        // - は 入れ替えに他ならない。- の左右を入れ替える。
                        char temp = head[k - 1];
                        head[k - 1] = head[k + 1];
                        head[k + 1] = temp;
                    }
            }
            return new string(head);
        }
    }
}

実行結果です。

入力

A B C D E F
| | |-| | |
|-| | |-| |
| |-| |-| |
|-| |-| |-|
| |-| |-| |
|-| | | |-|
| | | | | |

出力

A B C D E F
| | |-| | |
|-| | |-| |
| |-| |-| |
|-| |-| |-|
| |-| |-| |
|-| | | |-|
| | | | | |
C D B F E A



 

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

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