[ create a new paste ] login | about

Link: http://codepad.org/NnxwEul5    [ raw code | fork ]

C, pasted on Jun 28:
/*
 * struct FJIには、
 * iとjの開始、終了の範囲と、
 * ループ中での各ポイントABCで実行される関数(SJI型)のポインタの配列と、
 * その関数中で処理されるデータ、もしくはデータのコンテナをセットし、
 * それを run_FJI()することで、forループが実行される。
 *
 * for(j=0; j<10; j++) {
 *         A:
 *         for(i=0; i<10; i++) {
 *                 B:
 *         }
 *         C:
 * }
 * 各ポイントA,B,Cで、とくに処理の必要が無い箇所には nul_sji をセットする。これは空の関数のインライン関数。
 */

const int w=10,h=18;
typedef struct {
	int p[18][10];
} _B;
_B Z,E={.p = {[0][0 ... 9]=1, [0 ... 17][0]=1, [0 ... 17][9]=1, [17][0 ... 9]=1}};

#include <stdio.h>
#include <stdlib.h>

typedef void* (*SJI)(const void* _s, const int j, const int i);

struct FJI{
	int i, j;
	int i0, ie;
	int j0, je;
	void* src;
	SJI sji[3];
};

inline void* nul_sji(const void* _s, const int j, const int i){}

run_FJI(struct FJI* a)
{
	for(a->j = a->j0; a->j < a->je; a->j++) {
		a->sji[0](a->src, a->j, a->i);
		for(a->i = a->i0; a->i < a->ie; a->i++) {
			a->sji[1](a->src, a->j, a->i);
		}
		a->sji[2](a->src, a->j, a->i);
	}
}

R(_B* a)
{
	void* sji1(const void* _s, const int j, const int i)
	{
		_B* a=(_B*)_s;
		a->p[j][i]=(rand()%5)+2;
	}

	struct FJI b = {
		.i0 = 1, .ie = w - 1,
		.j0 = 1, .je = h - 1,
		.src = (void*)a,
		.sji = {nul_sji, sji1, nul_sji}
	};
	
	run_FJI(&b);
}

P(_B* a)
{
	void* sji1(const void* _s, const int j, const int i)
	{
		_B* a=(_B*)_s;
		const int p=a->p[j][i];
		printf("%c[%dm%d",0x1b,p+40,p);
	}

	void* sji2(const void* _s, const int j, const int i)
	{
		putchar('\n');
	}

	struct FJI b = {
		.i0 = 0, .ie = w,
		.j0 = 0, .je = h,
		.src = (void*)a,
		.sji = {nul_sji, sji1, sji2}
	};
	
	run_FJI(&b);
	
	printf("%c[%dm\n",0x1b,0);
}

C(_B* d, _B* a)
{
	void* _C0_1(const void* _s, int j, int i)
	{
		_B** s=(_B**)_s;
		const int p=s[0]->p[j][i];
		if(p<2){return;}
		if(p==s[0]->p[j][i+1]){s[1]->p[j][i]++;}
		if(p==s[0]->p[j][i-1]){s[1]->p[j][i]++;}
		if(p==s[0]->p[j+1][i]){s[1]->p[j][i]++;}
		if(p==s[0]->p[j-1][i]){s[1]->p[j][i]++;}
	}	
		
	void* _C1_1(const void* _s, int j, int i)
	{
		_B** s=(_B**)_s;
		const int p=s[0]->p[j][i];
		if(p<2){return;}
		int q=0;
		if(p==s[0]->p[j][i+1]){q+=s[1]->p[j][i+1];}
		if(p==s[0]->p[j][i-1]){q+=s[1]->p[j][i-1];}
		if(p==s[0]->p[j+1][i]){q+=s[1]->p[j+1][i];}
		if(p==s[0]->p[j-1][i]){q+=s[1]->p[j-1][i];}
		s[2]->p[j][i]=q+1;
	}
	
	void* _C2_1(const void* _s, int j, int i)
	{
		_B** s=(_B**)_s;
		const int p=s[0]->p[j][i];
		if(p<2){return;}
		if(p==s[0]->p[j][i+1]){if(s[2]->p[j][i+1]>3){s[3]->p[j][i]=1;}}
		if(p==s[0]->p[j][i-1]){if(s[2]->p[j][i-1]>3){s[3]->p[j][i]=1;}}
		if(p==s[0]->p[j+1][i]){if(s[2]->p[j+1][i]>3){s[3]->p[j][i]=1;}}
		if(p==s[0]->p[j-1][i]){if(s[2]->p[j-1][i]>3){s[3]->p[j][i]=1;}}
	}

	_B b,c;
	b=c=*d=Z;
	_B* src[4] = {a, &b, &c, d};
	
	struct FJI _C[3] = {
		{
			.i0 = 1, .ie = w - 1,
			.j0 = 1, .je = h - 1,
			.src = (void*)src,
			.sji = {nul_sji, _C0_1, nul_sji}
		},
		{
			.i0 = 1, .ie = w - 1,
			.j0 = 1, .je = h - 1,
			.src = (void*)src,
			.sji = {nul_sji, _C1_1, nul_sji}
		},
		{
			.i0 = 1, .ie = w - 1,
			.j0 = 1, .je = h - 1,
			.src = (void*)src,
			.sji = {nul_sji, _C2_1, nul_sji}
		}
	};
	
	void* __C_1(const void* _s, int j, int i)
	{
		run_FJI((struct FJI*)_s + i);
	}
	
	struct FJI __C = {
		.i0 = 0, .ie = 3,
		.j0 = 0, .je = 1,
		.src = (void*)_C,
		.sji = {nul_sji, __C_1, nul_sji}
	};
	
	run_FJI(&__C);
}

main()
{
	{volatile int _;srand(_);}
	_B a=E,d;
	R(&a);
	P(&a);
	C(&d, &a);
	P(&d);
}


Create a new paste based on this one


Comments: