สร้างกราฟิก 1920 x 1080 ด้วย 2,073,600 สีที่เป็นเอกลักษณ์


24

ท้าทาย:

เขียนโปรแกรมที่ให้ไฟล์กราฟิกกว้าง 1920 พิกเซลสูง 1080 พิกเซล 2,073,600 พิกเซลในกราฟิกทุกอันต้องเป็นสีที่ไม่ซ้ำใครและไม่ควรทำซ้ำค่าสี ควรระบุสีในแบบ RGB และเริ่มที่ 0,0,0 และนับขึ้นตามลำดับไปที่ 255,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
    )

)

กฎ:

  • ภาษาการเขียนโปรแกรมใด ๆ ที่สามารถใช้ในการสร้างภาพ

  • คำตอบที่มีผู้โหวตมากที่สุดเป็นผู้ชนะ

  • ต้องใช้สีเพียงครั้งเดียว

  • พิกเซลที่อยู่ในตำแหน่ง 0,0 ต้องเริ่มต้นด้วยสี 0,0,0

  • สีจะต้องอยู่ในช่วง 24 บิตของสีจริง

  • รูปภาพต้องมีขนาด 1920 x 1080 พิกเซล

  • สีต้องอยู่ในรูปแบบ RGB

  • การใช้ไลบรารีเพื่อแสดงผลภาพก็โอเค

  • เอาต์พุตจะต้องอยู่ในรูปแบบของไฟล์กราฟิกเช่น output.png

  • เอาท์พุทเป็นข้อความซึ่งแสดงถึงค่าสีจะไม่นับรหัสจะต้องส่งออกไฟล์กราฟิก

  • ขนาดไฟล์ของภาพที่ส่งออกไม่สำคัญ

  • คุณต้องสามารถดูผลลัพธ์ได้โดยเปิดเป็นกราฟิกในเว็บเบราว์เซอร์ chrome

ฉันจะต้องประทับใจถ้าคุณทำสิ่งนี้ด้วยรหัสสั้น ๆ โปรแกรมของคุณจะแสดงเวลาเป็นวินาทีที่ผ่านไปเพื่อสร้างภาพที่ฝังอยู่ภายในภาพตัวเองซ้อนทับพิกเซลตามลำดับโปรแกรมของคุณจะแสดงภาพภายใน 10 วินาที ฉันจะต้องประทับใจมากหากโปรแกรมของคุณแสดงผลภาพภายใน 1 วินาที


3
หากนี่คือรหัสกอล์ฟโบนัสจะคำนึงถึงปัจจัยอย่างไร โบนัส 10 ตัวละครดูเหมือนจะเล็กมากสำหรับโค้ดที่ (คาดการณ์ได้อย่างมีประสิทธิภาพ) ทำนายอนาคต
Kendall Frey

1
ตอนนี้ไม่มีค่าโบนัส! เราควรจะใช้โบนัสเหล่านี้อย่างไร? ไม่สนใจพวกเขาเหรอ?
Kendall Frey

3
เลือกภาษาที่กระชับและ PNG API สั้น ๆ (สำคัญ!) จากนั้นนับเป็น 2,073,600 ขออภัยที่สำคัญอย่างยิ่ง @BenPaton แต่ฉันคาดการณ์ว่าการเลือกภาษาและ API จะเป็นปัจจัยที่สำคัญที่สุดที่นี่ไม่ใช่การแสดงการเขียนโปรแกรมที่ฉลาด แต่ฉันมักจะผิดและฉลาดน้อยกว่า :-)
Darren Stone

2
ข้อกำหนดสำหรับพิกเซลดำที่x==y==0ดูเหมือนว่าจะเป็นเรื่องเล็กน้อย ไม่ว่ากรณีใดก็ตามมันไม่ชัดเจนเนื่องจากพิกัดเหล่านี้สามารถอ้างถึงมุมบนซ้ายหรือมุมซ้ายล่างของภาพ
ossifrage คลื่นไส้

3
ซ้ำของรูปภาพที่มีสีทั้งหมด ; ความแตกต่างเพียงอย่างเดียวคือข้อ จำกัด ในจานสีที่จะเป็นสีน้ำเงินและสีเขียวมากกว่าพวกเขาทั้งหมดซึ่งไม่ได้สร้างความแตกต่างอย่างมากให้กับปัญหา แต่ทำให้ผลผลิตน้อยลง

คำตอบ:


40

Python - 660+ ไบต์

รุ่นที่เพิ่มขึ้น

ขนาดเต็ม: http://www.pictureshack.net/images/57626_all_colors.png (4.52MB)

นี่คือรูปภาพที่ใช้เศษส่วนJulia Set แต่ละสีจะถูกเพิ่มเข้าไปในภาพทีละน้อยแม้ว่าจะมีการคำนวณล่วงหน้าจำนวนมาก


เวอร์ชันความส่องสว่าง

ขนาดเต็ม: http://www.pictureshack.net/images/95389_all_colors4.png (5.24MB)

