เรียงพิกเซล


35

งานของคุณคือการสร้างโปรแกรมที่จะให้ภาพอินพุตสร้างภาพเอาต์พุตที่มีขนาดเท่ากันโดยที่พิกเซลทั้งหมดจะถูกจัดเรียงตามค่าเลขฐานสิบหก

โปรแกรมของคุณอาจ:

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

กฎ:

  • เอาต์พุตต้องถูกเขียนไปยังดิสก์หรือสามารถไพพ์ไปยังไฟล์ได้
  • อินพุตถูกกำหนดเป็นอาร์กิวเมนต์ commandline ในรูปแบบของพา ธ ที่สัมพันธ์กับรูปภาพหรือไพพ์จาก commandline
  • นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

คำตอบ:


20

Pyth - 10 ไบต์

อ่านรูปภาพยุบบิตแมปการเรียงลำดับแล้วแยกบิตแมปขึ้นอีกครั้งจากนั้นเขียน

.wclK'zSsK

ใช้งานออนไลน์ไม่ได้ด้วยเหตุผลที่ชัดเจน o.pngจะเข้าเป็นเส้นทางเทียบกับไฟล์ภาพและผลเข้ามา

ผลผลิตจาก American Gothic:


3
ฉันหวังว่าฉันไม่ได้เป็นเพียงคนเดียวที่จะมีความรู้สึกว่าภาพที่มีการเคลื่อนไหว ...
เควนติน

ดูเหมือนไม้
Joe Z.

19

JavaScript (ES6), 383 377 354 ไบต์

f=s=>{d=document,i=new Image,i.src=s,i.onload=$=>{c=d.createElement`canvas`,x=c.getContext`2d`,c.width=w=i.width,c.height=h=i.height,x.drawImage(i,0,0),D=x.getImageData(0,0,w,h),t=D.data,t.set([].concat(...[...t].map((v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)).sort((a,b)=>a.some((v,i)=>k=v-b[i])&&k)).slice(12*w*h)),x.putImageData(D,0,0),d.body.appendChild(c)}}

ตัวอย่างผลลัพธ์

การสาธิตที่รันได้:

วิธีการทำงานของรหัสนี้คือการใช้getImageDataเพื่อรับอาร์เรย์ของฟอร์ม

[R,G,B,A,
 R,G,B,A,
 R,G,B,A,
 ...]

และmapไปยังอาเรย์ของแบบฟอร์ม

