C ++、979 969 898 859 848バイト
#include<cstdio>
#include<cstdlib>
#define K 400
#define L 400
#define M (i*)malloc(sizeof(i))
#define a(C,X,Y)if(C&&b[Y][X].c){t->n=M;t=t->n;b[Y][X].d=d+1;t->n=0;t->c=X;t->d=Y;}
#define A(n,d)case n:d;break;
#define F fgetc(f)
#define W(A,B) for(A=0;A<B;A++){
struct i{int c;int d;int v;i*n;}b[L][K]={0},*h,*t;float m=0;int main(){FILE*f=fopen("d","r+b");int x,y,d=0;W(y,L)W(x,K)b[y][x].c=F<<16|F<<8|F;}}rewind(f);x=165,y=155;h=M;h->c=x;h->d=y;b[y][x].d=d;t=h;while(h){i*p=b[h->d]+h->c;if(p->v)h=h->n;else{p->v=1;x=h->c;y=h->d;d=p->d;m=d>m?d:m;a(x>0,x-1,y)a(x<K-1,x+1,y)a(y>0,x,y-1)a(y<L-1,x,y+1)}}W(y,L)W(x,K)i p=b[y][x];unsigned char n=-1,h=p.d/(m/n),R=h%43*6,Q=n*(n-(n*R>>8))>>8,t=n*(n-(n*(n-R)>>8))>>8,r,g,b;switch(h/43){A(0,n,t,0)A(1,Q,n,0)A(2,0,n,t)A(3,0,Q,n)A(4,t,0,n)A(5,n,0,Q)}d=h?r|g<<8|b<<16:p.c?-1:0;fwrite(&d,1,3,f);}}}
- 入力:RGBデータファイル(ファイルに含まれる:d)
- 出力:
RGBA RGBデータファイル(ファイルに出力:d)
- 例:convert -depth 8 -size "400x400" test.png d.rgb && mv -f d.rgb d && g ++ -o test main.c && ./test
- 注:画像のサイズと開始はソースレベルで制御されます。これが問題である場合は、50バイトか何かを追加してください。
直接的な「ウルフ」ではありませんが、これは私が最初にモックしたCプロトタイプでした。
#include "stdio.h"
#include "stdlib.h"
struct i{
unsigned int c;
int d;
int v;
}b[400][400]={0};
typedef struct q{
int x;
int y;
struct q *n;
}q;
q *qu;
q *t;
float m=0;
int get_dist(int x, int y)
{
int d = 0;
}
void flood(int x,int y,int d){
qu=malloc(sizeof(q));
qu->x=x;qu->y=y;b[y][x].d=d;
t=qu;
while(qu){
struct i *p = &b[qu->y][qu->x];
if(p->v){qu=qu->n; continue;}
p->v=1;x=qu->x;y=qu->y;d=p->d;
#define a(C,X,Y) if(C&&b[Y][X].c){t->n=malloc(sizeof(q));t=t->n;b[Y][X].d=d+1;t->n=0;t->x=X;t->y=Y;}
a(x>0,x-1,y);
a(x<399,x+1,y);
a(y>0,x,y-1);
a(y<399,x,y+1);
m=p->d>m?p->d:m;
}
}
unsigned int C(int h)
{
int r=0,g=0,b=0;
int s=255,v=255;
unsigned char R, qq, t;
R = h%43*6;
qq = (v * (255 - ((s * R) >> 8))) >> 8;
t = (v * (255 - ((s * (255 - R)) >> 8))) >> 8;
switch (h / 43){
case 0: r = v; g = t; break;
case 1: r = qq; g = v; break;
case 2: g = v; b = t; break;
case 3: g = qq; b = v; break;
case 4: r = t; b = v; break;
case 5: r = v; b = qq; break;
}
return r|(g<<8)|(b<<16)|255<<24;
}
#define F fgetc(f)
int main()
{
FILE *f=fopen("d", "r+b");
for(int y=0; y<400; y++){
for(int x=0; x<400; x++){
b[y][x].c = (F<<24)|(F<<16)|(F<<8);
}
}
rewind(f);
flood(165,155,1);
m/=255.f;
for(int y=0; y<400; y++){
for(int x=0; x<400; x++){
struct i p = b[y][x];
unsigned int h = C(p.d/m);
int o = p.c?-1:255<<24;
if(p.d)fwrite(&h,4,1,f);
else fwrite(&o,4,1,f);
}
}
}
多くの概念は類似していますが、確かに無数の小さな変更があります。これをCとしてコンパイルするには、C11を使用する必要があります(C99はおそらく動作しますが、C11でのみ厳密にテストしました)。
私はこの挑戦をとても楽しんだ。何か新しいことに挑戦するアイデアをくれてありがとう:)。
編集:ゴルフが少し良くなりました。
Edit2:ピクセル構造体とキューが同じになるように2つの構造体をマージし、マクロをさらに酷使し、一連の符号なし文字を定義するときに-1として定義できるように255をリフローし、最後に関数呼び出しを削除しました。
Edit3:いくつかの変数、演算子の優先度の調整、およびアルファチャネルを保存するRGBに変換された出力を
再利用しました。Edit4:これでこれで完了です。ポインター演算の変更とわずかな制御フローの調整。