ทำให้เป็นก้อนกลมนี้! บทเรียนในโทนสีเทา…เอ่อ…สี…เอ่อ…อะไรก็ได้


27

เป็นแฟนตัวยงของลูกบาศก์ของ Rubik และศิลปะที่ยอดเยี่ยมฉันได้ทำงานร่วมกันทั้งสองเข้าด้วยกันเพื่อทำสิ่งที่ยอดเยี่ยมจริงๆ โดยทั่วไปการแก้ลูกบาศก์รูบิคขนาดเล็กเพื่อสร้างพิกเซลพื้นฐานในการก่อตัวของศิลปะลูกบาศก์รูบิค ตัวอย่างศิลปะดังกล่าวสามารถดูได้จากลิงก์นี้: http://google.com/search?q=rubik%27s+cube+art

ตอนนี้จุดประสงค์ของ Code Golf นี้คือการสร้างรหัสที่ยอมรับภาพเป็นอินพุตแล้วแปลงในลักษณะดังต่อไปนี้:

รูปภาพจะถูกลดขนาดไปเป็นสีเทาระดับเว็บที่ปลอดภัย เหตุผลหลังนี้เป็นเพราะเราต้องแยกจานสีเทาที่ปลอดภัยบนเว็บ (เช่น 000000, 333333, 666666, 999999, CCCCCC และ FFFFFF) อัลกอริทึมในวิธีการของการแปลงสีระดับสีเทามีอยู่ที่: http://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscaleควรที่คุณต้องการเพื่อการใช้งานที่เป็นแรงบันดาลใจ

จากนั้นจะแสดงเฉดสีเทาเป็นสีที่เหมาะสม หากต้องการทำลายมันอย่างรวดเร็ว: 000000 จะหมายถึงสีน้ำเงินของรูบิค 333333 จะหมายถึงสีแดงของรูบิค 666666 จะหมายถึงสีเขียวของรูบิค 999999 จะหมายถึงสีส้มของรูบิค CCCCCC จะอ้างถึงสีเหลืองของรูบิค

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

ค่า RGB ที่แท้จริงสำหรับจานสีของรูบิคจะต้องสอดคล้องกับสิ่งต่อไปนี้:

  • แดง: # C41E3A
  • เขียว: # 009E60
  • สีน้ำเงิน: # 0051BA
  • ส้ม: # FF5800
  • สีเหลือง: # FFD500
  • สีขาว: #FFFFFF

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

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

มีตารางอยู่เพื่อให้คุณสามารถดูว่าลูกบาศก์รูบิคขนาดเล็กแต่ละอันจะต้องมีการกำหนดค่าเพื่อสร้างภาพอย่างไร ขนาดที่แท้จริงของภาพที่ได้คือ 45 พิกเซลคูณ 45 พิกเซลความหมาย (45/3) * (45/3) = 15 * 15 = 225 คิวบ์ลูกบาศก์รูบิคขนาดเล็กจะถูกนำมาใช้เพื่อสร้างภาพนี้ ฉันไม่ได้คาดหวังให้คุณนำเสนอภาพที่เกิดขึ้นกับตารางที่ฉันมี

ดังนั้นนี่คือสิ่งที่ต้องการ:

  1. ภาพที่จะประมวลผลโดยอัลกอริธึมนี้จะต้องมีความกว้าง x พิกเซลโดยสูงเป็นพิกเซลของ y เช่นนั้น x และ y เป็นทวีคูณของ 3 เพื่อช่วยให้ง่ายต่อการเรนเดอร์ซึ่งเป็นส่วนหนึ่งของลูกบาศก์ลูกบาศก์รูบิค หากภาพของคุณมีขนาดค่อนข้างใหญ่ให้ลดขนาดประมาณ 45 x 45 ถึง 75 x 75 หรือมีขนาดประมาณนั้นก่อนที่จะทำการประมวลผล โปรดจำไว้ว่าองค์ประกอบการปรับขนาดนี้เป็นตัวเลือก

  2. ภาพจะต้องถูกแปลงเป็นจานลูกบาศก์ของรูบิค sextacolored เพื่อสร้างโมเสค

  3. ภาพที่ได้จะต้องเป็นไฟล์กราฟิกที่ถูกต้องหลังจากทำการประมวลผลแล้ว เพื่อพิสูจน์ว่าโค้ดของคุณใช้ได้กับภาพประธานาธิบดีคนใดคนหนึ่งของสหรัฐอเมริกาหรือดาราฮอลลีวูดที่รู้จักกันดี ฉันเคยใช้ Abraham Lincoln มาเป็นตัวอย่างแล้วดังนั้นประธานาธิบดีคนนี้จึงไม่สามารถใช้งานได้อีกต่อไป ตรวจสอบให้แน่ใจว่าคุณได้ระบุภาษาที่คุณใช้จำนวนไบต์รวมถึงประธานาธิบดี / ผู้มีชื่อเสียงที่ใช้ในการทดสอบรหัสของคุณรวมถึงก่อนและหลังนัด ...

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

