【ネタ】可読性の低いコードを書いてみよう!

プログラミング

こんにちは、えあーです。

可読性の高いコードを書こうと世の中ではよく言われているので、
特に理由もなく逆行してみたいと思います。

題してわかりにくいコード書く作戦。

使用言語はC言語です。
別になんでも良かったので基本的な言語にしました。

今回は日本語は使いません。

環境によっては動かない可能性もありますがご了承ください。
(多分変な文字とか使ってないから動くと思うけど…)

今回犠牲になる基本コード

みんな大好きバブルソートです。

#include <stdio.h>

#define N 10

int main(void)
{
	int i, j, k;
	int array[N] = { 84, 23, 11, 74, 34, 20, 6, 59, 18, 40 };
	
	for (i = 0; i < (N - 1); i++) {
		for (j = (N - 1); j > i; j--) {
			if (array[j] < array[j - 1]) {
				k = array[j];
				array[j] = array[j - 1];
				array[j - 1] = k;
			}
		}
	}

	for (i = 0; i < N; i++) {
		printf("%d ", array[i]);
	}

	return 0;
}

配列は適当に10個宣言しました。
すでにあんまり綺麗じゃないとか言わないでください()

ということでこいつをひどくいじりたいと思います。

改悪開始

さて、どこから手を付けようか。

雑に余分なカッコを減らす

#include <stdio.h>
#define N 10
int main(void){
	int i, j, k;
	int array[N] = { 84, 23, 11, 74, 34, 20, 6, 59, 18, 40 };
	for (i = 0; i < (N - 1); i++)
		for (j = (N - 1); j > i; j--)
			if (array[j] < array[j - 1]) {
				k = array[j];
				array[j] = array[j - 1];
				array[j - 1] = k;
			}
	for (i = 0; i < N; i++)
		printf("%d ", array[i]);
	return 0;}

雑にカッコを減らします。
for文のスコープに1文だけなら{}が省略できるのは有名な話。
1文(1スコープ)でもOKなのでこれでも問題なし。

贅沢な名だね!!

よく見るとarrayとかいう贅沢な名前がいます。
1文字で十分なので1文字にしてしまいましょう。

#include <stdio.h>
#define N 10
int main(void){
	int i, j, k;
	int a[N] = { 84, 23, 11, 74, 34, 20, 6, 59, 18, 40 };
	for (i = 0; i < (N - 1); i++)
		for (j = (N - 1); j > i; j--)
			if (a[j] < a[j - 1]) {
				k = a[j];
				a[j] = a[j - 1];
				a[j - 1] = k;
			}
	for (i = 0; i < N; i++)
		printf("%d ", a[i]);
	return 0;}

まぁまだ余裕。

きりがないのでペースアップします。

スペースもインデントも改行もいらん!

#include <stdio.h>
#define N 10
int main(void){int i,j,k;int a[N]={84,23,11,74,34,20,6,59,18,40};for(i=0;i<(N-1);i++)for(j=(N-1);j>i;j--)if(a[j]<a[j-1]){k=a[j];a[j]=a[j-1];a[j-1]=k;}for(i=0;i<N;i++)printf("%d ",a[i]);return 0;}

だいぶひどくなりました。
プリプロセッサ使うところは改行回避できませんでした。ごめんなさい。

はみ出て横スクロール大変になってきました。すみません。

stdio.hのことよく考えたら知ってたわ。

int main(void){int i,j,k;int a[10]={84,23,11,74,34,20,6,59,18,40};for(i=0;i<9;i++)for(j=9;j>i;j--)if(a[j]<a[j-1]){k=a[j];a[j]=a[j-1];a[j-1]=k;}for(i=0;i<10;i++)printf("%d ",a[i]);return 0;}

環境によりますが、stdio.hは省略してもOKな場合があります。
なので省略してあげます。
ついでに#define N 10もコードに直で書けば不要ということで、
これで1行に収まりました。

ポインタ苦手ですよね?

int main(void){int i,j,k;int a[10]={84,23,11,74,34,20,6,59,18,40};for(i=0;i<9;i++)for(j=9;j>i;j--)if(*(a+j)<*(a+j-1)){k=*(a+j);*(a+j)=*(a+j-1);*(a+j-1)=k;}for(i=0;i<10;i++)printf("%d ",*(a+i));return 0;}

ポインタは苦手な人が多いので、
配列なんて捨ててポインタで参照してあげましょう。

おまじない軽量化作戦

main(){int i,j,k;int a[10]={84,23,11,74,34,20,6,59,18,40};for(i=0;i<9;i++)for(j=9;j>i;j--)if(*(a+j)<*(a+j-1)){k=*(a+j);*(a+j)=*(a+j-1);*(a+j-1)=k;}for(i=0;i<10;i++)printf("%d ",*(a+i));}

mainの周りとreturn 0におさらば。
それ自身が読めるものがだんだん減ってきました。

三項演算子でごちゃごちゃに

main(){int i,j,k,l;int a[10]={84,23,11,74,34,20,6,59,18,40};for(i=0;i<9;i++)for(j=9;j>i;j--){l=(*(a+j)<*(a+j-1)?1:0);k=(l?*(a+j):0);*(a+j)=(k?*(a+j-1):*(a+j));*(a+j-1)=(!l?*(a+j-1):k);}for(i=0;i<10;i++)printf("%d ",*(a+i));}

三項演算子を使ってif文のあたりを意味不明に仕上げます。
intで宣言しているlをboolっぽく使ってるのがミソです。

完成!!

ということで今回出来上がったものが先程のコード。
途中から読んでない人のためにちゃんと貼ります。

main(){int i,j,k,l;int a[10]={84,23,11,74,34,20,6,59,18,40};for(i=0;i<9;i++)for(j=9;j>i;j--){l=(*(a+j)<*(a+j-1)?1:0);k=(l?*(a+j):0);*(a+j)=(k?*(a+j-1):*(a+j));*(a+j-1)=(!l?*(a+j-1):k);}for(i=0;i<10;i++)printf("%d ",*(a+i));}

出力結果は以下の通り。

6 11 18 20 23 34 40 59 74 84

うん、ちゃんとソートできていますね。

バブルソートの課題が出てもこれでバッチリですね!

……こんなコード提出されたら自分なら突っ返しますけどね。

もっと酷いことが出来るという人はコメントで教えてくれると嬉しいです。
できそうだったら反映させます。
※コメント3日くらい反応ないなーと思ったらTwitterで連絡もらえると嬉しいです。
なんかに引っかかって表示されていない可能性が。

以上!解散!

 

コメント