程序之美

用三段 140 字符以内的代码生成一张 1024×1024 的图片

看到Matrix67上的博客,用三段 140 字符以内的代码生成一张 1024×1024 的图片

Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、 BL 三个函数,每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数(0 ≤ i, j ≤ 1023),然后需要返回一个 0 到 255 之间的整数,表示位于 (i, j) 的像素点的颜色值。举个例子,如果 RD(0, 0) 和 GR(0, 0) 返回的都是 0 ,但 BL(0, 0) 返回的是 255 ,那么图像的最左上角那个像素就是蓝色。参赛者编写的代码会被插进下面这段程序当中(我做了一些细微的改动),最终会生成一个大小为 1024×1024 的图片。

// NOTE: compile with gcc filename.cpp -std=c99 -lm

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define DIM 1024
#define DM1 (DIM-1)
#define _sq(x) ((x)*(x)) // square
#define _cb(x) abs((x)*(x)*(x)) // absolute value of cube
#define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root

unsigned char GR(int,int);
unsigned char BL(int,int);

unsigned char RD(int i,int j){
   // YOUR CODE HERE
}
unsigned char GR(int i,int j){
   // YOUR CODE HERE
}
unsigned char BL(int i,int j){
   // YOUR CODE HERE
}

void pixel_write(int,int);
FILE *fp;
int main(){
    fp = fopen("MathPic.ppm","wb");
    fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);
    for(int j=0;j<DIM;j++)
        for(int i=0;i<DIM;i++)
            pixel_write(i,j);
    fclose(fp);
    return 0;
}
void pixel_write(int i, int j){
    static unsigned char color[3];
    color[0] = RD(i,j)&255;
    color[1] = GR(i,j)&255;
    color[2] = BL(i,j)&255;
    fwrite(color, 1, 3, fp);
}

看到了很多大牛程序员的作品,深深被折服,由衷的感叹到程序之美。自己也动手简单地改了改,生成的图片如下。
这里写图片描述

对应代码如下:

unsigned char RD(int i,int j){
   // YOUR CODE HERE)
    return (i&j)%255;
}
unsigned char GR(int i,int j){
   // YOUR CODE HERE
    return (i|j)%255;
}
unsigned char BL(int i,int j){
   // YOUR CODE HERE
    return (i^j)%255;
}

这里写图片描述

对应代码如下:

unsigned char RD(int i,int j){
   // YOUR CODE HERE)
    if((i/128)%2 == 1) i = 128 - (i%128);if((j/128)%2 == 1) j = 128 - (j%128);
    return (i&j)%255;
}
unsigned char GR(int i,int j){
   // YOUR CODE HERE
    if((i/128)%2 == 1) i = 128 - (i%128);if((j/128)%2 == 1) j = 128 - (j%128);
    return (i|j)%255;
}
unsigned char BL(int i,int j){
   // YOUR CODE HERE
    if((i/128)%2 == 1) i = 128 - (i%128);if((j/128)%2 == 1) j = 128 - (j%128);
    return (i^j)%255;
}

虽然没有用到复杂的数学函数,但图片也不算很难看,说实话,在运行函数前自己都不知道这样会生成怎样的图像,这就是程序的美妙之处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值