5. รหัสที่สั้นที่สุดชนะ

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


4
ฉันคิดว่ามันจะเป็นการดีกว่าถ้าคุณเพิ่มค่า Rubik RGB ลงในโพสต์แทนที่จะใช้ลิงก์
SztupY

ไม่"ภาพที่ต้องดำเนินการจะต้องเป็น x พิกเซลกว้างพิกเซล Y สูง"หมายถึงการปรับขนาดที่เป็นส่วนหนึ่งของรหัสหรือภาพที่มีก่อนการประมวลผลขนาดต้อง?
2846289

มีสภาวะที่เป็นไปไม่ได้ของ Cube ของ Rubik หรือไม่หากคุณ จำกัด ใบหน้าเพียงหน้าเดียว
Nick T

1
@WallyWest คุณจะรักแอปของฉัน MineCam ทำเช่นนี้ แต่แทนที่จะสร้างสี่เหลี่ยมมันใช้บล็อกของฉันและมันยังทำ 15 ครั้งต่อวินาทีด้วยกล้อง iPhone แบบเรียลไทม์ซึ่งจะแปลงโลกทั้งใบให้กลายเป็น จักรวาลของฉัน itunes.apple.com/us/app/minecam/id675845303?mt=8 (หากเพียง แต่ยังสามารถสร้างเมล็ดพันธุ์สำหรับโลกที่กล่าวว่าฮ่าฮ่าฮ่าฮ่า)
Albert Renshaw

2
@WallyWest: มันไม่เกี่ยวกับความขี้เกียจ ปัญหาควรให้ข้อมูลทั้งหมดที่คุณต้องใช้ในการเริ่มต้นแม้ว่าส่วนที่เหลือของอินเทอร์เน็ตจะไม่ทำงาน ในหนึ่งหรือสองปีลิงก์นั้นอาจถูกลบและไม่มีผู้ใดจะอัปเดตลิงก์ หากคุณให้ข้อมูลเพียงพอเกี่ยวกับวิธีสร้างสีระดับสีเทาที่ปลอดภัยบนเว็บ (ซึ่งไม่จำเป็นในการแก้ปัญหา) คุณสามารถเพิ่มตารางการทำแผนที่ขนาดเล็กเช่น#000000 => #0051BAฯลฯได้อย่างง่ายดาย
SztupY

คำตอบ:


16

Imagemagick (108)

เวอร์ชัน: ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27

สายต่อไปนี้:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" input output

ที่ไหนinputและoutputจะต้องมีการแก้ไขสำหรับชื่อไฟล์อินพุตและเอาต์พุต

ฉันนับเฉพาะตัวอักษรระหว่าง-resizeและ#FFF"ถ้าคุณคิดว่ามันไม่ถูกต้องโปรดแสดงความคิดเห็น

ฉันใช้ Lenna เป็นรูปภาพ (เธอปรากฏตัวใน Playboy และทุกคนที่ทำเช่นนั้นควรนับเป็นดารา Hollywood ใช่ไหม)

การป้อนข้อมูล:

ใส่ภาพ

เอาท์พุท:

$ convert -resize 75x75 -fx "q=p.intensity;q<1/6?#0051BA:q<2/6?#C41E3A:q<3/6?#009e60:q<4/6?#ff5800:q<5/6?#FFD500:#FFF" Lenna.png LennaRubik.png

สร้างภาพแล้ว

เอาท์พุทขยาย:

ภาพขยาย

หมายเหตุ: ตามเอกสาร imagemagick คุณไม่สามารถมีโอเปอเรเตอร์ที่มีเงื่อนไขมากกว่าหนึ่งรายการในคำสั่ง แต่การโทรยังคงทำงานได้ดีดังนั้นอาจเป็นไปได้ว่าเอกสารนี้ได้รับการแก้ไขและเอกสารไม่ได้รับการอัปเดต

เรียกใช้ระบุภาพผล (เพื่อแสดงสีที่ดีจริง ๆ ):

$ identify -verbose LennaRubik.png
  (...)   
  Colors: 6
  Histogram:
       338: (  0, 81,186) #0051BA srgb(0,81,186)
      1652: (  0,158, 96) #009E60 srgb(0,158,96)
      1187: (196, 30, 58) #C41E3A srgb(196,30,58)
      1674: (255, 88,  0) #FF5800 srgb(255,88,0)
       706: (255,213,  0) #FFD500 srgb(255,213,0)
        68: (255,255,255) #FFFFFF white
  (...)