ฉันได้เพิ่มตัวเลือกในการย้ำสีแต่ละสีด้วยความสว่างมากกว่าโดยดัชนี สิ่งนี้ไม่จัดว่าเป็น "การนับ" จากศูนย์ แต่ดูเหมือนจะเป็นข้อกำหนดที่เข้มงวด เป็นที่น่าสนใจที่การเรียงลำดับสองอย่างนี้เปิดเผยโครงสร้างที่แตกต่างอย่างสิ้นเชิงในภาพ ที่จะใช้นี้ตั้งธงuse_luminosityTrue


แหล่ง

ต้องPIL

ถูกเตือน : ขั้นตอนนี้จะใช้เวลาหลายนาที การใช้PyPyกับPillow นั้นใช้เวลาประมาณหนึ่งในห้าของเวลาของ CPython กับ PIL ดังนั้นฉันขอแนะนำว่าถ้าเป็นไปได้

from PIL import Image, ImageDraw

use_luminosity = True

dim = (1920,1080)

img = Image.new('RGB', dim)
draw = ImageDraw.Draw(img)

xstart = -.776707
ystart = -.134663

a = []

xd = 1.6 / 8192 / dim[0]
yd = 0.9 / 8192 / dim[1]

for x in range(dim[0]):
  print x
  for y in range(dim[1]):
    z = d = complex(xstart + x*xd, ystart + y*yd)
    c = 0
    while abs(z) < 2 and c < 5000:
      z = z*z + d
      c += 1
    a += [(c, -abs(z), x, y)]

a = a[1:]
a.sort(reverse = True)

t = [(i>>16, 255&i>>8, 255&i) for i in range(1, dim[0]*dim[1])]
if use_luminosity:
  t.sort(key = lambda c: c[0]*3 + c[1]*10 + c[2], reverse = True)

r = 0
for c,d,x,y in a:
  draw.point((x,y), t[r])
  r += 1

img.show()

แก้ไข : อัปเดตเพื่อให้#000000อยู่ที่ด้านซ้ายบนตามที่ระบุ
แก้ไข : เพิ่มธงเพื่อย้ำสีตามความสว่าง
แก้ไข : เปลี่ยนเป็นการคำนวณแบบซับซ้อนดั้งเดิมและตุ้มน้ำหนักความสว่างจำนวนเต็มซึ่งเร็วกว่าเล็กน้อย


โซลูชันที่ฉันทำงานก่อนเกณฑ์หลักจะกลายเป็น

PHP - 161 ไบต์

<?header('Content-type: image/bmp');
ob_start();
echo'BM'.pack('I5S2',0,0,26,12,70780800,1,24);
for(;$i=($i-256)%2073601;)echo pack('CS',~$i,~$i>>8);
ob_end_flush();

นี่เป็นไปเพื่อให้ได้ผลลัพธ์ที่เร็วที่สุด ไม่มีการใช้ไลบรารีเพียงแค่ส่วนหัวที่คำนวณล่วงหน้าและเอาท์พุทไบต์โดยตรง ทำงานในคอมพ์ของฉันน้อยกว่า 2 วินาที โดยการเพิ่มขึ้น256แทนที่จะเป็น1มันจะสร้างเอฟเฟกต์การไล่ระดับสีโดยไม่ต้องคำนวณจริง ข้อเสียเพียงอย่างเดียวคือ ( 0, 0 ) ไม่ใช่สีดำ แต่ผลลัพธ์ดูดีกว่ามาก

ob_start();และob_end_flush();ไม่จำเป็นอย่างเคร่งครัด แต่การบัฟเฟอร์เอาต์พุตทำให้ทำงานเร็วขึ้นมาก

การเพิ่มที่น่าสนใจอื่น ๆ ได้แก่ :

17: http://i.stack.imgur.com/ieyyZ.png
103: http://i.stack.imgur.com/WD2wa.png
326: http://i.stack.imgur.com/c4DSF png
557: http://i.stack.imgur.com/eTTWE.png
943: http://i.stack.imgur.com/7rrmR.png
2125: http://i.stack.imgur.com/Ct1kM .png

และอื่น ๆ อีกมากมาย. แม้ว่ารูปแบบส่วนใหญ่ที่ดูเหมือนสิ่งใด ๆ จะมีลักษณะเป็นลายเส้นบางอย่าง


PHP - 105 ไบต์

<?=BM.pack(I5S2,header('Content-type:'),0,26,12,70780800,1,24);
for(;$i<2073600;)echo pack(CS,$i,$i++>>8);

ไม่สนใจรุ่นที่ไม่สนใจ

  • เมื่อได้รับContent-typeส่วนหัวที่เสียหายChrome จะพยายามอย่างดีที่สุดที่จะทราบว่าส่งไปอย่างไร image/bmpในกรณีนี้มันถูกต้องระบุว่ามันเป็น FireFox และ IE เวอร์ชันล่าสุดยังสามารถแก้ไขส่วนหัวที่เสียหายได้
  • barewords BM, I5S2และCSจะสร้างNOTICEข้อผิดพลาด เพื่อป้องกันความเสียหายของภาพการรายงานข้อผิดพลาดphp.iniจะต้องมีการตั้งค่าเพื่อป้องกันสิ่งนี้ (เช่นerror_reporting = E_ALL & ~E_NOTICE)
  • ไม่มีบัฟเฟอร์ออก ภาพถูกสร้างขึ้นครั้งละ 3 ไบต์ซึ่งช้ากว่าอย่างเห็นได้ชัด
  • จุด ( 0, 0 ) ถูกพิจารณาว่าเป็นซ้ายล่างมากกว่าซ้ายบน