[[R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 ...]

ดังนั้นค่า R จะถูกแมปกับอาร์เรย์ของชุด RGBA และค่า B, G และ A จะเปลี่ยนเป็นศูนย์อาร์เรย์ค่าต่ำสุด เมื่อเราจัดเรียงอาร์เรย์นี้อาร์เรย์ทั้งหมด[0,0,0,0]จะเรียงลำดับที่ด้านล่างและอาร์เรย์ที่มีมูลค่าจริงจะเรียงลำดับตามปกติที่ด้านบน:

[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [0,0,0,0],..., [R,G,B,A],[R,G,B,A],[R,G,B,A],...]
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               extract & flatten these sorted pixels

เราอ่านค่าสูงสุดสี่ของอาร์เรย์ (เพื่อทำให้สูญเสียค่าว่างที่เราสร้างไว้) แบนให้เรียบ[].concat.applyและจบลงด้วยอาร์เรย์ของฟอร์มแรกอีกครั้ง แต่คราวนี้มันเรียงลำดับแล้ว

de-golfed เล็กน้อยกับช่องว่างและความคิดเห็น:

f=s=>{ 
  // first, load image, then do everything else onload
  i=new Image,
  i.src = s,
  i.onload=$=>{
    // set up the canvas
    d=document,
    c=d.createElement`canvas`,
    w=c.width=i.width,
    h=c.height=i.height,
    x=c.getContext`2d`,

    // draw image to canvas and capture pixel data
    x.drawImage(i,0,0),
    D=x.getImageData(0,0,w,h),
    t=D.data,

    // set pixel data to...
    t.set(
      // the flattened array...
      [].concat(...
        // that is a mapping of the pixel data...
        [...t].map(
          // that clumps RGBA families into subarrays
          // by replacing every fourth value with [R,G,B,A]
          // and all other values to [0,0,0,0]...
          (v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)
        )
        // and is then sorted...
        .sort(
          // by reducing each array to a positive, negative, or zero
          // by comparing R,G,B,& A until the first nonzero difference
          (a,b)=>a.some((v,i)=>k=v-b[i])&&k
        )
      )
      // then eliminate the low-sorted empty [0,0,0,0] values we created,
      // leaving only the top fourth, with real values
      // (note that 3*4*w*h is the same as 3*t.length)
      .slice(3*4*w*h)
    ),

    // now that `t` is set, store `D` in canvas
    x.putImageData(D,0,0),

    // show canvas
    d.body.appendChild(c)
  }
}

โปรดทราบว่าเบราว์เซอร์ส่วนใหญ่อาจล้มเหลวในการเรียกใช้รหัสนี้สำหรับภาพขนาดใหญ่เนื่องจากผ่านการโต้แย้งจำนวน[].concatมาก เมื่อสภาพแวดล้อมของเบราว์เซอร์ไม่อนุญาตให้มีหน่วยความจำเพียงพอสำหรับการขัดแย้งทั้งหมดวิธีการทางเลือกคือการแมปค่า RGBA อีกครั้งจากอาร์เรย์ที่สี่บนสุดกลับสู่อาร์เรย์เพื่อรวมคะแนน361 ไบต์ :

f=s=>{d=document,i=new Image,i.src=s,i.onload=$=>{c=d.createElement`canvas`,x=c.getContext`2d`,c.width=w=i.width,c.height=h=i.height,x.drawImage(i,0,0),D=x.getImageData(0,0,w,h),t=D.data,t.set([...t].map((v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)).sort((a,b)=>a.some((v,i)=>k=v-b[i])&&k).map((v,i,A)=>A[3*w*h+(i>>2)][i%4])),x.putImageData(D,0,0),d.body.appendChild(c)}}

เราเพียงแทนที่[].concat(...{stuff}).slice(12*w*h)ด้วย{stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4]).)


คุณสามารถรวมเอาท์พุทตัวอย่าง?
Paŭlo Ebermann

@ PaŭloEbermannเรียบร้อยแล้ว
apsillers

@insertusername ที่นี่โอ้ใช่แล้วฉันทดสอบกับภาพเล็ก ๆ เท่านั้น การconcat.applyโทรของฉันกำลังส่งอาร์กิวเมนต์มากเกินไปconcatและเอ็นจิน JS กำลังปฏิเสธมัน D:ขอบคุณ! ฉันจะแก้ไขและจดคะแนนสองคะแนน (และฉันดีใจที่ฉันสามารถช่วยได้!)
apsillers

@insertusername ที่นี่ขอบคุณสำหรับหัวหน้าขึ้นมาเกี่ยวกับข้อ จำกัด ขนาด; ตอนนี้ฉันได้เผยแพร่เวอร์ชันที่ยาวขึ้นอีกเล็กน้อยซึ่งใช้งานกับรูปภาพขนาดใหญ่ขึ้น
apsillers

@apsillers งานที่ดี ไม่สามารถโหวตขึ้นอีกครั้งได้อย่างน่าเสียดาย :)
insertusername ที่นี่

14