หากคุณคิดว่า Lenna ไม่นับว่าเป็นผู้มีชื่อเสียงที่เหมาะสมนี่คือ Bruce Willis:

Bruce Original

Bruce Small

Bruce Large


+1 ฉันคิดว่าคำตอบของคุณแทบจะไม่สามารถเอาชนะได้ (หรือเอาชนะได้เลย) ฉันแค่อยากจะแนะนำให้คุณถ่ายรูปดาราฮอลลีวู้ดหรือประธานาธิบดีอเมริกันอย่างไม่ต้องสงสัยและเพิ่มลงในนี้ (ไม่จำเป็นต้องลบ Lenna, เก็บทั้งสองไว้) มิฉะนั้นคนที่น่าเบื่อบางคนอาจบ่นและลงคะแนนเพียงเพราะ
Victor Stafusa

@Victor: ฉันคิดว่า Mathematica, Matlab หรือ Octave อาจเอาชนะสิ่งนี้ได้ง่ายเนื่องจากเงื่อนไขในfxส่วนนั้นสามารถบีบอัดได้ดียิ่งขึ้นในภาษาที่มีการแสดงออกที่ดีกว่า และภาษาเหล่านั้นยังมีการสนับสนุนภาพดั้งเดิม (ดังนั้นจึงไม่มีตัวอักษรหายไปโดยจำเป็นต้องนำเข้า imagemagick / gd / ฯลฯ )
SztupY

@SztupY ฉันรู้จัก Lenna ดีมาก ... ฉันจะนับว่า ... ทำงานได้ดีกับ Bruce Willis ด้วย ...
WallyWest

1
Lenna น่ารัก (r) ขึ้น
blabla999

+1 สำหรับการใช้เครื่องมือที่เหมาะสมสำหรับงาน เพื่อความเข้าใจของฉันวิธีที่ถูกต้องในการใช้ imagemagick คือการโทรภาพก่อนตัวเลือกมากกว่าไฟล์ผลลัพธ์
CousinCocaine

14

มาติกา

เราจะทำงานร่วมกับพื้นที่สี่เหลี่ยมจัตุรัสจากตราประทับของสหรัฐฯที่มีเกรตาการ์โบ jมันจะถูกเรียกว่า

J

f[i_,rs_,m_:True]:=
Module[{(*rs=rastersize-4*)r={0.77,0.12,0.23},gr={0,0.62,0.38},b={0,0.32,0.73},o={1,0.35,0},y={1,0.84,0},w={1,1,1},
c1={r,gr,b,o,y,w},grayGreta,garboColors},
grayGreta=(*Reverse@*)ImageData[ColorQuantize[Rasterize[i,(*ImageResolution \[Rule]15*)RasterSize->rs+1,ImageSize->rs],6]];
garboColors=Union@Flatten[grayGreta,1];
ArrayPlot[grayGreta/.Thread[garboColors-> RGBColor@@@c1],
Mesh->If[m==True,{rs-1,rs-1},None],MeshStyle->Black]]

ฟังก์ชัน f ใช้ 3 พารามิเตอร์:

  • i ซึ่งหมายถึงภาพ
  • rsขนาดเชิงภาพ
  • mเป็นตัวแปรบูลีนที่ระบุว่าควรใช้เส้นตาข่ายหรือไม่ (การตั้งค่าเริ่มต้นคือ True)

การใช้ขนาดแรสเตอร์ที่ 15, 30, 45 และ 75:

GraphicsGrid[{{f[j, 15], f[j, 30]}, {f[j, 45], f[j, 75]}}, ImageSize -> 800]

4 garbos

ฉันนึกภาพไม่ออกว่าใครสร้างลูกบาศก์ของรูบริกด้วยชิ้นส่วนมากมาย! การออกกำลังกายที่น่าสนใจอย่างไรก็ตาม


เล่นกับสี

นี่คือจากรายการก่อนหน้า รหัสแตกต่างกันเล็กน้อย ถูกนำมาใช้แทนGraphics ArrayPlotนอกจากนี้เรายังใช้ตราประทับเต็มแม้ว่าจะไม่ใช่สี่เหลี่ยม

มี 6! = 720 การเปลี่ยนสีของลูกบาศก์รูบริก

ต่อไปนี้แสดงภาพศูนย์กลางของแถวบน (ตั้งค่า 6 ภาพด้านล่าง) เมื่อค่าระดับสีเทาถูกจัดเรียงจากที่มืดที่สุดถึงที่เบาที่สุดสีคือ {r, gr, b, o, y, w} รูปแบบอื่น ๆ อย่างไรก็ตามการทำงาน