PHP-CLI - 83 ไบต์

<?=BM.pack(I5S2,0,0,26,12,70780800,1,24);
for(;$i<2073600;)echo pack(CS,$i,$i++>>8);

เรียกใช้โดยตรงจากบรรทัดคำสั่งและไพพ์ไปยังไฟล์ (เช่น$ php all-colors.php > out.bmp) ไม่Content-typeจำเป็นต้องมีส่วนหัว ไฟล์ที่ได้จะเหมือนกับ 105 byte version และสามารถดูได้ใน Chrome


3
ฉันชอบรูปแบบจริงๆ trippy มาก!
Ben Paton

ฉันชอบภาพแรก แต่ดูเหมือนว่าละเมิดกฎที่เรียกพิกเซล 0,0 ว่าเป็น RGB 0,0,0
Iszi

@primo ตอนนี้ดูดีสำหรับฉันแล้ว
Iszi

1
ผมชอบรุ่นความสว่างมากฉันได้ตั้งเป็นวอลล์เปเปอร์ของฉัน :)
เบนตัน

24

C กับไลบรารีกราฟิก GD (เอ้อประมาณ 2.5 KB?)

กฎไม่ได้ห้ามการแก้ไขภาพที่มีอยู่ ฉันทำโปรแกรมเพื่อแทนที่พิกเซลของรูปภาพทั้งหมดด้วยค่า RGB ตามลำดับจาก#000000เป็น#1fa3ffและฉันพอใจกับผลลัพธ์มาก นี่คือสิ่งที่ผลิตจากภาพถ่ายที่โพสต์ไปยัง Flickrโดย Michael Carian ( cc-by-sa 2.0 ):

รูปขนาดย่อ 640x360 พิกเซลของผลการทดสอบ

(อิมเมจดิบของภาพค่อนข้างใหญ่ (5.6 MB) )

นี่คือภาพโคลสอัพของมุมซ้ายบน (เพิ่มขึ้น 400%):

มุมมองขยายที่มุมซ้ายบน

เวลาในการประมวลผลประมาณ 3 วินาทีสำหรับภาพขนาดนี้:

$ time ./a.out foodface.png outfile.png
File accepted; 1920x1080 pixels
Saving...
Finished

real    0m3.251s
user    0m2.392s
sys 0m0.169s

และใช่พิกเซลทั้งหมดเป็นสีที่ต่างกัน:

$ identify -format %k outfile.png
2073600

( identifyเป็นยูทิลิตี้ ImageMagick -format %kตัวเลือกจะนับจำนวนสีที่ไม่ซ้ำกันในภาพ)

นี่คือซอร์สโค้ด:

#include <stdio.h>
#include <stdlib.h>
#include <gd.h>

#define FIRST_PIXEL_MUST_BE_BLACK 1

#define luminance(rgb) (((rgb>>16)&0xff)*77+((rgb>>8)&0xff)*150+(rgb&0xff)*29)

typedef struct { int lum; int rgb; } pal;      /* Colour palette */
typedef struct { int lum; int x; int y; } pix; /* Pixel list */

/* Callback function for qsort */
int pcomp(const void *a, const void *b) {
  return ((pal *)(a))->lum-((pal *)(b))->lum;
}

int main(int argv, char *argc[]) {
  FILE        *infile,*outfile;
  gdImagePtr  img;
  int         img_width;
  int         img_height;
  int         npixels;
  int         x,y,i;
  int         rgb,colour_ref,c;
  pal         *palette;
  pix         *pixels;

  if (argv!=3) return printf("Usage: %s <source> <destination>\n",argc[0]);

  if (!(infile=fopen(argc[1],"r"))) {
    return printf("Can't open source file <%s>\n",argc[1]);
  }
  if (!(img=gdImageCreateFromPng(infile))) {
    return printf("Bad PNG file <%s>\n",argc[1]);
  }
  fclose(infile);

  img_width=img->sx;
  img_height=img->sy;
  npixels = img_width * img_height;
  printf("File accepted; %dx%d pixels\n",img_width,img_height);

  /* Allocate storage for palette and pixel data */
  palette = malloc(npixels * sizeof(pal));
  if (!palette) return printf("Out of memory\n");
  pixels = malloc(npixels * sizeof(pix));
  if (!pixels) return printf("Out of memory\n");

  /* Create palette and sort by luminance */
  for (i=0; i<npixels; i++) {
    palette[i].rgb=i;
    palette[i].lum=luminance(i);
  }
  qsort(palette,npixels,sizeof(pal),pcomp);

  /* Sort image pixels by luminance */
#if FIRST_PIXEL_MUST_BE_BLACK == 1
  colour_ref = gdImageColorAllocate(img,0,0,0);
  gdImageSetPixel(img,0,0,colour_ref);
#endif

  for (x=y=i=0;i<npixels;i++) {
    rgb = gdImageGetTrueColorPixel(img,x,y);
    pixels[i].x=x;
    pixels[i].y=y;
    pixels[i].lum=luminance(rgb);
    if (!(x=++x%img_width)) y++;
  }
#if FIRST_PIXEL_MUST_BE_BLACK == 1
  qsort(pixels+1,npixels-1,sizeof(pix),pcomp);
#else
  qsort(pixels,npixels,sizeof(pix),pcomp);
#endif

  /* Now use the palette to redraw all the pixels */
  for (i=0;i<npixels;i++) {
    c = palette[i].rgb;
    colour_ref = gdImageColorAllocate(img,c>>16,(c>>8)&0xff,c&0xff);
    gdImageSetPixel(img,pixels[i].x,pixels[i].y,colour_ref);
  }

  printf("Saving...\n");
  if (!(outfile=fopen(argc[2],"w"))) {
    return printf("Can't open <%s> for writing\n",argc[2]);
  }
  gdImagePng(img,outfile);
  fclose(outfile);
  gdImageDestroy(img);
  printf("Finished\n");
  return 0;
}

