Cでコードゴルフしたのでまとめました。

ぬるからです
社内で開催されたコードゴルフコンテストをガリガリ書いてました。
幾らかコードゴルフの知識もついたので、まとめます。

なお、gccのc17でコンパイル確認しているため
環境によっては通ったり通らなかったりするかもしれません。

・巨大な配列の宣言方法。
999999以上の配列を宣言したい場合
int a[999999]
とするより
int a[2<<20]
と、シフト演算を使った方がいいです。
配列の宣言だけでなく、大きな数値を打ち込みときはどっちが短いかを考えて方が良さそうです。

・グローバル変数、関数の宣言
クローバル変数は
int a,b;
としなくても
a,b;
だけで、int型として宣言できます。
関数も同様に、返り値の型を省略すればintが返り値の関数として宣言できます。
また、Cはintの返り値にreturnがなくても動くため。voidの関数を作る際も、型を省略してintとして宣言した方がお得です。

・関数の引数
これも型を省略できます。
また、
a(b,c,d)
と宣言した関数は
a(0)
と、少ない引数で呼べます。これに関しては原理は謎です。
a(d){int b,c;}
a(0)

a(d,b,c){}
a(0)
とできます。ただ、b,cには不定値が入るため、初期化は必須です。

・代入処理
a=b=c=0
とイコールを繋げて書くと、一番右の数字がそれぞれの変数に入ります。
(おそらくですが、右から評価される+代入処理は代入した値が返り値になる。ため、右から0が入っていくのだと思います)

・for
ループはwhileよりforの方がいいです。
これは、
while()
for(;;)
の文字数はかわらないのですが、
n=0;while()a++,n++;
for(n=0;;n++)a++;
とforの中に色々と埋め込めるからです。
forに埋め込むと、セミコロン分お得になります。

・ループの条件
5回、回したい場合は
for(i=0;i<5;i++)

for(i=0;i++<5;)
とします。
(ただ、0~4が1~5に変わるため注意です)

また、Cは0が偽でそれ以外が真のため

for(i=5;i--;)
とすれば、かなりスッキリします。
(逆順なるので注意)

・フラグのたてかた

f=0;
for(i=0;i<10;i++){
if(b()) f=1
]

は、

f=0;
for(i=0;i<10;i++){
f|=b()
]

と論理演算を使うとスッキリします。
論理和なので、どれか一回でもb()が真だと、fも真となります。
ただ、b()の返り値によっては、fの値が1とは限らなくなるので注意です。

・配列とポインタ
b[0]は*bと書いた方がお得です。
これ以外にもポインタで書いた方がいいケースは多々あるため、考える必要があります。

・&&と||
処理や値によりますが&&や||ほ&や|に書き換えられます。


1&&2&&3=1
ですが
1&2&3=0
となるため、置き換えれないです。また、
n<10&&a[n]
のように、&&の左が偽の場合、右の評価を行わないことを利用した、配列外参照のガードも置き換えれないです。(&は最後まで評価しきります)

入ってくる値や処理を見極めながら、置き換えられるかは判断する必要があります。

・三項演算子
if(a==1){b=8;} else{b=10;}

a==1?b=8:b=10;
と三項演算子を使った方がお得です。
また、
if(a==1){b=8;}
だけの場合は
a==1&&b=8
と、&&が最後まで評価しないことを利用した方がお得です。

・==
a==2

a-2
と書いた方が得です。これも0以外は真を使っています。

・ドモルガン
if(!b&&!c){a(); }else {b();}
は、ドモルガンの定理で真偽を入れ換えて
if(b||c){b();}else{a();}
と書くと、!が二つ消せてスッキリします。

・printf
数字はprintfで出力ですが、文字や文字列はputcharやputsを使った方が短いです。

・真偽を数値とみる
if(!a())n++

n+=a();
と書いた方がいいです。Cではtrue=1,false=0として計算に使えます。
これは、コートゴルフじゃなくても使える手です。
x円の物を買うのに必要な10円玉の枚数は?
と言う問題を
x/10+x%10!=0
と答えられます。割りきれない場合は端数分の10円玉がいるので、それを後半の条件文で表しています。
(多分、仕事で書くとレビューで怒られるので、お仕事ソースコードでは使わない方が無難です)

・大事なのは
上記の方法は所謂、小手先の方法です。
アルゴリズムの見直し、無駄な処理や宣言、記載の見直し等で大きく縮める方が大事かなと思います。

・コードゴルフのまとめ
楽しい!!!
プチコンにハマっていた時に、一画面プログラムが流行った理由が分かります。

この記事が気に入ったらサポートをしてみませんか?