禁忌のはじまり
―― ”C++完全に理解した”
かつて、僕はかの禁忌の呪文を発したことがある。この言葉は絶大な万能感を詠唱者に与えると同時に、一生かかっても背負うことのできない咎を抱えさせる禁断の呪文だ。
「C++」とは1983年に「C」の拡張言語として開発されたものである。当時、「C」にない保守性や拡張性を追加した画期的な言語であった。その画期的さゆえに、「C++」の利用は瞬く間に広がりあらゆる産業の基盤で利用されることになった。「C++」の登場により人々の暮らしは飛躍的な進化を遂げたのだ。しかし、傲慢な人類はそこで歩みを止めることはなかった。人々は、さらなる豊かさのために「C++」の拡張を続けたのだ。
「C++」は人類の集合知を吸収し続け、進化を続けた。暮らしを便利にするため、豊かにするため……。しかし、それが過ちのはじまりであった。人類の叡智を極めた集大成である「C++」は、度重なる進化と拡張により、かつての友好的な姿を翳らせていった。そう、もはや「C++」は人類の手にあまる領域に到達してしまったのである。
そして、「C++」は今現在も拡張・進化を続けている。人類の理解を超えてもなお進化を続けるのである……。
「C++を完全に理解する」それはすなわち、人類未踏の領域に踏み込むということにほかならないのだ。現代のバベルの塔となった「C++」を完全に理解するということは、神への挑戦であり破滅へのはじまりなのだ。
はい、冒頭謎ポエムではじめましたが、まあいつものことです。特に意味はないので読み飛ばしても構いません。
Yukicoderやることにした
てなわけで、その昔イキリ発車して利用し始めた C++ 知識を腐らせるのもアレなんで競プロ用に使うことにしました。まあ、本音はアルゴリズムについて大して知らんからやるかーってことではじめただけです。
んで、僕のプログラミングの実装能力って一般的なチンパンジー(イッパンジー)ぐらいしかないので、そんな高度なことってできないんですよ。なので、いいのないかなーってネットサフィーンしてたら Yukicoder がゆるふわ競プロとか言う宣伝をしていたのでそれをやることにしました。あと、提出コードがブログとかに貼れるってのもあります……。
やるよー。
とりあえずチュートリアル問題を解いてみます。マクロやら高速化のお作法を調べながらやってたらエライ時間がかかってしまった。そんなの覚えてもアレなんだけど、やっぱりC++使うからには最初から使っていきたいじゃないですか。ちなみに動作の確認はC++14です。
No.9000 Hello World! (テスト用) - yukicoder
あらゆる入力値に対して「Hello World!」に返す問題。入力値なんていらんかったんや。
#include <iostream> using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(false); cout << "Hello World!"; }
#include <iostream>
とかは遅いからC言語スタイルで書けって色んなところで書かれているけど、僕はこっちで書く方が楽なのでできる限りこっちのスタイルで書いていきたい。あと、高速化のおまじないについて知ったのでついでに使ってみた。
No.480 合計 - yukicoder
テスト用問題でないけど、チュートリアルのリンク乗ってたので解いてしまったやつ。1~入力値Nまでの合計出すやつ。
#include <iostream> #define rep(i, n) for(int i=0; i<(int)(n); i++) using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(false); int in; int ans = 0; cin >> in; rep(i, in+1) { ans=ans+i; } cout << ans; return 0; }
repマクロ使いたくてやったやつ。まだ、慣れてないから定義の仕方がよろしくない。
No.9001 標準入出力の練習問題(テスト用) - yukicoder
文字列と整数の受け取り方問題。
#include <iostream> #include <string> using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(false); int a,b; int ans = 0; string s; cin >> a >> b >> s; ans=a+b; cout << ans << ' ' << s; return 0; }
こんな感になりました(特に言うことがない……)。
No.9002 FizzBuzz(テスト用) - yukicoder
みんな大好きFizzBuzzです。
#include <iostream> #define rep(i, n) for(int i=0; i<(int)(n); ++i) using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(false); int in; int ans = 0; cin >> in; rep(i, in) { int n = i + 1; if (n % 15 == 0) { cout << "FizzBuzz\n"; }else if(n % 5 == 0) { cout << "Buzz\n"; }else if(n % 3 == 0){ cout << "Fizz\n"; }else { cout << n << '\n'; } } return 0; }
repマクロを使ってやるぜと言う強い意志のもと実装したらなんかうまく噛み合わなって見づらくなった本日のベストクソコード。
No.9008 空白区切りで与えられる数値データの合計値を求める(テスト用) - yukicoder
No.9009 改行区切りで与えられる数値データの合計値を求める(テスト用) - yukicoder
空白区切りと改行区切りの入力の受け取り方について。cin
使うと何も考えず、思考停止しながら対応できるのでできる限りこっちを使いたい。
#include <iostream> #define rep(i, n) for(int i=0; i<(int)(n); ++i) using namespace std; typedef long long ll; int main() { cin.tie(0); ios::sync_with_stdio(false); int n; ll a, ans(0ll); cin >> n; rep(i, n) { cin >> a; ans += a; } cout << ans << "\n"; return 0; }
入力値がアホみたいにでかいやつを使うってことでtypedef long long ll;
でやってみた。