ว้าวน่าทึ่งมาก! : D +1 นอกจากนี้ 2.463 KB: P
Doorknob

16

C ++, 750 ไบต์

ชุด Mandelbrot PNG ความละเอียดเต็ม (5.1MB)

รหัสจะสร้างคอลเลกชันของจำนวนเต็มทั้งหมดตั้งแต่ 0-1080 * 1920 แล้วเรียงลำดับตามความสว่างโดยรวม จากนั้นจะสร้างชุด Mandelbrot และเรียงลำดับตำแหน่งตามการวนซ้ำและค่าของการหลบหนี จากนั้นจะเดินผ่านทั้งสองชุดโดยกำหนดสีตามลำดับจากมืดไปสว่างถึงค่า 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);}

รหัสไม่ได้ถูกตีกอล์ฟอย่างสมบูรณ์ แต่จะไม่เล็กลงเกินไป


11

C - 854 ไบต์ (เมื่อถูกบีบ)

ตอนแรกฉันมีอะไรบางอย่างที่มีสีฟ้าม่วงแดงและสีเหลืองและการไล่สีที่ราบรื่นซึ่งดูดีมาก ๆ แต่ก็ไม่ตรงตามข้อกำหนด

รายละเอียดต่อไปนี้ตรงตามข้อกำหนด: ใช้ "สีแรก" 2,073,600 สีไม่มีการทำซ้ำและสีดำที่มุมซ้ายบน

Ooh!

มันเจ๋งแค่ไหน มันสร้างอาร์เรย์ที่มีสีจากนั้นเรียงลำดับแนวตั้งและแนวนอนตามเกณฑ์ที่ต่างกันสองสามครั้ง ผลลัพธ์ที่ได้คือการเปลี่ยนระหว่างสีฟ้าและสีเขียวและสีเข้มและแสง ใช้เวลาประมาณ 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;
}

FYI นี่เป็นภาพต้นฉบับ ...

Ooh!

และสำหรับผู้ที่สนใจโค้ดที่ใช้สร้างภาพนี้:

#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;
}

การสำเร็จการศึกษาของสีในครั้งนี้เป็นสิ่งที่ดีจริงๆ ฉันพบว่าผลลัพธ์จากภาพที่สร้างขึ้นจากการคำนวณนี้เป็นเรื่องที่น่าพอใจมาก ฉันสามารถใช้มันเป็นวอลล์เปเปอร์บนเดสก์ท็อปได้อย่างง่ายดาย ทำได้ดี!
Ben Paton

ดูดี แต่มีปัญหาบางอย่าง (1) ค่าพิกเซลที่ไม่ซ้ำกัน (ตรวจสอบได้ง่าย: ./a.out | hexdump | headแสดง7d ff deซ้ำหลายครั้ง), (2) ไม่ใช้ค่า RGB เรียงลำดับจาก000000thru 1dffffและ (3) พิกเซลที่ (x = 0, y = 0) ไม่ใช่สีดำ (ถึงแม้ว่าผมจะไม่สามารถมองเห็นจุด (3) ตัวเอง.)
ossifrage คลื่นไส้

@squeamishossifrage ใช่ฉันคิดว่ารายละเอียดนั้น จำกัด มากเกินไปและในเวลาเดียวกันไม่อนุญาตให้ใช้รูปแบบไฟล์ที่มีมากกว่า 8 บิตต่อหลักหรือ 4 แชนเนลต่อพิกเซลซึ่งถ้าฉันใช้ 16 บิตต่อหลักจะรับประกันเอกลักษณ์ เนื่องจากเป็นการประกวดความนิยมฉันจะทิ้งมันไว้บางทีมันอาจจะได้รับการโหวตหรือสองครั้ง ...

