アットウィキロゴ

Emacs-like Editor

1021 : Emacs-like Editor



解説

コマンドによって何度か文字列の操作を行い、その結果を出力する。
書いてある通りにコーディングすればいい・・・が、よく分からないところでWAになりやすい。
とりあえず、
  • 最初に与えられる文章を一行ずつ読み込む(空白が含まれている可能性がある)
  • コマンドYでバッファに改行があるときの処理に注意する
あたりが気をつけるべきポイントか。

最悪、プログラムを見比べながら間違いを見つけてください・・・

プログラム

C


C++

+ ...
#include <iostream>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
 
int main() {
    vector<string> v;
 
    for (int i = 0; ; i++) {
        string w;
        getline(cin, w);
        if (w == "END_OF_TEXT") break;
        v.push_back(w);
    }
 
    string c, buf;
    int x = 0, y = 0;
    while (cin >> c) {
        if (c == "-") break;
         
        if (c == "a") {
            x = 0;
        } else if (c == "e") {
            x = v[y].size();
        } else if (c == "p") {
            if (y >= 1) y--;
            x = 0;
        } else if (c == "n") {
            if (y < v.size()-1)  y++;
            x = 0;
        } else if (c == "f") {
            if (x != v[y].size()) x++;
            else if (y < v.size()-1 && x == v[y].size()) {
                y++;
                x = 0;
            }
        } else if (c == "b") {
            if (x != 0) x--;
            else {
                if (y >= 1) {
                    y--;
                    x = v[y].size();
                }
            }
        } else if (c == "d") {
            if (x != v[y].size()) {
                v[y] = v[y].substr(0, x) + v[y].substr(x+1);
            } else {
                if (y < v.size()-1) {
                    v[y] += v[y+1];
                    for (int i = y+1; i < v.size()-1; i++) v[i] = v[i+1];
                    v.pop_back();
                }
            }
        } else if (c == "k") {
            if (x != v[y].size()) {
                buf = v[y].substr(x);
                v[y] = v[y].substr(0, x);
            } else {
                if (y < v.size()-1) {
                    v[y] += v[y+1];
                    for (int i = y+1; i < v.size()-1; i++) v[i] = v[i+1];
                    v.pop_back();
                    buf = "RETURN";
                }
            }
        } else if (c == "y") {
            if (buf.empty()) {
                // 何もしない
            } else if (buf == "RETURN") {
                string w = "";
                 
                v.push_back("");
                for (int i = v.size()-1; i > y+1; i--) {
                    v[i] = v[i-1];
                }
                if (x != v[y].size()) {
                    w = v[y].substr(x);
                    v[y] = v[y].substr(0, x);
                }
                y++;
                x = 0;
            } else {
                v[y] = v[y].substr(0, x) + buf + v[y].substr(x);
                x += buf.size();
            }
        }
    }
 
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << endl;
    }
 
     
 
    return 0;
}

Java


  • WAになったプログラム
+ ...
#include<iostream>
#include <string>
using namespace std;

const int MAX = 100;

int main(){
	string s[MAX+1];
	for (int i = 0; i <= MAX; i++) s[i] = "";

	for (int i = 0; ; i++) {
		string w;
	cin >> w;
		if (w == "END_OF_TEXT") break;
		s[i] += w + "!";
	}

	string c, buf = "";
int x = 0, y = 0;
	while (cin >> c) {
		if (c == "-") break;

		if (c == "a") {
			x = 0;
		} else if (c == "e") {
			x = s[y].size()-1;
		} else if (c == "p") {
			x = 0;
		if (y > 0) {
 				y--;
			}
		} else if (c == "n") {
			x = 0;
			if (s[y+1] != "") {
				y++;
			}
		} else if (c == "f") {
			if (x == s[y].size()-1) {
				if (s[y+1] != "") {
					x = 0;
					y++;
				}
		} else {
				x++;
			}
		} else if (c == "b") {
			if (x == 0) {
				if (y > 0) {
					y--;
					x = s[y].size()-1;
				}
			} else {
				x--;
		}
		} else if (c == "d") {
			if (x == s[y].size()-1) { // 行末にある
				if (s[y+1] != "") {
					s[y] = s[y].substr(0, s[y].size()-1) + s[y+1];
					for (int i = y+1; i <= MAX-1; i++) {
						s[i] = s[i+1];
					}
			}
			} else { // 行末にない
				s[y] = s[y].substr(0, x) + s[y].substr(x+1);
			}
		} else if (c == "k") {
			if (x == s[y].size()-1) { // 行末にある
			if (s[y+1] != "") {
					s[y] += s[y+1];
					for (int i = y+1; i <= MAX; i++) {
						s[i] = s[i+1];
					}
					buf = "!";
				}
			} else { // 行末にない
				buf = s[y].substr(x, s[y].size()-x-1);
				s[y] = s[y].substr(0, x) + "!";
				x = s[y].size()-1;
			}
		
		} else if (c == "y") {
			if (buf != "") {
				if (buf == "!") { // 改行
					string w = s[y].substr(x);
					s[y] = s[y].substr(0, x-1);
					for (int i = MAX; i >= y+2; i--) s[i] = s[i-1];
					s[y+1] = w;
					y = y+1;
					x = 0;
				} else {
				s[y] = s[y].substr(0, x) + buf + s[y].substr(x);
					x += buf.size();
				}
			}
		}

		cout << "x = " << x << endl;
		cout << "y = " << y << endl;
	cout << "buf = " << buf << endl;
		for (int i = 0; s[i] != ""; i++) {
			cout << s[i] << endl;
		}
		cout << endl;
	}

	for (int i = 0; s[i] != ""; i++) {
		cout << s[i].substr(0, s[i].size()-1) << endl;
	}
	
	return 0;
}
最終更新:2013年01月13日 16:44