Problem:
B: Shortest Crypt

問題

xryuseixくんの学校では暗号が流行している. 格子状の街に住んでいるxryuseixくんは集合場所を決める新しい暗号を考えた.

暗号文は $N$ 文字の文字列 $S$ からなり, $S_i$ の文字によって現在地からの移動方向を決める. 移動方向に関しては以下の通りである.

A ~ M : 北に１マス進む.

N ~ Z : 南に１マス進む.

a ~ m : 東に１マス進む.

n ~ z : 西に１マス進む.

さて,ここでxryuseixくんは, yryuseiyちゃんにデートの集合場所を暗号文で教えようと思ったのだが, 暗号文が冗長なことに気づいた.

例えば,「ANA」という暗号文があったとしよう. これは北に $1$ マス進み, 南へ $1$ マス進んだのち北へ $1$ マス進む.
これは北に $1$ マス進む暗号文と等価なので,「ANA」＝「A」と, 簡潔にできる. xryuseixくんはyryuseiyちゃんに遠回りをさせないよう,暗号文を簡潔にしようと思った.

そこであなたはxryuseixくんに変わって, 暗号文を簡潔にするプログラムを書くことになった.
なお, 「暗号文を簡潔にする」とは,「元の暗号文と同じ目的地へ行く最も短い暗号文を作る」ということである.

制約

$N$ は整数であり, $S_i$ は大文字または小文字のアルファベットである.

$1 \leq N \leq 10^{5}$

入力形式

入力は以下の形式で与えられる.

$N$

$S$

出力

$1$ 行目に簡潔にした後の暗号文の長さ, $2$ 行目にその暗号文を出力せよ.
答えとしてありうる暗号文が複数存在する場合, どれを出力してもよい.
また各行の末尾に改行を出力せよ.

サンプル

サンプル入力 1

5
ANazA

サンプル出力 1

1
A

サンプル入力 2

7
ACMICPC

サンプル出力 2

5
HIJKL

サンプル入力 3

4
AIZU

サンプル出力 3

0

簡潔にした暗号文(空の文字列)のあとに改行が必要なことに注意.

Solution in Scala (judge verdict: Accepted)

object Main extends App {
  import scala.io.StdIn._
  val n = readInt()
  val crypt = readLine.trim
  val coordinate = crypt.foldLeft(Coordinate(0, 0)){
    case (pos, c) if 'A' to 'M' contains c ⇒ pos.copy(y = pos.y - 1)
    case (pos, c) if 'N' to 'Z' contains c ⇒ pos.copy(y = pos.y + 1)
    case (pos, c) if 'a' to 'm' contains c ⇒ pos.copy(x = pos.x + 1)
    case (pos, c) if 'n' to 'z' contains c ⇒ pos.copy(x = pos.x - 1)
    case _ ⇒ ???
  }
  println(math.abs(coordinate.x) + math.abs(coordinate.y))
  println(encrypt(coordinate))

  case class Coordinate(x: Int, y: Int) {
    def +(that: Coordinate): Coordinate = Coordinate(x + that.x, y + that.y)
  }
  def encrypt(coordinate: Coordinate): String = {
    coordinate match {
      case Coordinate(x, y) if x >= 0 && y >= 0 ⇒ "N" * y + "a" * x
      case Coordinate(x, y) if x >= 0 ⇒ "A" * -y + "a" * x
      case Coordinate(x, y) if x < 0 && y < 0 ⇒ "A" * -y + "n" * -x
      case Coordinate(x, y) ⇒ "N" * y + "n" * -x
    }
  }
}