@squeamishossifrage ไม่ได้หมายความว่าคุณจะต้องวนซ้ำตั้งแต่ 0 ถึง x1dffff เฉพาะเมื่อมันเริ่มต้นด้วยสีดำและขึ้นไปสู่สีขาว แต่ไม่ใช่ว่าแน่นอน
Sylwester

@Sylwester มันบอกว่าคุณควรจะนับตามลำดับและประโยคถัดไปบอกว่าคุณจะพบภาพขนาด 1920 x 1080 พิกเซลจะมีจำนวนมากของสีดำสีฟ้าและสีเขียวเท่านั้น ฉันเข้าใจผิดไปว่าอันไหน (นอกเหนือจากการผิด 0x1dffff; ควรจะได้รับ 0x1fa3ff.)
ossifrage คลื่นไส้

8

ทับทิม, 109

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ผลลัพธ์ไม่น่าแปลกใจ

Output1

สำหรับค่าใช้จ่ายในการเพิ่ม 1 อักขระให้กับความยาวซอร์สโค้ด (แทนที่<<8ด้วย<<11) เอาต์พุตต่อไปนี้สามารถมีได้ สิ่งนี้ครอบคลุมช่วงสเปกตรัมที่มากขึ้นด้วยค่าblueความละเอียด มันเพิ่มขึ้นผ่านพื้นที่ RGB ในอัตราแปดเท่า ค่าสีช่วงจากไป00 00 00fd 1f f8

ป้อนคำอธิบายรูปภาพที่นี่


2
ผลงานของคุณดีมาก ภาพแรกของคุณดูเหมือนว่าฉันคาดหวังไว้ ทำได้ดีมากและขอขอบคุณสำหรับการไป ประทับใจคุณทำอย่างรวดเร็วและมีรหัสน้อยมาก
Ben Paton

7

แร็กเกต

ไม่เคยใช้การเขียนโปรแกรมเชิงวัตถุของแร็กเกตมาก่อน (การส่งข้อความ) ดังนั้นฉันไม่แน่ใจว่าสิ่งนี้ดีที่สุด แต่ดูเหมือนว่าจะทำให้งานเสร็จ