i เป็นภาพต้นฉบับในโทนสีเทา

Graphics[Raster[(g=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]])
/.Thread[Union@Flatten[g,1]-> {{7,1,2},{0,6,4},{0,3,7},{10,4,0},{10,8,0},{10,10,10}}/10]]]

i เป็นภาพระดับสีเทาดั้งเดิมของตราเกรตาการ์โบแบบเต็ม

Rasterize[garbo,RasterSize->75 rasterize รูปภาพให้เป็นอาร์เรย์ 75 x 75

ColorQuantize[<>, 6] ลดค่าระดับสีเทาเป็นชุด 6

ImageDataดึงข้อมูลอาร์เรย์จากภาพ; มันกลับหัวกลับหาง

Reverse พลิกอาเรย์ข้อมูลจากนั้นจึงรูปภาพขึ้นมาทางขวา

garboColors คือค่าระดับสีเทา 6 ค่าในภาพเชิงปริมาณ

Graphics[Raster แสดงภาพสุดท้าย

rubrikColors คือค่า RGB ของสีคิวบ์ 6 Rubrik

มีพีชสีหลายสี ได้แก่ แดงเขียวน้ำเงินส้มเหลืองและขาว

r={0.77,0.12,0.23};gr={0,0.62,0.38};b={0,0.32,0.73};o={1,0.35,0};y={1,0.84,0};w={1,1,1};
c1={r,gr,b,o,y,w};
c2={r,b,gr,o,y,w};
c3={b,r,gr,o,y,w};
c4={gr,b,r,o,y,w};
c5={b,r,gr,y,o,w};

และรหัส:

grayGreta=Reverse@ImageData[ColorQuantize[Rasterize[i,RasterSize->75],6]];
garboColors=Union@Flatten[grayGreta,1];
Grid[{{i,
Graphics[Raster[grayGreta/.Thread[garboColors-> c1]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c2]]]},
{Graphics[Raster[grayGreta/.Thread[garboColors-> c3]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c4]]],
Graphics[Raster[grayGreta/.Thread[garboColors-> c5]]]}}]

garbos


Garbos Galore

นี่คือภาพ Greta Garbo จำนวน 72 ภาพ (จาก 720) ที่ใช้สีลูกบาศก์รูบริก 6 สี รูปภาพบางรูปทำงานได้ดีกว่าภาพอื่น ๆ

