C ++, 979969898 859848 바이트
#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)
- 예 : 변환 깊이 8 크기 "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로 변환 된 출력을 다시 사용했습니다
.Edit4 : 이제이 작업이 완료되었습니다. 포인터 산술 변경 및 약간의 제어 흐름 조정이 완료되었습니다.