#lang racket
(require racket/draw)
(let* ((x 1920) (y 1080) (b 256) (bb (* b b)) (pic (make-object bitmap% x y)))
  (let loop ((c 0) (v 0))
    (when (> (* x y) c)
      (send pic set-argb-pixels (modulo c x)   ; x
                                (quotient c x) ; y
                                1              ; width
                                1              ; height
                                (list->bytes 
                                 (list 0                            ; alpha
                                       (modulo v b)                 ; red
                                       (quotient v bb)              ; green 
                                       (modulo (quotient v b) b)))) ; blue
      (loop (+ c 1) (+ v 8))))
  (send pic save-file "image.png" 'png))

ภาพมีหลายสี

โดยไม่ใช้ 3 บิตแรกในช่องสีแดงฉันจะได้ทั้งสามสีในภาพผลลัพธ์ของฉัน

brainfuck

รหัสจะพิมพ์อิมเมจ BMP 24 บิตเป็น STDOUT สำหรับล่าม BF เซลล์ 8 บิต มันสร้างภาพเดียวกับเวอร์ชั่นของ Racket มันขึ้นอยู่กับรุ่น pnm

>-------->>+>----->-------->+++++++>>---->------>++>--->>++++[-<+++
+>]<[-<+++++<++++<++<+<++++++++<<+++++++++++++<<<<++>>>>>>>>>>>]<<[
.[-]>]++[-<++++>]<[->.<]<<.[-]...<.[-]...<[.[-]<].<.[-].<+[>>>>+<.<
<.>.>++++++++[>-]>[<<+[>>-]>>[<<<+[>>>-]>>>[<<<<->>>>>>>]<]<]<<<<<]

Ubuntu มาพร้อมกับbfที่มีเซลล์ 8 บิต:

bf img.bf > image.bmp

เวอร์ชันเก่าที่ละเมิดความสามารถในการเปิดจาก Chrome มันทำให้ไฟล์. pnm ที่เข้ากันได้กับโปรแกรมดูรูปภาพส่วนใหญ่

>------>+++++>+++++>++>------>>-------->>+>------>>++>------->+>--
---->++++++>>>++++[-<++++>]<[-<+++++<+++<+<+++<++++<+++<+++<+<+++<
+++<++++<+++<+<+++<+++<+++<+>>>>>>>>>>>>>>>>>]<[.[-]<]+[>>>>+<.<<.
>.>++++++++[>-]>[<<+[>>-]>>[<<<+[>>>-]>>>[<<<<->>>>>>>]<]<]<<<<<]

6

อัปเดตเวอร์ชันแรกไม่มีสีทั้งหมดที่ไม่ซ้ำกันในพื้นที่ 24 บิต:

Mathematica: 110

x = 1920; y = 1080; Image[
 ParallelTable[
  List @@ ColorConvert[Hue[h, 1, (b + h)/2], "RGB"], {h, 0, 1 - 1/y, 
   1/y}, {b, 0, 1 - 1/x, 1/x}]]

สีที่เป็นเอกลักษณ์

การตรวจสอบกฎ:

list = ParallelTable[
  List @@ ColorConvert[Hue[h, 1, (b + h)/2], "RGB"], {h, 0, 1 - 1/y, 
   1/y}, {b, 0, 1 - 1/x, 1/x}]

พิกเซลแรกเป็นสีดำ:

list[[1, 1]]
{0., 0., 0.}

สีทั้งหมดเป็นเอกลักษณ์:

id = ImageData[Image[list], "Bit16"]]
Length[DeleteDuplicates[Flatten[id, 1]]] == 1920*1080
True

วิชาคณิตศาสตร์: 146

x = 1920; Image[
 Partition[
  ParallelTable[
   List @@ ColorConvert[Hue[c, 1, c^.01], "RGB"], {c, 0, 1, 1/(
    x*1080)}], x]]

สี

ใช้เวลา 14.778 วินาที

การตรวจสอบกฎ:

list = Partition[
  ParallelTable[
   List @@ ColorConvert[Hue[c, 1, c^.01], "RGB"], {c, 0, 1, 1/(
    x*1080)}], x];

พิกเซลแรกเป็นสีดำ:

list[[1, 1]]
{0., 0., 0.}

สีทั้งหมดเป็นเอกลักษณ์:

Length[DeleteDuplicates[Flatten[list, 1]]] == 1920*1080
True


ภาพของคุณมีสีเฉพาะ 394,460 สี แปลงค่า RGB ของคุณเป็นจำนวนเต็ม 8 บิตก่อนที่จะแบนและคุณจะเห็นว่าทำไม
ossifrage คลื่นไส้

@squeamishossifrage อัปเดตแล้ว
ยัก

6

Python - 104

from PIL import Image
a=list(range(2073600))
i=Image.new("RGB",(1920,1080))
i.putdata(a)
i.save("o.png")

นี่คือรุ่นที่จะได้รับสำหรับความท้าทายรหัสกอล์ฟ เนื่องจากเป็นการเพิ่มค่าจาก 0 ถึง 2073599 จึงมีเฉพาะสีที่ไม่ซ้ำกัน

เวอร์ชั่นสั้น

Python - 110

เนื่องจากฉันไม่ชอบเวอร์ชั่นด้านบน (สีไม่ได้ใช้อย่างเต็มรูปแบบ) ฉันลองทำสิ่งต่อไปนี้:

from PIL import Image
a=list(range(0,2073600*8,8))
i=Image.new("RGB",(1920,1080))
i.putdata(a)
i.save("o.png")

รุ่นขยาย แต่ดูดีกว่า

Python - 122

ขยายไปยังอีกข้างต้น:

from PIL import Image
a=[(i<<3,i)[i%2]for i in range(2073600)]
i=Image.new("RGB",(1920,1080))
i.putdata(a)
i.save("o.png")

แม้จะดีกว่า


i.show()สามารถใช้เพื่อเปิดภาพในมุมมองเริ่มต้น ไม่มีข้อกำหนดที่เข้มงวดที่จะบันทึกเป็นไฟล์
primo

ดี. มันเป็นเมื่อมันยังคงเป็นความท้าทายรหัสกอล์ฟ แต่ขอบคุณสำหรับคำแนะนำ :)
เดฟ J

ยัง.show()ใช้งานไม่ได้สำหรับฉัน ดันโนทำไม : P
Dave J

5

การประมวลผล, 301
นี่ไม่ใช่ความพยายามในการแก้ปัญหาที่สั้นที่สุด แต่ยังคงไว้ซึ่งการควบคุมทั้งหมดเพื่อให้ได้การจัดเรียงสีที่ต้องการ ใช่สีไม่ต่อเนื่อง แต่ก็ไม่สนุก uniqe.png

int w = 1920;
int h = 1080;
void setup(){
  size(w, h);
  int x = 0; int y = 0;
  for(int i=0; i<w*h; i++){
    stroke(
      (i >> 0) & 0xFF,
      (i >> 6) & 0xFF,  
      (i >> 3) & 0xFF
    );
    if (y % h == 0){
      y = 0;
      x++;
    }
    point(x, y);
    y++;
  }
  save("unique.png");
}

ท้าทายต้องพิกเซล0,0จะเป็น 0,0,0RGB 31,31,31ฉันเห็น อันที่จริงคอลัมน์ทั้งศูนย์ดูเหมือนจะเป็นสีนั้น
Iszi

3

Visual Basic .NET, 273 ไบต์

Imports System.Drawing : Module Module1
    Sub Main()
        Dim b As New Bitmap(1920, 1080) : For i As Integer = 0 To 2073599 : Dim x = 0 : b.SetPixel(Math.DivRem(i, 1080, x), x, Color.FromArgb(i + &HFF000000)) : Next : b.Save("output.png")
    End Sub
End Module

เอาต์พุตนี้ไฟล์ 5.61 MB:

putput.png

รหัสด้านบนเป็นรุ่นที่บีบอัดของรหัสที่อ่านได้มากกว่านี้ ช่องว่างถูกลบเพื่อบันทึกไบต์