GraphicsGrid@Partition[(Graphics[Raster[grayGreta /. Thread[garboColors -> #]]] & 
/@ Take[Permutations[{r, gr, b, o, y, w}, {6}], 72]), 12]

Garbos เยอะแยะ


เกรตาโอ้เกรตา ... นี่กลับดีกว่าที่ฉันคาดไว้ @DavidCarraher ทำงานได้ดีที่นี่ ...
WallyWest

@WallyWest ขอบคุณ มันเป็นความท้าทายที่น่าสนใจมาก
DavidC

ฉันแน่ใจว่า Mathematica จะเอาชนะ imagemagick ไม่สามารถเล่นกอล์ฟต่อไปได้หรือไม่ ฟังก์ชั่นเหล่านั้นได้รับการรับรองหรือไม่?
SztupY

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

1
แน่นอนมีความไม่สอดคล้องกันบางอย่างในรหัส ฉันหวังว่าพวกเขาจะหายไป iถือภาพต้นฉบับ grย่อมาจากสีเขียวของ Rubrik gอ้างถึงข้อมูลภาพแรสเตอร์และควอนไทซ์สำหรับภาพระดับสีเทา
DavidC

6

Smalltalk (Smalltalk / X), 289 139 *

อินพุต: i; ผลลัพธ์: r

r:=i magnifiedTo:75@75.
r colorMapProcessing:[:c||b|b:=c brightness.Color rgbValue:(#(16r0051BA 16rC41E3A 16r009e60 16rff5800 16rFFD500 16rFFFFFF)at:(b*6)ceiling)]

การป้อนข้อมูล:

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

เอาท์พุท:

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

ขยาย:

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

(สำหรับเด็กทุกคน: นี่ไม่ใช่มาดอนน่า ;-)

[*] ฉันไม่ได้นับกำลังขยายเป็น 75x75 (บรรทัดแรก) - อาจใช้การปรับขนาดเป็นอินพุตแล้ว หวังว่าจะโอเคกับคุณ


ฉันชื่นชอบ Marilyn Monroe ... ทางเลือกที่ดี ... การปรับขนาดเป็นคุณสมบัติที่เป็นตัวเลือก ...
WallyWest

4

สีของ Postscript และรูบิค TRUE! ;-)

ทีนี้วิธีแก้ปัญหานี้อยู่นอกเรื่องเล็กน้อยเนื่องจากมัน จำกัด อยู่เฉพาะทรงกลมที่ค่อนข้างเชี่ยวชาญ แต่หลังจากแห้วกับ "คำถามตัวเลขแปลก ๆ " (ไม่สามารถสร้างบางสิ่งบางอย่างที่ทำงานได้จริง) ฉันตัดสินใจที่จะเผยแพร่บางสิ่งบางอย่างและดึงสิ่งนี้ออกมาจากกองเขียนที่เขียนเสร็จครึ่งหนึ่งของฉันและทำให้มันเรียบร้อย

วิธีการแก้ปัญหาใช้ประโยชน์จากความจริงที่ว่าการแก้ไขครั้งแรกของคำถามนี้กำหนดสีที่ต้องการโดยลิงค์ไปยังเว็บไซต์ซึ่งระบุไว้อย่างชัดเจนว่าจะใช้สี Pantone (R) และสี RGB เป็นเพียงการประมาณ ถ้าอย่างนั้นฉันจะคิดว่าทำไมฉันถึงต้องทำประมาณเมื่อฉันสามารถทำสีของแท้? - :)

10 dict begin
/Size 75 def
/Names  [(PMS 012C) (PMS 021C) (PMS 347C)   (PMS 200C)    (PMS 293C)   ] def
/Colors [[0 .16 1 0][0 .65 1 0][1 0 .39 .38][0 .9 .72 .28][1 .56 0 .27]] def
<</PageSize [Size dup]>> setpagedevice
Size dup scale
true setoverprint
(%stdin) (r) file 100 string readline pop 
(r) file <</CloseSource true>>/DCTDecode filter
0 1000000 string 
dup <</CloseTarget true>>/NullEncode filter 
{
    3 index 3 string readstring
    {
        4 -1 roll 1 add 4 1 roll
        {} forall
        0.11 mul exch 0.59 mul add exch 0.3 mul add cvi
        1 index exch write
    } {pop exit} ifelse
} loop
closefile
0 3 -1 roll getinterval
exch closefile
/data exch def
/n data length sqrt cvi def
1 1 Names length {
    /N exch def
    { 
        dup N Names length 1 add div gt 
            {N 1 add Names length 1 add div gt 
                {1} {0} ifelse} 
            {pop 1} 
        ifelse
    } settransfer
    [/Separation Names N 1 sub get /DeviceCMYK {
        Colors N 1 sub get 
        { 1 index mul exch } forall pop
    }] setcolorspace
    <<
        /ImageType        1
        /Width            n
        /Height           n
        /ImageMatrix      [n 0 0 n neg 0 n]
        /BitsPerComponent 8
        /Decode           [0 1]
        /DataSource       data
    >> image
} for
showpage
end

รหัสนี้จะถูกบันทึกเป็นเช่นrubik.psแล้วส่งไปยัง Ghostscript ด้วยคาถาปกติ:

gs -q -sDEVICE=psdcmyk -o out.psd rubik.ps

จากนั้นรอคุณในบรรทัดถัดไปสำหรับการป้อนชื่อไฟล์ JPG เช่น

kelly.jpg

และถ้าทุกอย่างเป็นไปด้วยดีให้บันทึกเอาท์พุทเป็นout.psdไฟล์

อินพุตต้องเป็นสี่เหลี่ยมจัตุรัส RGB JPEG (ขนาดใดก็ได้) เอาต์พุตเป็น PSD พร้อมช่องสัญญาณสีพิเศษ คุณจะต้องใช้ Photoshop เพื่อดูไฟล์ การเปลี่ยนอุปกรณ์ GS psdcmykเป็นสิ่งอื่นจะไม่สามารถใช้งานได้ JPEG เป็นอินพุต - เนื่องจากล่าม postscript สามารถถอดรหัสสตรีมข้อมูลได้โดยตรง รูปทรงสี่เหลี่ยม - เนื่องจากโปรแกรมอาศัยsqrtความยาวของสตริงเพื่อค้นหาความกว้าง (และความสูง) ของรูปภาพ

บรรทัดแรกกำหนดขนาดภาพที่ส่งออก (สามารถเปลี่ยนได้จากค่าเริ่มต้น 75) และจานสี (สีและหมายเลขสามารถเปลี่ยนแปลงได้เช่นกัน) ฉันคิดว่ามีสิ่งอื่นใดที่ไม่ได้เข้ารหัสยาก

เกิดอะไรขึ้น? สตรีมของ RGB triplets ถูกแปลงอย่างรวดเร็วเป็นสตริงของค่าระดับสีเทา (ด้วยสูตรง่าย ๆ ) พจนานุกรมรูปภาพที่มีรูปกรวย 8 บิตปกติจะถูกสร้างและใช้ในการวาดภาพที่เหมือนกัน 5 ภาพที่ด้านบนของกันและกันในSeparationช่องว่าง5 สี เคล็ดลับคือการใช้ฟังก์ชั่นการถ่ายโอนก่อนการร้องขอของimageผู้ประกอบ เช่นสำหรับสีเหลืองฟังก์ชันนี้ส่งคืน 0 สำหรับค่าอินพุตในช่วง 0.167 .. 0.333 ช่วงเท่านั้นและ 1 เป็นอย่างอื่น

การป้อนข้อมูล:

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

ภาพหน้าจอของเอาต์พุต 75x75 เปิดใน Photoshop ขยาย 800%:

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

และชุดจานช่อง Photoshop:

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


1
+1 สำหรับการใช้ Grace Kelly ... คุณมีความเคารพอย่างสมบูรณ์ ...
WallyWest

3

C #

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        unchecked
        {
            var t = new[] { 0xFFC41E3A, 0xFF009E60, 0xFF0051BA, 0xFFFF5800, 0xFFFFD500, 0xFFFFFFFF }.Select(v => Color.FromArgb((int)v)).ToArray();
            var o = new Bitmap(Bitmap.FromFile(args[1]));
            var m = double.Parse(args[0]);
            var r = Math.Min(m / o.Width, m / o.Height);
            var w = (int)(o.Width * r);
            var h = (int)(o.Height * r);

            o = new Bitmap(o, w - (w % 3), h - (h % 3));
            for (int y = 0; y < o.Height; y++)
                for (int x = 0; x < o.Width; x++)
                    o.SetPixel(x, y, N(o.GetPixel(x, y), t));
            o.Save(args[2], ImageFormat.Png);
        }
    }

    static Color N(Color c, Color[] t)
    {
        return t.OrderBy(v => Math.Abs(W(v) - W(c))).First();
    }

    static double W(Color c)
    {
        return .11 * c.B + .59 * c.G + .30 * c.R;
    }
}

คุณต้องรันด้วย 3 พารามิเตอร์:

foo.exe 75 d:\test.jpg d:\out.png

75สูงสุดอยู่ที่ไหน width / height d:\test.jpgเป็นไฟล์อินพุตและd:\out.pngเป็นไฟล์เอาต์พุต

ผลลัพธ์สำหรับรูปภาพต่าง ๆ ในการประกวดนี้:

WallyWest SztupY 1 SztupY 2 blabla999

คนดังของฉัน:

ลาน!

เอาท์พุท:

การ์ ธ 75 การ์เด้น 225

อย่างไรก็ตามขนาดอื่น ๆ (ใหญ่กว่า 75x75) ทำให้ภาพดีขึ้น:

150 300

และถ้าเรายึดติดกับประธานาธิบดี:

DubbaYa 294 DubbaYa 75 DubbaYa 225

ตั้งแต่นี้ไม่มี codegolf (อีกต่อไป) ฉันไม่ได้รำคาญที่จะ "ย่อ" รหัสมากเกินไป นอกจากนี้เนื่องจากคำแนะนำไม่ได้กล่าวถึงภาพโดยเฉพาะอย่างยิ่งต้องมีความกว้างเท่ากับความสูง (สี่เหลี่ยม) ฉันไม่ได้กังวลเรื่องการครอบตัด อย่างไรก็ตามฉันต้องแน่ใจว่าภาพมีความกว้างหลายคูณ 3 พิกเซล / สูง หากคุณต้องการภาพสี่เหลี่ยมจัตุรัสให้ใช้การป้อนสี่เหลี่ยมจัตุรัส: Pในที่สุด อัลกอริทึมอยู่ไกลจากที่ดีที่สุด

อีกไม่กี่ (เนื่องจากผู้คนโหวตให้ chicks ร้อนแรง / อินเทอร์เน็ตฮีโร่มากขึ้น: P)

Kari Byron 300 Kari Byron 75 Kari Byron 225 The Hoff 300 The Hoff 75 The Hoff 225


3

brainfuck

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

สิ่งนี้ต้องการล่าม BF / คอมไพเลอร์ที่มี -1 เป็น EOF และมีเซลล์สูงกว่า 8 บิตหากหนึ่งในพิกเซลสีแดงคือ 255 หรือมิฉะนั้นจะหยุดก่อนกำหนดเนื่องจากจะไม่สามารถแตกต่างกันระหว่าง EOF และค่า 0xFF . ด้วย jitbf คุณมีสิ่งที่เครื่องมีขนาดเป็นจำนวนเต็มและสามารถทำสิ่งนี้เพื่อบังคับ -1 เป็น EOF:

jitbf --eof -1 rubiks.bf < angelina.pnm > angelina-rubix.pnm

รูปแบบไฟล์ภาพที่เรนเดอร์เป็นไฟล์ RGB PNM แบบเต็ม (P6) แบบ raw เป็นตัวเลือกใน Gimp

ใช้ช่องสีเขียวเท่านั้น (ซึ่งเป็นหนึ่งในหลายวิธีในการแปลงภาพสีเป็นเฉดสีเทา) มันลดค่าลง 43 โดยไม่ต้องลดค่าต่ำกว่าศูนย์เพื่อหาสี rubiks ที่จะใช้และมีสวิตช์ที่พิมพ์สี RBG ที่ถูกต้องที่สอดคล้องกัน

รูปภาพของ Angelina Jolie จากแฮกเกอร์ (1995)ลดขนาดลงเหลือ 75x75 และประมวลผลด้วยแอปพลิเคชัน:

Angelina Jolie 75x75 / การใช้งานที่เหมาะสม Angelina Jolie 75x75 in Rubiks cube colours / Fair Use ขนาดเท่ากัน 6x

เหมือนกันมีเพียงฉันเท่านั้นที่ใช้ขนาดเดิม :

เหมือนกันเท่านั้นที่ไม่ได้ลดขนาดลงก่อน / การใช้งานที่เหมาะสม

และเนื่องจากฉันจิตใจที่นี่เป็นประธานาธิบดีเช่นกัน:

Arnold Schwarzenegger CC จาก Wikipedia


ปิดหัวข้อ แต่ในปัจจุบัน xkcdยังมีการอ้างอิงถึงแฮกเกอร์ (1995)
Sylwester

1
อันนี้ก็เช่นกัน: xkcd.com/1247
Shade

1

Objective-C

เมื่อคืนนี้ฉันเห็นความท้าทายและมีช่วงเวลาที่สับสนเล็กน้อย-[NSArray indexOfObject:inSortedRange:options:usingComparator:]ดังนั้นความล่าช้า

- (UIImage  *)rubiksImage:(UIImage *)inputImg
{
    //Thank you http://stackoverflow.com/a/11687434/1153630 for the greyscale code
    CGRect imageRect = CGRectMake(0, 0, inputImg.size.width, inputImg.size.height);

    int width = imageRect.size.width;
    int height = imageRect.size.height;

    uint32_t *pixels = (uint32_t*)malloc(width * height * sizeof(uint32_t));

    memset(pixels, 0, width * height * sizeof(uint32_t));

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

    CGContextDrawImage(context, imageRect, [inputImg CGImage]);

    const int RED = 1;
    const int GREEN = 2;
    const int BLUE = 3;

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            uint8_t* rgbaPixel = (uint8_t*)&pixels[y * width + x];
            uint32_t grayPixel = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];

            NSArray *r = [self rubixColorFromGrey:grayPixel];

            rgbaPixel[RED] = [r[2] integerValue];
            rgbaPixel[GREEN] = [r[1] integerValue];
            rgbaPixel[BLUE] = [r[0] integerValue];
        }
    }

    CGImageRef newCGImage = CGBitmapContextCreateImage(context);

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    free(pixels);

    UIImage* newUIImage = [UIImage imageWithCGImage:newCGImage];

    CGImageRelease(newCGImage);

    return newUIImage;
}

