1021-Emacs-like Editor
問題概要
Emacsのコマンドをシュミレートするプログラムを作る
考え方
書くだけ。
substr大活躍
実装(C++)
#include <string> #include <vector> #include <iostream> using namespace std; struct Editor : public vector<string>{ int CurX;int CurY; string Buf; Editor(){CurX=0;CurY=0;Buf="";} vector<string>::iterator Iterator(int l){ vector<string>::iterator it=begin(); for(int i=0;i<l;i++)it++; return it; } void Show(){ for(int i=0;i<size();i++){ cout << at(i) << endl; } } void Cmd_a(){ CurX=0; } void Cmd_e(){ CurX=at(CurY).size(); } void Cmd_p(){ if(CurY!=0)CurY--; Cmd_a(); } void Cmd_n(){ if(CurY!=size()-1)CurY++; Cmd_a(); } void Cmd_f(){ if(CurX!=at(CurY).size()){ CurX++; }else if(CurX==at(CurY).size()&&CurY!=size()-1){ Cmd_n(); } } void Cmd_b(){ if(CurX!=0){ CurX--; }else if(CurX==0&&CurY!=0){ CurY--; Cmd_e(); } } void Cmd_d(){ if(CurX!=at(CurY).size()){ (*this)[CurY]=at(CurY).substr(0,CurX)+at(CurY).substr(CurX+1); }else if(CurX==at(CurY).size()&&CurY!=size()-1){ (*this)[CurY]+=at(CurY+1); erase(Iterator(CurY+1)); } } void Cmd_k(){ if(CurX==at(CurY).size()&&CurY!=size()-1){ (*this)[CurY]+=at(CurY+1); erase(Iterator(CurY+1)); Buf="\n"; }else if(CurX!=at(CurY).size()){ Buf=at(CurY).substr(CurX); (*this)[CurY]=at(CurY).substr(0,CurX); } } void Cmd_y(){ if(Buf=="")return; if(Buf=="\n"){ insert(Iterator(CurY+1),at(CurY).substr(CurX)); (*this)[CurY]=at(CurY).substr(0,CurX); CurY++;CurX=0; }else{ (*this)[CurY]=at(CurY).substr(0,CurX)+Buf+at(CurY).substr(CurX); CurX+=Buf.size(); } } void Cmd(string cmd){ if(cmd=="a"){ Cmd_a(); } if(cmd=="e"){ Cmd_e(); } if(cmd=="p"){ Cmd_p(); } if(cmd=="n"){ Cmd_n(); } if(cmd=="f"){ Cmd_f(); } if(cmd=="b"){ Cmd_b(); } if(cmd=="d"){ Cmd_d(); } if(cmd=="k"){ Cmd_k(); } if(cmd=="y"){ Cmd_y(); } } }; int main(){ string tmp; Editor ed; while(1){ getline(cin,tmp); if(tmp=="END_OF_TEXT")break; ed.push_back(tmp); } while(1){ getline(cin,tmp); if(tmp=="-")break; ed.Cmd(tmp); } ed.Show(); }