Imports System.Drawing
Module Module1
    Sub Main()
        Dim b As New Bitmap(1920, 1080)
        For i As Integer = 0 To 2073599
            Dim x = 0
            b.SetPixel(Math.DivRem(i, 1080, x), x, Color.FromArgb(i + &HFF000000))
        Next
        b.Save("output.png")
    End Sub
End Module

เชื่อมโยงไปยังภาพ: http: //µ.pw/k


2

ImageMagick - แปลง 119

ใช้convertจากกล่องเครื่องมือ ImageMagick เพื่อสร้างภาพ มันทำงานใน 0 วินาที มันเป็นกอล์ฟถึง 119 ตัวอักษร ฉันซ้อนทับการไล่ระดับสีสองสี (แดงน้ำเงินและขาวดำ) แปลงเป็น HSL และกลับไปเป็น RGB

G=gradient;convert -size 900x900 $G:red-blue \( $G: -rotate 90 \) -compose CopyRed -resize 1920x1080\! -composite o.png

Output2

ตัวอย่างของการไล่ระดับสีซ้อนทับสามารถพบได้ในหน้าคู่มือ ImageMagick


1
มันดีนะ แต่สีก็ไม่เหมือนกัน identify -format %k o.pngลองนี้: ฉันได้ 1762920 ไม่ใช่ 2073600
ossifrage

ขอบคุณ อีกจุดหนึ่งคือภาพไม่ได้เริ่มต้นด้วย RGB (0,0,0) ที่มุมบนซ้าย ทำงานเกี่ยวกับการแก้ไข ...
CousinCocaine

@squeamishossifrage ขอบคุณสำหรับคำสั่งระบุ ได้รับการแก้ไขแล้ว
CousinCocaine

1

PHP, 507

ภาพของการส่งออก

คุณอาจจะต้องเพิ่มจำนวนหน่วยความจำที่จัดสรรให้ PHP เพื่อให้ทำงานได้ ใช้ GD ใช้เวลาประมาณ 9 วินาทีในการสร้างภาพ

$a=microtime(true);$c=1920;$d=1080;$e=$c*$d;$f=@imagecreatetruecolor($c,$d);$h=255;$j=2200000;$k=array();$l=1;for($m=0;$m<=$h;$m++){for($n=0;$n<=$h;$n++){for($o=0;$o<=$h;$o++){if($l<=$j){$k[]=array($m,$n,$o);$l++;}else{break;}}}}while($p<=$e){for($q=0;$q<=$c;$q++){for($s=0;$s<=$d;$s++){$t=imagecolorallocate($f,$k[$p][0],$k[$p][1],$k[$p][2]);imagesetpixel($f,$q,$s,$t);$p++;}}}$u=number_format((microtime(true)-$a),4).' seconds';imagestring($f,6,10,10,$u,$v);header('Content-Type: image/png');imagepng($f);

เชื่อมโยงไปยังภาพที่ส่งออก: http://i.stack.imgur.com/AAKqW.png

เห็นมันทำงานบนเว็บ: http://ben-paton.co.uk/portfolio/pixel.php?w=1920&h=1080


สิ่งนี้ไม่ได้ตรวจสอบความต้องการของ 2,073,600 สีที่ไม่ซ้ำกันเนื่องจากข้อความสำหรับเวลาในการสร้างเป็นสีดำทั้งหมด หรือว่าไม่นับเพราะมันซ้อนทับทางเทคนิคหรือไม่
Iszi

ใช่ฉันคิดว่าฉันไม่ได้คิดอย่างนั้น ครั้งแรกที่ฉันคิดเกี่ยวกับการทำสิ่งนี้ฉันคิดว่ามันคงจะสนุกถ้ามีวอลเปเปอร์ขนาดเดสก์ท็อปที่ไม่มีสีเดียวกันสองพิกเซล จากนั้นเมื่อฉันเริ่มเล่นด้วยรหัสที่ทำสิ่งนี้ฉันได้รับความสนใจในความเร็วของภาพที่สร้างขึ้น ฉันคิดว่าโซลูชันที่สมบูรณ์แบบจริงๆจะใช้พิกเซลสีที่แตกต่างกันสำหรับข้อความเช่นกัน แต่อาจจะง่ายกว่าที่จะบอกว่าไม่นับเพราะฉันไม่แน่ใจว่ามันจะอ่านง่าย
Ben Paton

ฉันเพิ่งสังเกตเห็นว่าฉันพูดว่า "ตรวจสอบ" เมื่อฉันหมายถึง "ละเมิด" อ๋อ คุณได้รับมัน
Iszi

1