- (NSArray *)rubixColorFromGrey:(uint32_t)p
{
    NSArray *colors = @[@0, @51, @102, @153, @204, @255];

    NSUInteger index = [colors indexOfObject:@(p)
                               inSortedRange:NSMakeRange(0, colors.count)
                                     options:NSBinarySearchingInsertionIndex | NSBinarySearchingFirstEqual
                             usingComparator:^(id a, id b) {
                                return [a compare:b];
                             }];
    switch (index) {
        case 0:
            return rgb(0, 81, 186);
            break;
        case 1:
            return rgb(196, 30, 58);
            break;
        case 2:
            return rgb(0, 156, 96);
            break;
        case 3:
            return rgb(255, 82, 0);
            break;
        case 4:
            return rgb(255, 213, 0);
            break;
        case 5:
            return rgb(255, 255, 255);
            break;

        default:
            break;
    }

    return colors; //go wild
}

NSArray *rgb(int r, int g, int b)
{
    return @[@(r), @(g), @(b)];
}

ฉันวิ่งบนไอแพดของฉันอย่างนั้น:

UIImageView *img = [[UIImageView alloc] initWithImage:[self rubiksImage:[UIImage imageNamed:@"danny.png"]]];
[img setCenter:self.view.center];
[self.view addSubview:img];

