Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

jfen

H × W の盤面で遊ぶ一人用ゲームがある．このゲームはそれぞれのセルに 0 か 1 個のボールがあるのでそれを移動させるゲームである．あなたはこのゲームで遊んでいたが，ボールは非常に丸いため，セルからセルへ正確にボールを移動させるのが難しいことに気づいた．そこであなたは，命令通りにボールを動かしてくれるロボットを作ることにした．ここで，セルを表す表記として (y, x) という表記を用いる．これは y 行目の x 列目のセルを表す．

ロボットへの命令は 4 つの整数 a, b, c, d で与えられる．これは (a, b) にあるボールを (c, d) に移動することを表す．このとき，(a, b) にボールが存在し， (c, d) にボールが存在しないことが保証される．

盤面の状態は，"jfen" と呼ばれる次の記法で表される．

[1 行目のデータ]/[2 行目のデータ]/.../[H 行目のデータ]

この記法は盤面の各行を表すデータをスラッシュ区切りで連結したものである．各行のデータは文字列で表され，1 列目からW列目にあるセルの状態を左から順に記述している．この文字列は数字と文字 'b' で表され，数字が表す整数は連続した空白のセル数を，'b' はボールが存在するセルを表している．ここで，各行のデータで整数が連続してはならない．また，各行のデータに書かれている整数の総和と 'b' の個数の和は必ず W になる．

例として，次のような盤面状態を考える．空白のセルを '.' で表し，ボールが存在するセルを 'b' で表現している．この例の i 行目の左から j 文字目は盤面の i 行目の j 列目のセルの状態を表す．

....
.b.b
....

上記の盤面を jfen で表記すると次のようになる．

4/1b1b/4

ロボットに現在の盤面の状態と 1 つのボールを動かす命令を与えた時に，ロボットがボールを動かした後の盤面を出力するプログラムを作成せよ．このとき，出力する盤面は jfen 記法で出力せよ．

Input

入力は複数データセットからなる．
各データセットは以下の形式からなる．

S
a b c d

各データセットは 2 行からなり，最初の行には盤面の状態を表す jfen 形式の文字列 S が与えられる．ここで， 盤面のサイズは 2 ≤ W, H ≤ 9 を満たす．続く行にはロボットへの命令が与えられる．これは (a, b) にあるボールを (c, d) に移動させる命令を表す．また，入力の終わりは # で表される．

Output

出力は各データセットごとに命令を実行したあとの盤面の状態を jfen 記法で表した文字列 1 行である．出力行には他の文字があってはならない．

Sample Input

b1/1b
1 1 1 2
b5/bbbbbb
2 4 1 4
b2b2b/7
1 4 2 4
#

Output for Sample Input

1b/1b
b2b2/bbb1bb
b5b/3b3

1番目の入力の初期状態は次のようになる．

b．
.b

(1,1) のボールを (1,2) に移動させるので命令後の盤面は次のようになる．

.b
.b

Solution in C# (judge verdict: Accepted)

using System;
using System.Linq;
using System.Text;

namespace Aizu {
    public class OnlineJudge {
        static void Main() {
            var output = new StringBuilder();
            for (var input = string.Empty; (input = Console.ReadLine()) != "#";) {
                var lines = input.Split('/');
                var board = Enumerable.Range(0, lines.Length)
                    .Select(i =>
                        string.Join("b",
                            lines[i]
                                .Split('b')
                                .Select(q => new String('.', string.IsNullOrEmpty(q) ? 0 : int.Parse(q)))
                                .ToArray())
                        .ToCharArray())
                    .ToArray();

                var command = Console.ReadLine().Split().Select(q => int.Parse(q) - 1).ToArray();
                board[command[0]][command[1]] = '.';
                board[command[2]][command[3]] = 'b';

                for (int i = 0; i < lines.Length; ++i) {
                    for (int j = 0; j < board[i].Length;) {
                        var block = board[i].Skip(j).TakeWhile(c => c == board[i][j]).ToArray();
                        j += block.Length;
                        output.Append(block.First() == '.' ? block.Length.ToString() : new string(block));
                    }

                    output.Append('/');
                }

                output.Length -= 1;
                output.AppendLine();
            }

            Console.Write(output.ToString());
        }
    }
}