DELPHI / PASCAL (เวอร์ชั่น # 1), 361 ไบต์

program P;
{$APPTYPE CONSOLE}
uses
  System.SysUtils, Vcl.Imaging.pngimage,System.UITypes;
var a : TPNGObject; h,w: Integer; c : TColor;
begin
   a :=TPNGObject.CreateBlank(COLOR_RGB, 16, 1920, 1080);
   for h := 0 to 1020 do
     for w := 0 to 1920 do
         begin
         a.Pixels[h,w]:= c ;
         inc(c);
         end;
   a.SaveToFile('e:\t.png');
end.

1
ขอบคุณที่ส่งโซลูชันเดลฟายสำรอง คุณสามารถอัปโหลดภาพตัวอย่างในรูปแบบผลลัพธ์ได้หรือไม่
Ben Paton

0

Tcl / Tk, 149

150

set p [image c photo -w 1920 -h 1080]
set y 0
time {set x 0
time {$p p [format #%06x [expr $y*1920+$x]] -t $x $y
incr x} 1920
incr y} 1080
$p w c.png

สี


0

Java 411 386 + 24 ไบต์

แข็งแรงเล่นกอล์ฟ

import java.awt.image.*;()->new BufferedImage(1920,1080,1){{long t=System.currentTimeMillis();int q=-1;for(int i=0;i<getWidth();i++)for(int j=0;j<getHeight();j++)setRGB(i,j,q++);java.io.File f=new java.io.File(System.getProperty("user.home"),"Desktop"+System.getProperty("file.separator")+(System.currentTimeMillis()-t)+".png");javax.imageio.ImageIO.write(this,"png",f);java.awt.Desktop.getDesktop().open(f);}}

Ungolfed

import java.awt.image.*;
() -> new BufferedImage(1920, 1080, 1) {
        {
            long t = System.currentTimeMillis();
            int q = -1;
            for (int i = 0; i < getWidth(); i++)
                for (int j = 0; j < getHeight(); j++)
                    setRGB(i, j, q++);
            java.io.File f = new java.io.File(System.getProperty("user.home"),
                    "Desktop" + System.getProperty("file.separator")
                            + (System.currentTimeMillis() - t) + ".png");
            javax.imageio.ImageIO.write(this, "png", f);
            java.awt.Desktop.getDesktop().open(f);
        }
    }

ผล

102.png

คำอธิบาย

นี่ไม่ใช่ความพยายามของฉันในการแก้ปัญหาที่สั้นที่สุด แต่ค่อนข้างพกพามากที่สุด เหลือการนำเข้าสำหรับ BufferedImage เท่านั้นเนื่องจากอีกอันหนึ่งไม่ได้บันทึกไบต์ แทนที่จะโหลดอิมเมจลงใน JPanel และเขียนลงไปฉันจะประหยัดเวลาตั้งแต่เริ่มต้นจนถึงการเขียนลงดิสก์เป็นชื่อไฟล์ สำหรับฉันแล้วการทำเช่นนี้ส่งผลให้ชื่อไฟล์ประมาณ ~ 110 ms ในขณะที่เวลาตั้งแต่ต้นจนจบมักใช้เวลาประมาณ 500ms สุดท้ายควรเป็นแพลตฟอร์มอิสระที่ฉันทดสอบทั้งใน Windows และ Ubuntu VM และทำงานได้ (มันเขียนไฟล์ไปยังเดสก์ท็อปของคุณ) จะต้องมีคำสั่งส่งคืนเนื่องจากขยะไวยากรณ์ Callable แม้ว่าฉันจะทำงานเกี่ยวกับการทำงานฉันสงสัยว่าฉันจะพบว่าการใช้งานที่ดีขึ้นด้วยตัวเองเนื่องจากบันทึกจากการใช้ l และ w สำหรับลูป ฉันจะบอกว่าครึ่งวินาทีสำหรับ java ไม่ได้เลวร้ายเกินไป

 (System.getProperty("os.name").toLowerCase().contains("win")) { try { Process
 * p = Runtime.getRuntime() .exec(new String[] { "cmd", "/c", "start chrome " +
 * f }); p.waitFor(); } catch (Exception e) { } } else if
 * (System.getProperty("os.name").toLowerCase().contains("ix")) { try { Process
 * p = Runtime.getRuntime().exec(new String[] { "google-chrome" + f }); } catch

แต่ฉันเชื่อว่ามันยังผ่านการตรวจสอบเพราะมันยังสามารถเปิดได้ด้วย chrome มันจะเปิดโดยอัตโนมัติไปยังโปรแกรมดู png ที่เป็นค่าเริ่มต้นของคุณ (เวอร์ชันที่ไม่ได้ทดสอบกับเครื่องที่ใช้ Unix)

ฉันรู้ว่าการบันทึกจำนวนมากเป็นไปได้ แต่ส่วนใหญ่จะไม่ได้รับสิทธิ์ในการรับโบนัส หากได้รับการร้องขอฉันสามารถอัปโหลดสั้นลงตัวอย่างแพลตฟอร์มเฉพาะ ขอขอบคุณ.

แก้ไข

นำออกโดยไม่จำเป็นลองจับบล็อกและคำสั่งการส่งคืนที่จัดรูปแบบไม่ดีเพื่อลด ~ 30 ไบต์
ลบออกBufferedImage.TYPE_INT_RGBเพราะแท้จริงแล้วเป็นเพียง 1


มองย้อนกลับไปในเรื่องนี้ฉันไม่คิดว่าฉันต้องลอง catch catch block เนื่องจากวิธีการหลักจะต้องมีข้อยกเว้นสำหรับแลมบ์ดาที่เรียกได้ว่าทำงานได้ ...
jfh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.