ก่อน แดนนี่เดวิโต้มาก่อน หลัง Danny DeVito After

ก่อน เกรซเคลลี่ก่อน หลัง เกรซเคลลี่หลังจาก


1

หลาม

รูปแบบ: python rubik.py <input> <max_cubes> <output>.

แปลงพิกเซลเป็นสีเทาโดยใช้อัลกอริทึมที่แนะนำ

import Image, sys

def rubik(x, max_cubes = 25):

    img = x
    max_cubes *= 3

    if x.size[0] > max_cubes or x.size[1] > max_cubes:

        print "Resizing image...",

        if x.size[0] > x.size[1]:
            img = x.resize((max_cubes, int(max_cubes * float(x.size[1]) / x.size[0])), Image.ANTIALIAS)
        else:
            img = x.resize((int((max_cubes * float(x.size[0]) / x.size[1])), max_cubes), Image.ANTIALIAS)

    if x.size[0] % 3 or x.size[1] % 3:
        print "Sizes aren't multiples of 3"
        return

    print "Image resized to %i x %i pixels" % img.size

    out = Image.new('RGB', img.size)

    print "Converting image...",

    for x in xrange(out.size[0]):
        for y in xrange(out.size[1]):
            r, g, b = img.getpixel((x, y))
            if r == g == b == 255:
                out.putpixel((x,y), (255, 255, 255))
            else:
                l = 0.2126 * r + 0.7152 * g + 0.0722 * b
                l /= 255
                out.putpixel((x,y), (
                        (0x00, 0x51, 0xBA),
                        (0xC4, 0x1E, 0x3A),
                        (0x00, 0x9E, 0x60),
                        (0xFF, 0x58, 0x00),
                        (0xFF, 0xD5, 0x00)
                    )[int(5 * (l <= 0.0031308 and 12.92 * l  or 1.055 * l ** (1/2.4) - 0.055))])

    print "Image converted successfully."

    print "Stats:"
    h, v = img.size[0] / 3, img.size[1] / 3
    print "   ", h, "horiz. Rubik cubes"
    print "   ", v, "vert. Rubik cubes"
    print "   ", h * v, "total Rubik cubes"

    return out.resize((out.size[0], out.size[1]))

