問題(間違い探し)
にわかに話題の AtCoder Beginner Contest 366 B問題 、
自信満々で出したC++コードが「WA」で慌てふためきました。
どこが間違っているでしょう?
B問題の大意
与えられた複数行の文字列を、縦書きに見えるよう出力せよ。
入出力の比較(出題ページ / 提出コード)
※この入力例1も「WA」が出ています。
- | 入力 | 出力 |
---|---|---|
公式の入出力例 | ||
提出コードで コードテスト |
提出したコード
▼関係ない行を削除して整理したもの
#include <bits/stdc++.h>
using namespace std;
#define OVERLOAD_REP(_1, _2, _3, name, ...) name
#define REP1(i, n) for (auto i = std::decay_t<decltype(n)>{}; (i) != (n); ++(i))
#define REP2(i, l, r) for (auto i = (l); (i) != (r); ++(i))
#define rep(...) OVERLOAD_REP(__VA_ARGS__, REP2, REP1)(__VA_ARGS__)
int main() {
int n;
cin >> n;
int max = 0;
int sl;
vector<string> s(n);
rep(i, n) {
cin >> s[i];
sl = s[i].length();
if (max > sl) {
rep(j, max - sl) { s[i].push_back('*'); }
} else {
max = sl;
}
}
rep(i, max) {
for (int j = n - 1; j >= 0; j--) {
cout << s[j][i];
}
cout << endl;
}
}
答え
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
答え. 末尾に余計なスペースが入っていた
(ぜんぜん気付かなかった。。。)
言い訳と日記のコーナー(C++のcout仕様など)
C++ iostream
のcout
は、文字列中のchar
が格納されてない要素にアクセスすると、半角スペースを返すようです。
segmentation fault 等のエラーになるとかでもない様子。
▼検証用に色々出力したもの
int main() {
vector<string> u();
cout << u[0] << "←u[0]" << endl;
cout << u[0][0] << "←u[0][0]" << endl;
vector<string> u2(1);
cout << u2[0] << "←u2[0]" << endl;
cout << u2[0][0] << "←u2[0][0]" << endl;
vector<string> s(3);
s = {"Kamaage", "Udon", "Senmonten"};
cout << s[0][5];
cout << s[1][5];
cout << s[2][5];
}
▼コードテストの標準出力を、手元のVSCodeに貼り付けたとき、末尾のスペースが消失するのに気づかなかったのもツラめでした
▼D問題解き終わったとき(22時09分)、ようやくB問題の「WA」の文字に気づき、何が違うのか分からず半泣きでWAを量産した様子がこちら
▼早めにD問題を提出できて「入緑に近づいたかも」とホクホクしてから一転、蓋を開けたらレート下がってたのが結構ショック。美味しいもの食べて寝ます!さようなら。