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 Scala (judge verdict: Accepted)

import scala.annotation.tailrec
import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer
import scala.io.StdIn._
object Main extends App {

  solve()
  @tailrec def solve(): Unit = {
    val arg = readLine.trim
    if (arg == "#") return
    val state = arg.toState
    val Array(a, b, c, d) = readLine.trim.split(' ').map(_.toInt)
    state(a - 1)(b - 1) = false
    state(c - 1)(d - 1) = true
    println(state.toJfen)
    solve()
  }
  implicit class JfenExpression(val expression: String) extends AnyVal {
    def toState: Array[Array[Boolean]] = {
      val split = expression.split('/')
      val height = split.length
      val width = calWidth(split.head)
      val state = Array.fill(height){Array.fill(width){false}}
      for ((line, i) ← split.zipWithIndex) {
        var j = 0
        for (c ← line) {
          c match {
            case 'b' ⇒
              state(i)(j) = true
              j += 1
            case _ ⇒ j += c.asDigit
          }
        }
      }
      state
    }
    private[this] def calWidth(line: String): Int = {
      line.map{
        case 'b' ⇒ 1
        case c ⇒ c.asDigit
      }.sum
    }
  }
  implicit class State(val state: Array[Array[Boolean]]) extends AnyVal {
    def toJfen: String = {
      var result = Nil: List[String]
      for (line ← state) {
        var state = Nil: List[String]
        val indices = -1 +: line.indices.filter(i ⇒ line(i)) :+ line.length
        for (i ← indices.indices.tail) {
          state :::=  "b" :: (indices(i) - indices(i - 1) - 1).toString :: Nil
        }
        result ::= state.tail.reverse.filter(_ != "0").mkString
      }
      result.reverse.mkString("/")
    }
  }
}