Mathematica 86 83 72 ไบต์

 f=Flatten;Image[f[Sort[f[s=ImageData@#1,1]]]~ArrayReshape~Dimensions@s]&

บันทึกได้ 14 ไบต์ด้วย @Martin Buttner


ตัวอย่าง

ภาพนั้นเป็นอินพุต อีกทางเลือกหนึ่งตัวแปรที่มีภาพสามารถนำมาใช้

สไตล์โกธิค


ความท้าทายระบุว่าพิกเซลจะเรียงตามค่าเลขฐานสิบหก แต่ถ้าฉันอ่านอย่างถูกต้องคุณใช้การเรียงลำดับเริ่มต้นของ Mathematica สำหรับรายการ {R, G, B} หรือ {R, G, B, alpha} ไม่ชัดเจนสำหรับฉันว่าสิ่งเหล่านี้เทียบเท่า
Michael Stern

@MichaelStern ฉันไม่รู้จัก Mathematica แต่ถ้าเรียงลำดับตามลำดับแบบทัดเทียมเหมือนภาษาส่วนใหญ่พวกเขาจะเทียบเท่า: ตัวเลขเช่นเลขฐานสิบหกจะเรียงตามตัวเลขแต่ละหลักซึ่งสองเป็นตัวแทนของแต่ละองค์ประกอบใน tuple
Maltysen

@MichaelStern, Maltysen ถูกต้อง การเรียงลำดับ RGB และการเรียงลำดับ Hex เทียบเท่ากัน: เรียงลำดับตาม R จากนั้นเลือก G จากนั้นค่า B จะทำงานเหมือนกับการเรียงลำดับค่าสถานที่ใน Hex
DavidC

ตกลง +1 จากฉัน
Michael Stern

ImageDataและArrayReshapeสามารถใช้สัญกรณ์มัด เป็นเวลานานพอที่จะบันทึกไม่กี่ไบต์โดยการกำหนดให้มันFlatten fและคุณต้องการจริงๆ"Byte"หรือ ค่าเริ่มต้นจะไม่เพียงแค่ปรับค่าช่องให้เป็นไปตาม[0,1]ที่การเรียงลำดับและการสร้างรูปภาพใหม่จะยังใช้งานได้ดีใช่ไหม
Martin Ender

5

Javascript ES6, 334 ไบต์

f=s=>{with((d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`)(i=new Image).src=s,drawImage(i,0,0,w=c.width=i.width,h=c.height=i.height),t=(g=getImageData(0,0,w,h)).data,t.set([...t].map(i=>(0+i.toString(16)).slice(-2)).join``.match(/.{8}/g).sort().join``.match(/../g).map(i=>parseInt(i,16))),putImageData(g,0,0)}

Ungolfed:

f=s=>{                                   // create function that accepts image name
 with((d=document).body.appendChild(     // use "with" to exclude having to prepend "<context2d>." to drawImage, getImageData and putImageData
   c=d.createElement`canvas`).getContext`2d`) // create canvas to get pixels from and draw output to
  (i=new Image).src=s,                   // create image, define source filename
  drawImage(i,0,0,w=c.width=i.width,     // draw image to canvas
                  h=c.height=i.height),
  t=(g=getImageData(0,0,w,h)).data,      // get image data from canvas in form of Uint8Array
  t.set([...t]                           // convert image data from Uint8Array to standard array
   .map(i=>(0+i.toString(16)).slice(-2)) // convert R,G,B,A bytes to base16 strings with leading zeros
   .join``.match(/.{8}/g)                // convert array of [R,G,B,A,R,G,B,A,...] to [RGBA,RGBA,...]
   .sort()                               // sort pixel values
   .join``.match(/../g)                  // convert array of [RGBA,RGBA,...] to [R,G,B,A,R,G,B,A,...]
   .map(i=>parseInt(i,16))),             // convert hex strings back to integers, reassign to image data
  putImageData(g,0,0)                    // dump image data onto canvas
}

@insertusernamehere ใช้งานได้กับ Firefox ล่าสุด เช่นเดียวกับคำตอบของคุณสมมติว่ามีเนื้อความต่อท้าย Canvas และภาพต้นฉบับนั้นมาจากโดเมนเดียวกัน
Dendrobium

+1 โซลูชั่นที่โฉบเฉี่ยวมาก นอกจากนี้ยังประมวลผลภาพสูงสุด 1600 x 1900px
insertusernamehere

2
วันนี้ฉันเรียนรู้ว่าappendChildคืนค่าอาร์กิวเมนต์ มีประโยชน์มาก! คุณเป็นแรงบันดาลใจให้ฉันลดรายการของฉันลงจาก 377 เป็น 354 แต่ฉันไม่สามารถเอาชนะคุณได้ :) (เมื่อฉันใช้appendChild-chaining และwithเทคนิคของคุณฉันสามารถทำให้มันลดลงเหลือ 347 แต่ก็ยังอยู่ห่างออกไป 13 อัน) ทำงานได้ดีมาก!
apsillers

5

C (ใช้ SDL1.2), 333 322 315 ไบต์

C อาจไม่ใช่ 'มีดที่คมชัดที่สุดในชั้นวาง' สำหรับงานประเภทนี้ฉันต้องการทดลองใช้ต่อไป เคล็ดลับสำหรับการปรับปรุงคำตอบของฉันยินดีต้อนรับ โปรแกรมรับชื่อของไฟล์ภาพอินพุตเป็นอาร์กิวเมนต์ cli

#include <SDL.h>
#include <SDL_image.h>
#define X SDL_Surface*
#define Y const void*
C(Y a,Y b){return*(Uint32*)a-*(Uint32*)b;}main(int o,char**a){X i=IMG_Load(a[1]);X s=SDL_SetVideoMode(i->w,i->h,32,0);i=SDL_ConvertSurface(i,s->format,0);qsort(i->pixels,i->w*i->h,4,C);SDL_BlitSurface(i,0,s,0);for(;;SDL_Flip(s));}

รวบรวมและเรียกใช้: gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out

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

ปกติฉันไม่ได้เล่นกอล์ฟใน C แต่ฉันเพิ่งตอบความท้าทายนี้เมื่อวานนี้และฉันต้องการเล่นกับของเล่นใหม่ต่อไป :)

ขอบคุณ @ pseudonym117 ที่ช่วยฉันประหยัด 5 ไบต์


สามารถบันทึกได้ 1 ไบต์โดยการเปลี่ยนของคุณwhileเมื่อสิ้นสุดเป็นfor(;;SDL_Flip(s));และฉันเชื่อว่าคุณสามารถละเว้นintวิธีการCและประหยัดอีก 4
pseudonym117

4

JavaScript (ES6), 452 480 484 487 511ไบต์

ว้าวนี่นานกว่าที่คาด:

f=u=>{i=new Image;i.src=u;i.onload=_=>{c=(d=document).createElement`canvas`;c.width=w=i.width;c.height=h=i.height;x=c.getContext`2d`;x.drawImage(i,0,0,w,h);p=x.getImageData(0,0,w,h).data;t=[];f=[];for(j=0;j<p.length;++j)t.push([p[j],p[++j],p[++j],p[++j]]);t.sort((a,b)=>a[0]>b[0]||a[0]==b[0]&&a[1]>b[1]||a[0]==b[0]&&a[1]==b[1]&&a[2]>b[2]).map(u=>f.push.apply(f,u));x.putImageData(new ImageData(new Uint8ClampedArray(f),w,h),0,0);d.body.appendChild(c)}}

ฟังก์ชั่นใช้เวลา URL ที่เป็นปัจจัยการผลิตf('test.jpg');และดึงผลที่เป็นองค์ประกอบซึ่งถูกผนวกเข้ากับcanvasbody

โปรดทราบว่าแหล่งที่มาจะต้องอยู่ในโดเมนเดียวกันมิเช่นนั้นสคริปต์จะหยุดทำงานเนื่องจากปัญหาด้านความปลอดภัย


ข้อ จำกัด

ฉันทดสอบใน Firefox 42 บน OS X (10.10) บนเครื่องที่มี 2.5 GHz i7 และ 16 GB RAM ขนาดภาพสูงสุดที่สามารถดำเนินการได้โดยไม่ต้องขอ Firefox เพื่อดำเนินการต่อการดำเนินสคริปต์ที่เป็น1600 x 1932 พิกเซล


Ungolfed

f = u => {
    i = new Image;
    i.src = u;
    i.onload = _ => {
        c = (d = document).createElement`canvas`;
        c.width = w = i.width;
        c.height = h = i.height;

        x = c.getContext`2d`;
        x.drawImage(i, 0, 0, w, h);

        p = x.getImageData(0, 0, w, h).data;

        t = [];
        f = [];

        for (j = 0; j < p.length;++j)
            t.push([p[j], p[++j], p[++j], p[++j]]);

        t.sort( (a,b) => a[0] > b[0] || a[0] == b[0] && a[1] > b[1] || a[0] == b[0] && a[1] == b[1] && a[2] > b[2] )
         .map(u => f.push.apply(f,u));

        x.putImageData( new ImageData( new Uint8ClampedArray(f), w, h), 0, 0);
        d.body.appendChild(c)
    }
}

เอาท์พุต

เพื่อการเปรียบเทียบที่ดีกว่าฉันยังใช้ " American Gothic " เป็นตัวอย่างแหล่งที่มา:

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


การแก้ไข

  • ที่บันทึกไว้ 24 ไบต์โดยใช้แทนfor (a in b) for(;;)ขอบคุณar34z
  • บันทึก 3 ไบต์โดยเก็บไว้documentในตัวแปร
  • ที่บันทึกไว้ 4 ไบต์()โดยวางบางส่วนของเหล่านี้
  • บันทึก 10 ไบต์โดยใช้สตริงแม่แบบที่ติดแท็กละเว้นการ()สร้างวัตถุและลบคู่ที่ซ้ำซ้อน()อื่น ขอขอบคุณที่apsillers
  • บันทึก 14 ไบต์โดยการปรับขนาดโค้ดให้ใหญ่ขึ้นเพื่อทำให้อาเรย์สีเรียบหลังจากการจัดเรียง ขอบคุณมากสำหรับapsillersและYpnypnสำหรับการตัดราคาซึ่งกันและกัน
  • บันทึก 1 ไบต์โดยปรับโครงสร้างfor-oplo ที่รับสีของแต่ละพิกเซล

1
คุณสามารถลดสำหรับลูปโดยใช้for(k in t)ซึ่งจะบันทึกไบต์อีกไม่กี่ :)
ar34z

1
เยี่ยมมาก! การปรับปรุงบางอย่าง: แพ้()ในnew Image(); ใช้สตริงเทมเพลตที่ติดแท็กสำหรับอาร์กิวเมนต์สตริงของคุณ ( createElement`canvas`, getContext`2d`) อย่าใช้วงเล็บสำหรับพารามิเตอร์ฟังก์ชั่นลูกศรเดียว (เพียงทำf=u=>{...}; parens มีไว้สำหรับ funcs arrow ศรหลายพารามิเตอร์หรือพารามิเตอร์ศูนย์เท่านั้น) นอกจากนี้คุณอาจมีforลูปประโยคเดี่ยวหนึ่งหรือสองประโยคที่มีเครื่องหมายวงเล็บซึ่งไม่จำเป็น
apsillers

โอ้จริงๆแล้วสำหรับฟังก์ชั่นลูกศรไม่มีข้อโต้แย้งให้ใช้อาร์กิวเมนต์ดัมมี่ตัวอักษรเดียวแทนการเว้นวรรคสองตัวอักษร ( i.onload=$=>...แทนi.onload=()=>...)
apsillers

ฉันคิดว่าfor(l in u)f.push(u[l]);สามารถเป็นได้for(z of u)f.push(z);
ยิ

@Ypnypn มันอาจจะสั้นกว่านั้น:)อีก - for(u of t)for(z of u)f.push(z)สวยสั้นแดง t.map(u=>u.map(z=>f.push(z)))แต่ก็สามารถจะสั้นลงต่อไป ในหลายกรณีการใช้.mapหรือ.someฟังก์ชั่นลูกศรจะสั้นกว่าการใช้forลูป หากคุณต้องการที่จะไปจริงๆบ้าคุณสามารถประหยัดมากยิ่งขึ้นที่นี่กับt.map(u=>f.push.apply(f,u));ที่กล่าวว่า "สำหรับอาร์เรย์ทุกuในtอุปทานuเป็นรายการของการขัดแย้งกับf.pushทางapply(ตั้งแต่pushสามารถยอมรับจำนวนมากมายของการขัดแย้งและมันดันทั้งหมดของพวกเขาในการสั่งซื้อ)
apsillers

4

Bash + GNU utils, 80

s()(sed 1d $1|cut -d\  -f$2)
sed 1q $1
s $1 2-|sort -t_ -k1.16|paste <(s $1 1) -

รูปแบบนี้ถือว่าอินพุต / เอาต์พุตอยู่ในรูปแบบ ImageMagick pixel enumeration .txt อินพุตถูกส่งเป็นชื่อไฟล์และเอาต์พุตไปที่ STDOUT


หากข้างต้นไม่ถือว่าเป็นรูปแบบภาพที่รู้จักกันดีเราสามารถเพิ่มในการแปลงที่จำเป็น:

Bash + GNU ใช้ + ImageMagick, 108

s()(sed 1d t|cut -d\  -f$1)
convert $1 txt:t
(sed 1q t
s 2-|sort -t_ -k1.16|paste <(s 1) -)|convert txt:- $2

อินพุตและเอาต์พุตถูกระบุเป็นชื่อไฟล์ ImageMagick กำหนดรูปแบบไฟล์ที่จะใช้โดยนามสกุลไฟล์ที่ส่งผ่านเพื่อให้เราสามารถใช้รูปแบบทั่วไป:

$ ./sortpixels.sh 398px-Grant_Wood_-_American_Gothic_-_Google_Art_Project.jpg o.png
$ 

o.png ที่ได้จะเป็นดังนี้:

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


3

Python 2, 128 ไบต์

from PIL import*
a=Image.open('a')
b=a.load()
c,d=a.size
a.putdata(sorted(b[e,f]for f in range(d)for e in range(c)))
a.save('b')

หากรูปภาพเป็นไฟล์ที่aไม่มีนามสกุลไฟล์จะเป็นไฟล์ที่bไม่มีนามสกุล

โกธิคอเมริกัน American Gothic (เรียงลำดับ)


ฉันยังไม่ได้ตรวจสอบ แต่คุณควรจะสามารถทำบางสิ่งบางอย่างตามสายa.putdata(sorted(b[f/c,f%d]for f in range(d*c)))แทน (ฉันเพิ่งตื่นขึ้นดังนั้นฉันอาจผสมตัวแปร)
Kade

ตามที่คุณเขียนมันใช้งานไม่ได้ (ดัชนีอยู่นอกช่วง) แต่ฉันไม่ได้พยายามเปลี่ยนตัวแปรใด ๆ (ฉันไม่มีเวลามากในขณะนี้) @Shebang
Zach Gates

3

Java, 316 ไบต์

import javax.imageio.*;class C{public static void main(String[]a)throws Exception{java.awt.image.BufferedImage i=ImageIO.read(new java.io.File(a[0]));int w=i.getWidth(),h=i.getHeight(),v[]=i.getRGB(0,0,w,h,null,0,w);java.util.Arrays.sort(v);i.setRGB(0,0,w,h,v,0,w);ImageIO.write(i,"png",new java.io.File("a.png"));}}

วางค่าเลขฐานสิบหกของสีพิกเซลในอาร์เรย์ อาร์เรย์ถูกเรียงลำดับและสีจะถูกแมปกับพิกเซลในรูปภาพ a.pngชื่อของภาพที่เกิดคือ

ดอกทิวลิปสีเหลือง ดอกทิวลิปสีเหลืองเอาท์พุท
อินพุตแบบกอธิคอเมริกัน ป้อนคำอธิบายรูปภาพที่นี่


3

SmileBASIC, 39 35 ไบต์

สมมติว่าภาพโหลดเข้าสู่หน้ากราฟิก 512 * 512:

DIM A[0]GSAVE A,0SORT A
GLOAD A,0,1

อธิบาย:

DIM IMG[0] 'create array
GSAVE IMG,0 'save graphics to array
SORT IMG 'sort
GLOAD IMG,0,1 'load graphics from array

มันง่ายมาก! น่าเสียดายที่เราต้องใช้จำนวนเต็มซึ่งเพิ่ม 4 ไบต์ให้กับขนาดโปรแกรมเนื่องจากส่วนต่อท้ายของประเภท


ฉันไม่แน่ใจจริงๆว่าทำไมต้องใช้ ints ดูเหมือนว่าการใช้ลอยได้รับผลลัพธ์ที่ถูกต้องจริง การรันโค้ดนี้โดยใช้ ints on SYS/DEFSP.GRPจะทำให้ a FF000000อยู่ด้านบนซ้ายและ a 00101010อยู่ด้านขวาล่างซึ่งเป็นสิ่งที่ตรงกันข้ามกับคำถาม การใช้ลูกลอยจะวาง00000000ที่มุมบนซ้ายและFFF8F8F8มุมขวาล่างซึ่งถูกต้อง (แน่นอนถือว่านี้สีฐานสิบหกเป็นไม่ได้ลงนาม / ช่องมากขึ้นที่สูงขึ้นซึ่งอาจจะเป็นที่ถูกต้อง.)
snail_

ฉันคิดว่าถูกต้องเนื่องจากคำถามไม่ได้ระบุลำดับที่เฉพาะเจาะจงในการจัดเรียง (และเนื่องจากค่าที่ลงชื่อมีค่า0xFF000000น้อยกว่า0x00101010) แต่อย่างไรก็ตามฉันไม่แน่ใจว่าทำไมฉันจึงใช้จำนวนเต็มตรงนี้ ... ฉันคิดว่า เวลาที่ฉันไม่เข้าใจว่า GLOAD ใช้ค่าที่ไม่ได้ลงชื่อเมื่อคุณใช้อาร์เรย์ลอยและคิดว่ามันไม่ทำงาน
12Me21

2

Java, 424 417 404 ไบต์

นี่ไม่ใช่ภาษาที่คุณต้องการเล่นกอล์ฟใน ...

import java.awt.image.*;import java.io.*;import javax.imageio.*;class F{public static void main(String[]x)throws Exception{BufferedImage i,o;i=ImageIO.read(new File(x[0]));o=new BufferedImage(i.getWidth(),i.getHeight(),BufferedImage.TYPE_INT_RGB);o.setData(i.getRaster());int[]p=((DataBufferInt)o.getRaster().getDataBuffer()).getData();java.util.Arrays.sort(p);ImageIO.write(o,"png",new File("o.png"));}}

2

C #, 497 ไบต์

โพสต์ครั้งแรกกอล์ฟครั้งแรก เห็นได้ชัดว่าไม่ใช่สิ่งที่ดีที่สุดสำหรับการเล่นกอล์ฟ

ไม่ค่อยเคารพท่อ ใช้พา ธ รูปภาพเป็นอินพุตและเอาต์พุตด้วยตัวอักษร "o" ต่อท้ายชื่อ

ทำงานได้ดีขึ้นด้วยบิตแมปผลการต่อรองกับผู้อื่น

using System.Linq;using System.Drawing;using System.Runtime.InteropServices;class Program{static void Main(string[]args){using(var im=(Bitmap)Image.FromFile(args[0])){int h=im.Height;int w=im.Width;var b=im.LockBits(new Rectangle(0,0,w,h),System.Drawing.Imaging.ImageLockMode.ReadWrite,System.Drawing.Imaging.PixelFormat.Format32bppRgb);var p=new int[h*w];Marshal.Copy(b.Scan0,p,0,h*w);var q=p.ToList();q.Sort();p=q.ToArray();Marshal.Copy(p,0,b.Scan0,h*w);im.UnlockBits(b);im.Save("o"+args[0]);}}}

1

Haskell, 195 ไบต์

import Data.List
import Graphics.GD
f p=do 
 a<-loadPngFile p;(x,y)<-imageSize a;let l=[(i,j)|j<-[0..y],i<-[0..x]]
 mapM(flip getPixel a)l>>=mapM(\(d,c)->setPixel d c a).zip l.sort;savePngFile"o"a

สิ่งนี้ใช้GDห้องสมุด f <filename>การใช้ ไฟล์อินพุตต้องอยู่ในpngรูปแบบ oไฟล์ที่ส่งออกเป็นชื่อ

วิธีการทำงาน: ตรงไปตรงมาเช่นอ่านรูปภาพเดินข้ามพิกัดทั้งหมดและรับพิกเซลเรียงลำดับพิกเซลเดินข้ามพิกัดอีกครั้ง แต่คราวนี้ตั้งค่าพิกเซลตามลำดับที่ปรากฏในรายการเรียงลำดับเขียนไฟล์ไปที่ ดิสก์.

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

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