Problem C: Emacs-like Editor
Emacs とはUNIXのプログラマ等多くのコンピュータ技術者に愛用されているテキストエディタである。
Emacs の魅力は矢印キーを使わなくともカーソルを移動できることにある。例えば、Control キーを押しながらf、b、n、pを押せばカーソルをそれぞれ右、左、下、上に1つ移動することができる。また、カットアンドペーストなどの操作もキーボードのみで可能であり、マウスを使うことなく文章を素早く作成することができる。
あなたの仕事は、Emacsの簡易版エディタの操作をシミュレートするプログラムを作成することである。プログラムは、文章を読み込み、与えられた操作を実行した後の文章を出力しなければならない。
文章は複数の行から構成され、各行は0個以上のアルファベットと空白を含む文字から構成される。文字を含まない場合は空行となる。
また、このエディタには1つの文字または行末を指し示す1つのカーソルをもつ。文字がない空行であってもカーソルは行末を指すことができる。
さらにこのエディタは、1つの文字列または1つの改行を保持しておくことができる1つのバッファを持つ。
与えられる操作は以下のものを含む(対象となる行が空行である場合は、「先頭文字」を「行末」と置き換えて読むこと):
-
a
カーソルを現在の行の先頭文字に移動する。
-
e
カーソルを現在の行の行末に移動する。
-
p
上に行があれば、カーソルを上の行の先頭文字に移動する。
上に行がなければ、カーソルを先頭文字に移動する。
-
n
下に行があれば、カーソルを下の行の先頭文字に移動する。
下に行がなければ、カーソルを先頭文字に移動する。
-
f
カーソルが行末にない場合、カーソルを1つ右に移動する。
カーソルが行末にありかつ下に行がある場合は、カーソルを下の行の先頭文字へ移動する。
それ以外の場合は何もしない。
-
b
カーソルが先頭文字でないならば、カーソルを1つ左に移動する。
カーソルが先頭文字でありかつ上に行がある場合は、カーソルを上の行の行末へ移動する。
それ以外の場合は何もしない。
-
d
カーソルが文字を指す場合はその文字を削除する。削除された文字の右側の文字列は左にシフトされる。
カーソルが行末を指し下に行がある場合は、下の行をそのままカーソルの位置に繋げる。以下の行は上にシフトされる。
それ以外の場合は何もしない。
-
k
カーソルが行末にある場合、下に行があれば、d と同じ操作をしバッファに1つの改行を記録する。
カーソルが行末にない場合、カーソルが指す文字を含めた右側すべての文字を切り取りそれをバッファに記録する。カーソルは元の行の行末を指すようになる。全ての記録においてバッファは上書きされる。
それ以外の場合は何もしない。
-
y
バッファが空の場合はなにもしない。
バッファの内容が改行の場合、カーソルが指す文字の直前で改行を行う。カーソルは新しい行の先頭文字へ移動する。
バッファの内容が文字列の場合、カーソルの位置にバッファの内容を挿入する。
カーソルの位置はもともと指していた文字または行末の場所へ移動する。
文章が入力された時点でカーソルは1行目の1文字目を指しており、バッファは空である。
Input
1つのデータセットが与えられる。まず先に1つの文章が複数の行によって与えられる。文章の終わりは
"END_OF_TEXT"
という1行で示され("は含まない)、この行は文章には含まれない。
続いて、コマンドが複数行で与えられる。各行に1つのコマンドが1文字で与えられる。'-' がコマンド入力の終わりを示す。
Output
入力された文章に対して、与えられたコマンドを実行した後の文章を出力せよ。
Constraints
- 入力で与えられる文章の行数 ≤ 10
- 入力で与えられる文章の各行の文字数 ≤ 20
- コマンドの数 ≤ 300
- 処理をしている過程での最大行数 ≤ 100
- 処理をしている過程での1行の最大文字数 ≤ 1000
Sample Input
hyo
ni
END_OF_TEXT
f
d
f
f
k
p
p
e
y
a
k
y
y
n
y
-
Output for the Sample Input
honihoni
honi