もっとも異常なデータ構造
xxxxxxxxxx
#include <stdio.h>
#define A(a) G a();
#define B(a) G (*a)();
#define C(a,b) G a() { printf(b); return X; }
typedef struct F G;A(a)A(b)A(c)A(d)A(e)A(f)A(g)A(h)A(i)A(j)A(k)A(l)A(m)A(n)A(
o)A(p)A(q)A(r)A(s)A(t)A(u)A(v)A(w)A(x)A(y)A(z)A(S)A(N)void Q();struct F{B(a)B
(b)B(c)B(d)B(e)B(f)B(g)B(h)B(i)B(j)B(k)B(l)B(m)B(n)B(o)B(p)B(q)B(r)B(s)B(t)B(
u)B(v)B(w)B(x)B(y)B(z)B(S)B(N)void(*Q)();}X={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,
q,r,s,t,u,v,w,x,y,z,S,N,Q};C(a,"z")C(b,"y")C(c,"x")C(d,"w")C(e,"v")C(f,"u")C(
g,"t")C(h,"s")C(i,"r")C(j,"q")C(k,"p")C(l,"o")C(m,"n")C(n,"m")C(o,"l")C(p,"k"
)C(q,"j")C(r,"i")C(s,"h")C(t,"g")C(u,"f")C(v,"e")C(w,"d")C(x,"c")C(y,"b")C(z,
"a")C(S," ")C(N,"\n") void Q(){}main(){X=g().s().v().S().j().f().r().x().p().
S().y().i().l().d().m().S().u().l().c().S().q().f().n().k().v().w().S().l().e
().v().i().S().g().s().v().S().o().z().a().b().S().w().l().t().N();}
引用元:https://www.ioccc.org/1990/pjr.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1990/pjr.hint
固定メッセージを出力するだけ。
$ gcc -o pjr pjr.c
$ ./pjr
the quick brown fox jumped over the lazy dog
X=g().s().v().S().j().f().r().x().p().
…というメソッドチェーンのようなコード。
1関数が1文字を出力する。
.a()
はz
、.b()
はy
、.c()
はx
というように、abc順を反転した文字を出すとのこと。
実現するためには構造体を使えばよい。大まかには次のような構造になっている。
// 関数プロトタイプ宣言
struct F a();
struct F b();
struct F c();
...
// 肝となる構造体
struct F {
struct F (*a)(), (*b)(), (*c)(), ...;
} X = { a, b, c, ... };
// 関数定義(かならずXを返す)
struct F a() { printf("a"); return X; }
struct F b() { printf("b"); return X; }
struct F c() { printf("c"); return X; }
...
main(){
X = a().b().c()...;
}
一発ネタの難読化でシンプルにまとめられている。