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个字节或其他内容-老实说,我只是不在乎更改它。
不完全是直接的“ ungolf”,但这是我首先模拟的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:合并了两个结构,所以我的像素结构和队列是相同的,更多地使用了宏,并重用了255,以便在定义一系列无符号字符时可以将其定义为-1,最后删除了一个函数调用。
Edit3:重用了一些变量,对运算符优先级进行了调整,并将输出转换为RGB,从而保存了Alpha通道
Edit4:我想我现在已经完成了,一些指针算法的更改和轻微的控制流调整。