Problem 1101 : A Simple Offline Text Editor

問題概要

次のような操作の出来る簡易エディタのシミュレートをせよ。

forward char
カーソルを一字分進める
forward word
カーソルを、カーソルより右の単語で最も左にある単語の末尾に移動する
backward char
カーソルを一字分戻す
backward word
カーソルを、カーソルより左の単語で最も右にある単語の先頭に移動する
insert "any-text"
any-textを現在のカーソル位置に挿入する 挿入後のカーソル位置は、挿入語句の直後になる
delete char
現在のカーソルのすぐ右の文字を削除する
delete word
現在のカーソルより右にある単語のうち最も左側にある単語を削除する 次の単語までにスペースがある場合それも削除する

入力は、初期テキストと、コマンドの個数、およびコマンドで与えられる。

解法

問題文が微妙に曖昧な気がするので、サンプルから詳細を読み取る必要がある。
(特にward関係のコマンド)
delete wordは、現在のカーソル位置から、その単語の最後までを削除するコマンドであり(すなわち、カーソルが単語の途中にある場合単語の最初の部分は残る)
forward wordは現在のカーソル位置がある単語の末尾へ移動するコマンドである。


それを読み取ったらあとは注意深く実装すればおk.

ソースコード

string text,in;
int cur,len;

int main()
{
  int CS,n; cin>>CS; cin.ignore();
  rep(cs,CS){
    getline(cin,text);
    cin>>n; cin.ignore();
    len=text.size();
    cur=0;
    rep(i,n){
      getline(cin,in);
      if(in=="forward char")cur=min(cur+1,len);
      else if(in=="backward char")cur=max(cur-1,0);
      else if(in=="delete char"){
	if(cur>=text.size())continue;
	text.erase(text.begin()+cur); len--;
      }
      else if(in.find("insert")!=in.npos){
	int s=in.find('"'),t=in.find('"',s+1);
	text=text.substr(0,cur)+in.substr(s+1,t-s-1)+text.substr(cur);
	cur+=t-s-1; len+=t-s-1;
      }
      else if(in=="forward word"){
	for(;cur<len&&text[cur]==' ';cur++);
	for(;cur<len&&text[cur]!=' ';cur++);
      }
      else if(in=="backward word"){
	for(;cur>0&&text[cur-1]==' ';cur--);
	for(;cur>0&&text[cur-1]!=' ';cur--);
      }
      else if(in=="delete word"){
	int s=cur,t;
	for(;text[s]==' ';s++);
	if(s>=len)continue;
	for(t=s;text[t]!=' '&&t<len;t++);
	text=text.substr(0,cur)+text.substr(t); len-=t-cur;
      }
    }
    cout<<text.substr(0,cur)<<"^"<<text.substr(cur)<<endl;
  }
  return 0;
}