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
|
+
|
... |
#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