挑战:
编写一个程序,输出1920年像素宽1080像素的图形文件。图形中的每一个2,073,600像素必须是唯一的颜色,不应重复颜色值。颜色应该在RGB中指定,从0,0,0开始,然后向上数到255,255。你会发现一个1920年x 1080像素的图像将包含大量的黑人,蓝色和绿色只。
例如,(较小的缩减版本)。如果高度设置为5,宽度设置为5,则输出25像素的正方形图形,每个像素将是唯一的颜色。RGB颜色数组如下所示:
Array (
[0] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[1] => Array
(
[0] => 0
[1] => 0
[2] => 1
)
[2] => Array
(
[0] => 0
[1] => 0
[2] => 2
)
[3] => Array
(
[0] => 0
[1] => 0
[2] => 3
)
[4] => Array
(
[0] => 0
[1] => 0
[2] => 4
)
[5] => Array
(
[0] => 0
[1] => 0
[2] => 5
)
[6] => Array
(
[0] => 0
[1] => 0
[2] => 6
)
[7] => Array
(
[0] => 0
[1] => 0
[2] => 7
)
[8] => Array
(
[0] => 0
[1] => 0
[2] => 8
)
[9] => Array
(
[0] => 0
[1] => 0
[2] => 9
)
[10] => Array
(
[0] => 0
[1] => 0
[2] => 10
)
[11] => Array
(
[0] => 0
[1] => 0
[2] => 11
)
[12] => Array
(
[0] => 0
[1] => 0
[2] => 12
)
[13] => Array
(
[0] => 0
[1] => 0
[2] => 13
)
[14] => Array
(
[0] => 0
[1] => 0
[2] => 14
)
[15] => Array
(
[0] => 0
[1] => 0
[2] => 15
)
[16] => Array
(
[0] => 0
[1] => 0
[2] => 16
)
[17] => Array
(
[0] => 0
[1] => 0
[2] => 17
)
[18] => Array
(
[0] => 0
[1] => 0
[2] => 18
)
[19] => Array
(
[0] => 0
[1] => 0
[2] => 19
)
[20] => Array
(
[0] => 0
[1] => 0
[2] => 20
)
[21] => Array
(
[0] => 0
[1] => 0
[2] => 21
)
[22] => Array
(
[0] => 0
[1] => 0
[2] => 22
)
[23] => Array
(
[0] => 0
[1] => 0
[2] => 23
)
[24] => Array
(
[0] => 0
[1] => 0
[2] => 24
)
)
规则:
如果你能用非常短的代码来做这件事,你的程序也会给我留下深刻的印象,你的程序还会输出以秒为单位的时间来生成嵌入在顺序像素上的图像,你的程序在10秒内输出图像。如果你的程序在1秒内输出图像,我会印象深刻的。
发布于 2014-01-25 17:06:46
该代码从0-1080*1920创建一个所有整数的集合,然后按总体亮度对它们进行排序。然后创建Mandelbrot集,并根据它们的转义迭代和值对位置进行排序。然后,它通过两组,分配颜色从黑暗到明亮的曼德尔布洛特值最小到最大。最后,它将每像素BMP图像32位写入作为命令行参数指定的输出文件名。
#include <windows.h>
#include <vector>
#include <algorithm>
#define X _complex
#define U int
#define S(j,g)std::sort(j.begin(),j.end(),g);
U w=1920,h=1080;
WORD q[27]={'MB',36918,126,0,0,54,0,40,0,w,0,h,0,1,32,0,0,36864,126};
#define V(a,b)((a>>b)&255)
#define L(z)V(z,16)*.3+V(z,8)*.6+V(z,0)*.1
#define F for(c=0;c<w*h;c++)
U C(U a,U b){return L(a)<L(b);}
U M(X a,X b){return a.x<b.x;}
U main(U c,char**v){
std::vector<U>l;
std::vector<X>D;
F l.push_back(c);
U*i=new U[c];
DWORD p;
F{float r=0,i=0,R;p=0;
for(;p<w&&r*r+i*i<4;p++){R=r*r-i*i;i=2*r*i+(c/w-h/2)/400.;r=R+(c%w-w/2)/400.;}
X d={-p-r*r-i*i,c};
D.push_back(d);}
S(l,C)
S(D,M)
F i[(U)D[c].y]=l[c];
void*f=CreateFileA(v[1],4<<28,0,0,2,0,0);
WriteFile(f,q,54,&p,0);
WriteFile(f,i,w*h*4,&p,0);}
代码并不是完全的黄金,但它不会变得太小。
发布于 2014-01-24 22:18:15
我最初有一些与青色,洋红和黄色的角和平滑的颜色分级,这看起来真的很好,但它不符合规格。
以下是实现规格:使用“第一”2,073,600种颜色,没有重复,并在左上角黑色。
它的工作原理很酷。它构建一个带有颜色的数组,然后根据不同的标准进行几次垂直和水平排序。最终的结果是令人愉悦的蓝绿之间和暗与光之间的过渡。它大约需要1.5秒才能运行。编译使用:gcc -o many many.c -lm
和运行使用:./many > many.ppm
#include <stdlib.h>
#include <stdio.h>
#define W 1920
#define H 1080
typedef struct {unsigned char r, g, b;} RGB;
int S1(const void *a, const void *b)
{
const RGB *p = a, *q = b;
int result = 0;
if (!result)
result = (p->b + p->g * 6 + p->r * 3) - (q->b + q->g * 6 + q->r * 3);
return result;
}
int S2(const void *a, const void *b)
{
const RGB *p = a, *q = b;
int result = 0;
if (!result)
result = p->b - q->b;
if (!result)
result = p->g - q->g;
if (!result)
result = q->r - p->r;
return result;
}
int main()
{
int i, j, n;
RGB *rgb = malloc(sizeof(RGB) * W * H);
RGB c[H];
for (i = 0; i < W * H; i++)
{
rgb[i].b = i & 0xff;
rgb[i].g = (i >> 8) & 0xff;
rgb[i].r = (i >> 16) & 0xff;
}
qsort(rgb, H * W, sizeof(RGB), S1);
for (n = 0; n < 2; n++)
{
for (i = 0; i < W; i++)
{
for (j = 0; j < H; j++)
c[j] = rgb[j * W + i];
qsort(c, H, sizeof(RGB), S2);
for (j = 0; j < H; j++)
rgb[j * W + i] = c[j];
}
for (i = 0; i < W * H; i += W)
qsort(rgb + i, W, sizeof(RGB), S1);
}
printf("P6 %d %d 255\n", W, H);
fwrite(rgb, sizeof(RGB), W * H, stdout);
free(rgb);
return 0;
}
这是最初的图像..。
对于那些对生成这个图像所用的代码感兴趣的人:
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
int x, y;
int w = (argc > 1)? atoi(argv[1]): 1920;
int h = (argc > 2)? atoi(argv[2]): 1080;
double l = hypot(w, h);
fprintf(stdout, "P6 %d %d 255\n", w, h);
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x++)
{
unsigned char v[3];
v[0] = floor(256 * hypot(0 - x, h - y) / l);
v[1] = floor(256 * hypot(w - x, h - y) / l);
v[2] = floor(256 * hypot(w - x, 0 - y) / l);
fwrite(v, sizeof(unsigned char), 3, stdout);
}
}
return 0;
}
发布于 2014-01-23 02:28:20
require'chunky_png';i=ChunkyPNG::Image.new 1920,1080
i.area.times{|v|i[*(v.divmod(1080))]=v<<8|255};i.save ?i
编辑:我应该注意到,我提交这个问题时,问题仍然被标记为密码-高尔夫,在它成为一个人气-竞赛之前,所以我选择了简短的代码。这不是很有想象力,但我相信这是一份有效的意见书。
颜色值从00 00 00
到1f a3 ff
不等,由1
递增,因此在结果中缺少red
并不令人惊讶。
为了在源代码长度中添加一个字符(将<<8
替换为<<11
),可以获得以下输出。这涵盖了更多的光谱范围,代价是blue
分辨率。它通过RGB空间以8倍的速度递增。颜色值从00 00 00
到fd 1f f8
不等。
https://codegolf.stackexchange.com/questions/19150
复制相似问题