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; }