codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
/* * 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); }
Private
[
?
]
Run code
Submit