if __name__ == "__main__":
    rubik(Image.open(sys.argv[1]).convert("RGB"), int(sys.argv[2])).save(sys.argv[3])

การป้อนข้อมูล:

Sandro Pertini
(ที่มา: ilmamilio.it )

เอาท์พุทกับmax_cubes = 25:

Sandro Pertini, รูบิค 1

เอาท์พุทกับmax_cubes = 75:

Sandro Pertini, Rubik'd 2

เอาท์พุทกับmax_cubes = 225:

Sandro Pertini, Rubik'd 3


สีขาวหายไปหรือไม่ และที่มืดที่สุดควรเป็นสีน้ำเงิน แต่อย่างที่ฉันเห็นตอนนี้นั่นคือปัญหาของรูปภาพอื่น ๆ ด้วย
2846289

@VAdimiR อ๊ะ! แมปพวกเขาในลำดับที่ไม่ถูกต้อง สำหรับสีขาวที่ไม่ปรากฏขึ้นนั้นเป็นเพราะความแม่นยำของ FP (1.055 - 0.055 = 0.9999999999999999) ฉันคิดว่าฉันจะต้องใส่รหัสสีขาวซึ่งไม่ยากเนื่องจากมันจะแสดงเฉพาะในค่าเริ่มต้นของ #FFFFFF เท่านั้น
Oberon

เกี่ยวกับสีขาวความคิดเห็นของฉันคือช่วง 0..1 (ความสว่าง) แบ่งออกเป็น 6 ส่วนและสิ่งใดที่ 0.83..1.00 ถูกแมปเป็นสีขาวหรืออย่างอื่นจะไม่มีความรู้สึกในการทำภาพ 6 สีของลูกบาศก์ แต่นั่นเป็นวิธีที่ฉันอ่าน
user2846289

@Oberon ตัวเลือกที่น่าสนใจโดยใช้ Pertini ... เขาเกือบจะอายุถึง 94 ... และทำงานได้ดีกับ Python และฉันต้องยอมรับไม่ใช่ภาษาที่ง่ายที่สุดที่ฉันเคยพบมาทำได้ดีมาก!
WallyWest
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.