最悪のスタイル
xxxxxxxxxx
#include <stdio.h>
#include <malloc.h>
main(togo,toog)
int togo;
char *toog[];
{char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79,
ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot:
if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott;
gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0)
goto oggt; goto ggot; ogog: if ( !ogot) goto gogo;
goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto
gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg;
goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo);
goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto
oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3;
goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo;
goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen(
toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto
ggot;}
引用元:https://www.ioccc.org/1987/hines/hines.c
審査員・作者による説明:https://www.ioccc.org/1987/hines/hint.html
テキスト中のgotoの数を教えてくれる。
$ gcc -o hines hines.c
$ ./hines hines.c
24 goto 's
$ cat tmp
gotogotogoto
$ ./hines tmp
3 goto 's
識別子がgotoのアナグラムばかりで、9カラムのような形状。 1つの処理を何かやると必ずgotoを使って次の処理に飛ぶ、というコードになっている。
これはコーディングスタイルに関する時事ネタ。 1968年にDijkstraが構造化プログラミングを提唱する前後に書いた 「Go To Statement Considered Harmful(Go To文は有害と考えられる)」という文書が出て20年弱たったころで、gotoは絶対に使ってはいけないと盲信する人が増えていたところに、1987年3月のCommunications of the ACMに「”GOTO Considered Harmful” Considered Harmful」という反論記事が出て、議論が盛り上がっていた時期。 IOCCC 1987の締切は1987年5月30日なので、その記事を踏まえて作られたのではないかと思う。 少なくとも審査員はそれを踏まえて採択したようで、hint.textでも当該記事に触れている。
無引数のexit();
が動かないので、そこだけ修正した。
xxxxxxxxxx
--- hines.c
+++ hines.c
{char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79,
ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot:
if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott;
-gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0)
+gtot: exit(0);ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0)
goto oggt; goto ggot; ogog: if ( !ogot) goto gogo;
goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto
gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg;