この記事はKogakuin Univ Advent Calendar 2022 - Adventar 7日目です。
頼むから残りの枠を埋めて下さいお願いします。
ご挨拶
こんばんは。metarinです。
ネタがないのでコードを書く量を減らす方法でも書こうと思います。
突然ですが
これを解いてみて下さい
https://atcoder.jp/contests/abc280/tasks/abc280_a
…はい。一瞬で解けたかと思います。
ではコードのバイト数を数えてみましょう。
言語にもよると思いますがだいたい100~200B程度なのではないでしょうか?
今回の記事ではC言語で60BのACコードを書いていきます。
一応執筆時点(2022/12/07/21:59)でのC言語のShortest(のはず)です。
解説
入力の#
の数を数えればいいだけです。
Cで実装したものがこちら
#include <stdio.h>
int main() {
int ans = 0;
int ch;
while(ch=getchar(),ch!='\xff') {
ans += ch == '#';
}
printf("%d",ans);
return 0;
}
いちおうコードを削るために気をつけた点をいくつか
- 1文字ずつ
getchar
で取得し、終了条件をEOF
で判定 - 出力に
\n
がなくても通るので%d
で出力
さてこれをどうやって削るかを説明していきます。
変数名の変更
長い変数名は無駄でしかないので任意の1字変数に置換します。
可読性なんてものはありません。
インクルードの削除
gccにおいて定義されてない関数を呼んでも警告なのでコンパイルが通る。
この場合実行時に関数の解決ができずコケるはずなのですがgccは自動的にlibcをリンクするのでインクルードしなくてもlibcにある関数を呼び出すことができます。
空白の削除
C言語においてインデントや改行は原則可読性以外の意味を持たないので削除できます(プリプロセッサ行は改行の意味がある)。
変数のグローバル化
変数をグローバルで宣言すると値が0で初期化されるので初期化分のコードを削れます。
型宣言の省略
グローバル空間では型の宣言を省略することが許容されています。その場合型はintになります。
これはmain関数に対しても適用可能なので最低でも4B、数値変数を使う場合は変数の数*4B削れます。
結果
出来上がったコードがこちらです。
https://atcoder.jp/contests/abc280/submissions/37077325
まとめ
コードの量が減りました。
言語仕様に詳しくなったり、可読性が終わったコードを読み慣れたりするので得るものは以外とあります。