สีในดาวของเรา


90

เขียนโปรแกรมที่ใช้ในสตริงหรือไฟล์ข้อความที่บรรทัดแรกมีรูปแบบ

width height

และแต่ละบรรทัดถัดมามีแบบฟอร์ม

x y intensity red green blue

ที่อยู่:

  • widthและheightอาจเป็นจำนวนเต็มบวกใด ๆ
  • xและyอาจเป็นจำนวนเต็มใด ๆ
  • intensity อาจเป็นจำนวนเต็มใด ๆ ที่ไม่เป็นลบ
  • red, greenและblueอาจเป็นจำนวนเต็มตั้งแต่ 0 ถึง 255

โปรแกรมต้องส่งออกของคุณTrueColorภาพในรูปแบบใดที่พบบ่อย lossless ไฟล์ภาพที่มีขนาดโดยwidth heightแต่ละx y intensity red green blueบรรทัดแสดงถึงดาวหรือลูกโลกที่มีสีสันที่ต้องวาดลงบนภาพ อาจมีจำนวนดาวที่จะวาดรวมทั้ง 0 คุณอาจถือว่าสตริงหรือไฟล์มีการขึ้นบรรทัดใหม่

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

สำหรับทุกพิกเซล ( X , Y ) ในภาพ (โดยที่Xคือ 0 ที่ขอบซ้ายสุดและความกว้าง -1ที่ขอบขวาสุดและYคือ 0 ที่ขอบด้านบนและความสูง -1ที่ขอบด้านล่าง) ช่องสีC ϵ { แดง , เขียว , น้ำเงิน } (ค่าที่ปักระหว่าง 0 ถึง 255) ได้รับจากสมการ:

สมการช่องสี

โดยที่ฟังก์ชันdistเป็นระยะทางแบบยุคลิดอย่างใดอย่างหนึ่ง:

สมการระยะทางแบบยุคลิด

หรือระยะทางแมนฮัตตัน :

สมการระยะทางแมนฮัตตัน

เลือกฟังก์ชั่นระยะทางที่คุณต้องการตามความสามารถในการเล่นกอล์ฟหรือความสวยงาม

แต่ละบรรทัดในอินพุตนอกเหนือจากแรกคือองค์ประกอบของชุดดาว ดังนั้นสำหรับตัวอย่าง, S xหมายถึงxค่าหนึ่งของเส้นที่นำเข้าและ S Cหมายถึงอย่างใดอย่างหนึ่งred, greenหรือblueขึ้นอยู่กับช่องสีในปัจจุบันคือการคำนวณ

ตัวอย่าง

ตัวอย่างก

หากอินพุตเป็น

400 150
-10 30 100 255 128 0

ผลลัพธ์ที่ควรจะเป็น

ตัวอย่าง A, Euclidean

หากคุณใช้ระยะทางแบบยุคลิดและ

ตัวอย่าง A แมนฮัตตัน

ถ้าคุณใช้ระยะทางแมนฮัตตัน

ตัวอย่าง B

หากอินพุตเป็น

200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255

เอาต์พุตที่เกี่ยวข้องสำหรับ Euclidean และระยะทางแมนฮัตตันควรเป็น

ตัวอย่าง B, Euclideanตัวอย่าง B แมนฮัตตันและ

ตัวอย่างค

หากอินพุตเป็น

400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123

ผลลัพธ์ที่ควรจะเป็น

ตัวอย่าง C, Euclidean

หากคุณใช้ระยะทางแบบยุคลิดและ

ตัวอย่าง C แมนฮัตตัน

ถ้าคุณใช้ระยะทางแมนฮัตตัน

ตัวอย่าง D

หากอินพุตเป็น

400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123

ผลลัพธ์ที่ควรจะเป็น

ตัวอย่าง D, Euclidean

หากคุณใช้ระยะทางแบบยุคลิดและ

ตัวอย่าง D แมนฮัตตัน

ถ้าคุณใช้ระยะทางแมนฮัตตัน

ตัวอย่าง E

หากอินพุตเป็น

100 1

ผลลัพธ์ควรเป็นภาพที่มีความกว้าง 100 พิกเซลสูง 1 พิกเซลซึ่งเป็นสีดำสนิท

หมายเหตุ

  • ใช้สตริงที่ป้อนหรือชื่อของไฟล์ข้อความที่มีมันจาก stdin หรือบรรทัดคำสั่งหรือคุณอาจเขียนฟังก์ชั่นที่ใช้ในสตริง
  • "กำลังแสดงผล" รูปภาพหมายถึง:
    • บันทึกเป็นไฟล์ด้วยชื่อที่คุณต้องการ
    • การพิมพ์ข้อมูลไฟล์ภาพดิบไปยัง stdout
    • แสดงภาพเช่นกับPILimage.show() 's
  • ฉันจะไม่ตรวจสอบว่าภาพของคุณเป็นพิกเซลที่สมบูรณ์แบบ (การแลกเปลี่ยนแบบสแต็กบีบอัดรูปภาพอย่างสูญเปล่าอยู่แล้ว) แต่ฉันจะสงสัยมากถ้าฉันสามารถบอกความแตกต่างได้ด้วยสายตา
  • คุณสามารถใช้ไลบรารีกราฟิก / รูปภาพ

การชนะ

การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ ในกรณีของความสัมพันธ์การส่งที่เร็วที่สุดชนะ

โบนัสสนุก:ให้อินพุตสำหรับภาพเอาต์พุตที่น่าประทับใจอย่างแท้จริง


38
+1 ว้าว นี่คือรูปหล่อ (และเวลาที่เหมาะสมสำหรับการโพสต์ในขณะที่เราได้ยินคำพูดจากยานอวกาศนิวฮอริซอนที่ดีต่อสุขภาพ!)
BrainSteel

อินพุตต้องอยู่ในรูปแบบที่คั่นด้วยช่องว่างหรือสามารถคั่นด้วยเครื่องหมายจุลภาคหรือไม่ อย่างไรก็ตาม +1
Maltysen

1
@Maltysen Space คั่น (ฉันรู้ว่ามันตระหนี่ แต่ง่ายกว่าการอนุญาตให้ใช้ชุดข้อมูลเข้าโหล)
งานอดิเรกของ Calvin

4
ฉันไม่สามารถตัดสินใจได้ว่าลูกกลมหรือดวงดาวนั้นสวยงามกว่านี้หรือไม่
trichoplax

เพื่อความสมบูรณ์แบบของพิกเซลคุณสามารถเปรียบเทียบแฮชบิตแมป
Tobias Kienzler

คำตอบ:


26

Pyth - 46 ไบต์

สนุกมาก! ในที่สุดฉันก็ต้องใช้คุณสมบัติภาพ I / O ของ Pyth ระยะทางแบบยุคลิดนั้นไม่แน่นอนเพราะความเป็นลูกกอล์ฟแม้ว่าแมนฮัตตันจะเป็นการเปลี่ยนแปลงเพียงเล็กน้อย

Krz7.wcmmsm/*@b+3k@b2h.a,<b2_.DdhKrR7.zU3*FKhK

นี่จะวนซ้ำพิกเซลทั้งหมดด้วยสูตรแม้ว่าจะควบแน่นวนรอบพิกเซลเป็นหนึ่งวงและใช้divmodเนื่องจาก Pyth รองรับเฉพาะแผนที่ที่ซ้อนกัน 3 แผนที่และการคำนวณใช้เวลาสอง (หนึ่งสำหรับ RGB และอีกหนึ่งดวงสำหรับดาว)

o.pngบันทึกภาพเป็น ค่อนข้างช้าการทดสอบ 2 ครั้งแรกใน <2 นาที แต่อีก 2 การทดสอบใช้เวลาครึ่งชั่วโมง

มีข้อผิดพลาดในการ.wที่ไม่มีใครสังเกตเห็นเพราะไม่มีใครใช้มัน;) แต่ฉันใส่คำขอดึงเพื่อใช้ส้อมของฉันเพื่อทดสอบว่าจะไม่รวมกันในไม่ช้า รวม!

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

ตัวอย่างก

ตัวอย่างก

ตัวอย่าง B

ตัวอย่าง B

ตัวอย่างค

ตัวอย่างค

ตัวอย่าง D

ตัวอย่าง D


7
ว้าวไม่รู้ว่า Pyth จะทำอย่างนั้นได้ วันหนึ่งเราอาจสิ้นสุดการเขียนซอฟต์แวร์ธุรกิจใน Pyth มันเป็นรหัสที่น้อยกว่าในการเขียนดังนั้นจึงควรมีการ refactor ที่เร็วและง่ายขึ้น : D
Cristian Lupascu

7
@ w0lf "เวลาโปรแกรมเมอร์มีความสำคัญมากกว่าเวลาดำเนินการ" และเราทุกคนรู้ว่า Pyth ช่วยลดเวลาโปรแกรมเมอร์ :) ภาพ I / O ถูกเพิ่มเมื่อเร็ว ๆ นี้หลังจาก Pyth ถูกปล่อยออกมาจากความท้าทายในการแสดงผลกราฟิก มันใช้หมอนภายใน
Maltysen

11
@ แนทอย่างแน่นอน มันไม่มีอะไรเกี่ยวข้องกับความเร็วในการเขียน ความคิดเห็นก่อนหน้าของฉันเป็นเรื่องตลก
Cristian Lupascu

2
พวกคุณลืมสิ่งสำคัญสิ่งหนึ่ง - มันง่ายต่อการดีบักเช่นกันเนื่องจากโค้ดน้อย;)
เครื่องมือเพิ่มประสิทธิภาพ

14
โดยการลดเวลาโปรแกรมเมอร์คุณหมายถึง "พวกเขากำลังเล่นรหัสกอล์ฟด้วย pyth และมีเวลาน้อยกว่าในการเขียนรหัส 'จริง'?

42

JavaScript 394 344

function X(a){for(l=a.match(/\d+/g),h=document,v=h.body.appendChild(h.createElement("canvas")),v.width=W=l[0],v.height=H=l[1],w=v.getContext("2d"),e=w.createImageData(W,H),d=e.data,N=W*H;N--;)for(i=2,c=N*4,d[c+3]=255;i<l.length;)for(x=N%W-l[i++],y=~~(N/W)-l[i++],k=l[i++],q=0;q<3;)d[c+q++]+=k*l[i++]/-~Math.sqrt(x*x+y*y);w.putImageData(e,0,0);}

แก้ไข:ย่อโค้ดให้สั้นลงมากโดยใช้คำแนะนำที่ดีเลิศของwolfhammer

ทดสอบ

หมายเหตุ: รอสองสามวินาทีเพื่อให้ตัวอย่างด้านล่างเพื่อแสดงผล (ใช้เวลาประมาณ 4 วินาทีในเครื่องของฉัน)

นอกจากนี้คุณยังสามารถเรียกใช้มันในJSFiddle

โบนัส: Blue Eclipse

function X(a){for(l=a.match(/\d+/g),h=document,v=h.body.appendChild(h.createElement("canvas")),v.width=W=l[0],v.height=H=l[1],w=v.getContext("2d"),e=w.createImageData(W,H),d=e.data,N=W*H;N--;)for(i=2,c=N*4,d[c+3]=255;i<l.length;)for(x=N%W-l[i++],y=~~(N/W)-l[i++],k=l[i++],q=0;q<3;)d[c+q++]+=k*l[i++]/-~Math.sqrt(x*x+y*y);w.putImageData(e,0,0);}

var j = 0;
var renderFrame = function () {
  if(window.h && window.v){h.body.removeChild(v);} // clear prev frame
  X("225 150\n" +
    (70 + j) + " " + (120 - j) + " 170 135 56 0\n" + 
    j * 5 + " " + j * 3 + " 64 0 50 205");       
  if(++j < 50) { setTimeout(renderFrame, 1); } else { console.log('done!'); }
};
setTimeout(renderFrame, 10);

นอกจากนี้คุณยังสามารถเรียกใช้มันในJSFiddle

ลักษณะ

นี่คือการปรับใช้ JavaScript + HTML5 Canvas ที่ตรงไปตรงมา: ฟังก์ชันที่รับอาร์กิวเมนต์สตริง (โดยไม่มีการเว้นวรรค / การขึ้นบรรทัดใหม่) และแสดงผลลัพธ์ใน DOM มันใช้ระยะทางแบบยุคลิด

นี่คือรหัสที่อ่านได้:

X = function (str) {
  var lines = str.split("\n");  
  var canvas = document.createElement('canvas');
  var z = lines[0].split(u=' ');
  var width = z[0], height = z[1];

  canvas.width = width;
  canvas.height = height;
  document.body.appendChild(canvas);

  var ctx = canvas.getContext("2d");
  var imageData = ctx.createImageData(width, height);

  for(var y = 0; y < height; y++){
    for(var x=0; x < width; x++){
      var coord = (y * width + x) * 4;

      for(i=1; i < lines.length;i++){
        var t = lines[i].split(u);

        var 
          dx = x - t[0], 
          dy = y - t[1];

        var distance = Math.sqrt(dx * dx + dy * dy);

        for(var channel = 0; channel < 3; channel++) {
          var channelIndex = coord + channel;
          imageData.data[channelIndex] += t[2] * t[3 + channel] / (distance + 1);
        }
      }

      var alphaIndex = coord + 3;
      imageData.data[alphaIndex] = 255;
    }
  }

  ctx.putImageData(imageData, 0, 0);
};

ฉันชอบที่รัศมีติดกาวด้วยกันใน Blue Eclipse คุณสามารถเพิ่มสไตล์ manhatan ได้หรือไม่?
PTwr

1
@ PTwr แน่นอนนี่คือ: jsfiddle.net/pjLnazw1
Cristian Lupascu

น่ากลัว! (อีก 7 ไป ...
Ugh

@ w0lf คุณสามารถโกนบางฟังก์ชั่นของคุณด้วยการรวมตัววนซ้ำ x และ y jsfiddle
wolfhammer

@wolfhammer ว้าวนั่นตอนนี้เป็นเพียง "บางไบต์" มันมีการปรับปรุงมากมาย ฉันจะดูทีหลังเพราะฉันเชื่อว่ามีบางสิ่งที่ต้องแก้ไขเกี่ยวกับการจัดทำดัชนี (สำหรับภาพตัวอย่าง 2, 3 และ 4 พิกเซลทางด้านซ้ายจะปรากฏขึ้นเพื่อล้อมรอบ) ขอบคุณ!
Cristian Lupascu

26

Java - 627 ไบต์

Java เป็นหนึ่งในภาษากอล์ฟที่ดีที่สุด :)

import java.awt.image.*;class M{void f(String n)throws Exception{String[]p=n.split("\n");int[]b=s(p[0]);BufferedImage o=new BufferedImage(b[0],b[1],2);for(int i=0;i<b[0];i++)for(int j=0;j<b[1];j++){int[]c=new int[3];for(int l=1;l<p.length;l++){int[]r=s(p[l]);for(int k=0;k<3;k++){c[k]+=r[2]*r[3+k]/(Math.sqrt(Math.pow(i-r[0],2)+Math.pow(j-r[1],2))+1);if(c[k]>255)c[k]=255;}}o.setRGB(i,j,new java.awt.Color(c[0],c[1],c[2]).getRGB());}javax.imageio.ImageIO.write(o,"png",new java.io.File("o.png"));}int[]s(String s){String[]a=s.split(" ");int[]r=new int[a.length];for(int i=0;i<a.length;i++)r[i]=Integer.valueOf(a[i]);return r;}}

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

1950 50
-15 25 25 255 255 0
39 25 1 255 0 0
55 25 3 255 140 0
68 25 4 0 191 255
92 25 2 255 0 0
269 ​​25 10 245 222 179
475 25 7 245 245 220
942 25 6 0 250 150
1464 25 6 0 0 255
1920 25 1 255 245 238

ระบบสุริยะด้วยพลูโต

ภาพ Full HDซึ่งดูไม่ดีเลย ... จะมีความสุขถ้ามีคนปรับปรุงได้!


15
+1 สำหรับระบบพลังงานแสงอาทิตย์ -1 สำหรับการออกจากพลูโต (ตอนนี้เรารู้สีและขนาดจริงแล้ว)
เครื่องมือเพิ่มประสิทธิภาพ

1
นอกจากนี้มันจะดีมากหากมีการเชื่อมโยงวอลเปเปอร์ 1080p เต็มรูปแบบ :)
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ฉันเพิ่มพลูโต;) ให้ดูว่าฉันสามารถทำอะไรเกี่ยวกับวอลล์เปเปอร์
CommonGuy

1
@ Sp3000 Ups ลืมความรุนแรงเมื่อฉันเพิ่มพลูโต
CommonGuy

2
โปรดทราบว่าดาวเสาร์ไม่ใช่ดาวเคราะห์ดวงเดียวที่มีวงแหวน หากคุณได้รับเสียงเรียกเข้าให้ทำงานคุณควรเพิ่มลงในดาวยูเรนัสด้วย
mbomb007

20

Bash, 147 145 ไบต์

ImageMagick ใช้สำหรับจัดการรูปภาพ ใช้ระยะทางแบบยุคลิด

read w h
o=o.png
convert -size $w\x$h canvas:black $o
while read x y i r g b
do
convert $o -fx "u+$i*rgb($r,$g,$b)/(hypot(i-$x,j-$y)+1)" $o
done

$w\x$hคุณสามารถบันทึกไบต์ด้วย
deltab

... และอื่น ๆ o=o.pngที่มี
deltab

16

Python 3, 189 ไบต์

ฉันไม่มีความคิดเกี่ยวกับนักกอล์ฟผู้เชี่ยวชาญ แต่ไปที่นี่

  • ป้อนข้อมูลมาจากstdinและไปstdoutในรูปแบบ PPM
  • เรียกใช้เช่น: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

ครั้งแรกระยะทางแมนฮัตตัน:

import sys
(w,h),*S=[list(map(int,l.split()))for l in sys.stdin]
print('P3',w,h,255,*(min(int(sum((I*C[z%3]/(abs(X-z//3%h)+abs(Y-z//3//h)+1))for
X,Y,I,*C in S)),255)for z in range(h*w*3)))

และประการที่สอง, ระยะทางแบบยุคลิด:

import sys
(w,h),*S=[list(map(int,l.split()))for l in sys.stdin]
print('P3',w,h,255,*(min(int(sum((I*C[z%3]/(abs(X-z//3%h+(Y-z//3//h)*1j)+1))for
X,Y,I,*C in S)),255)for z in range(h*w*3)))

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

รุ่นที่ไม่ดีและการเล่นกอล์ฟดั้งเดิมของฉันก่อนที่จะมองโลกในแง่ดีที่คนอื่น ๆ ชี้ให้เห็นหรือว่าฉันสะดุดตัวเองอยู่ในส่วนสำคัญนี้

แก้ไข:ฉันบันทึก 7 ไบต์โดยการย้ายfor xและfor yเข้าสู่ฟังก์ชั่นเดียวprint(หรือo) แต่สิ่งนี้สร้างไฟล์ PNM ที่มีบรรทัดที่ยาวมากซึ่งอาจหรืออาจไม่ก่อให้เกิดปัญหาบางอย่าง

แก้ไข 2: Maltysen ช่วยฉันอีก 20 ไบต์ ขอบคุณ!

แก้ไขอีกครั้ง:ตอนนี้มีเพียงหนึ่งprintในoนามแฝงเป็นความรับผิดไม่ประหยัด ปิด 4 ไบต์เพิ่มเติม

แก้ไขเพิ่มเติม: Sp3000 ช่วยฉันอีก 2 ไบต์ ในขณะเดียวกัน aliasing mapจะmไม่ได้ประหยัดอะไรดังนั้นในความสนใจของการอ่าน (!) ผมเคยขยายตัวอีกครั้ง ตอนนี้มันเป็นรอบที่ดีที่ 2 8ไบต์

แก้ไขล่าสุด (?):ตอนนี้ด้วยการสนับสนุนระยะทางแบบยุคลิด - และด้วยการใช้ตัวเลขที่ซับซ้อนในทางที่ผิดฉันก็ทำมันด้วยจำนวนไบต์ที่เท่ากันทุกประการ!

แก้ไขการรีบู๊ตฮอลลีวูด:ข้อเสนอแนะต่อไปของ Sp3000 ทำให้ล้มลงไป 5 ไบต์

แก้ไขข้อความต่อเนื่องที่มีชื่อว่าโง่เง่า: 6 ไบต์ถูกตัดออกเนื่องจากคำแนะนำของ Maltysen ทำให้ฉันไม่เข้าใจจนกว่า Sp3000 จะทำซ้ำ ... จากนั้นอีก 8 ไบต์จาก%การละเมิด และการพูดคุยกันในการแชททำให้เกิดปรากฏการณ์ขึ้นมา2126 ไบต์ ฉันถ่อมตน


@Maltysen: ค่อนข้างถูกต้อง บันทึกแล้ว 20 ไบต์!
ทิม Pederick

เพิ่มเติม: แทนที่จะเป็นสิ่งที่ซับซ้อน sys.stdin ที่มีEOFs คุณสามารถใช้iter()กับค่า Sentinel: docs.python.org/2/library/functions.html#iterเป็นiter(raw_input,'')ยังวางไว้w,h,Sในบรรทัดเดียวกันกับขยายออก
Maltysen

@ Maltysen: ฉันไม่แน่ใจว่าจะทำงานได้ ฉันทำอย่างนั้นเกือบทุกอย่างแล้ว แต่มันก็กระทบEOFError(และฉันต้องการtryบล็อก) เนื่องจากไม่มีบรรทัดว่างในไฟล์อินพุตและฉันไม่แน่ใจว่าความท้าทายช่วยให้ฉันเพิ่มได้ หรือว่าฉันขาดอะไรไป?
ทิม Pederick

ฉันคิดว่าถ้าคุณเห็นคุณค่าของ Sentinel คุณสามารถยกเลิกโดยใช้บรรทัดว่างกับการป้อนไฟล์ได้แม้ว่าใช่ไฟล์จะไม่ทำงาน
Maltysen

@ Sp3000: น่าประหลาดใจใช่! ฉันคาดหวังว่าจะบ่นว่าstdinไม่ใช่ตัววนซ้ำ
ทิม Pederick

10

C ++, 272 ไบต์

#include<png.hpp>
#define G(a)i>>C;for(x=0;x<w*h;++x){auto&p=img[x%h][x/h];c=p.a+I*C/(abs(x/h-X)+abs(x%h-Y)+1);p.a=c>255?255:c;}
auto&i=std::cin;main(){int w,h,x,X,Y,I,c,C;i>>w>>h;png::image<png::rgb_pixel>img(w,h);while(i>>X>>Y>>I){G(red)G(green)G(blue)}img.write("a");}

จำเป็นต้องมีการผ่อนปรน C ++ 11 คอมไพเลอร์ (GCC 4.9.2 เป็นเพียงไม่พอใจเล็กน้อย) และPNG ++libpngห้องสมุดที่ตัวเองต้อง ระยะทางแมนฮัตตันใช้ ใช้อินพุตเปิดstdinเอาต์พุตไปยังไฟล์ชื่อ "a" ในไดเร็กทอรีปัจจุบันในรูปแบบ PNG

ตัวอย่าง D:

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


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


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


1
ฉันชอบPCGภาพ :) (แม้ว่าPPCGฉันจะชอบตัวย่อ;))
งานอดิเรกของ Calvin

8

Python 2, 240 232 228 bytes

from PIL.Image import*
def f(S):
 L=map(int,S.split());t=a,b=L[:2];I=new("RGB",t)
 for k in range(a*b):I.load()[k/a,k%a]=tuple(sum(x[2]*x[c]/(abs(x[0]-k/a)-~abs(x[1]-k%a))for x in zip(*[iter(L[2:])]*6))for c in(3,4,5))
 I.show()

ใช้ระยะทางแมนฮัตตัน นี่อาจจะสั้นกว่าใน Python 3 แต่ฉันเพิ่งทำแพ็คเกจ Python ของฉันเร็ว ๆ นี้และฉันมีปัญหาในการติดตั้งหมอน PPM อาจจะสั้นกว่านี้ แต่ฉันชอบ PIL

เพื่อความสนุกฉันพยายามใช้อัลกอริทึมตามที่อยู่ในพื้นที่สี L * a * b *แทนโดยคิดว่ามันจะให้การผสมสีที่ดีขึ้น (โดยเฉพาะในตัวอย่าง B) น่าเสียดายอัลกอริธึมของ Calvin ทำให้ช่องต่างๆมีค่าสูงสุดซึ่งทำให้ภาพดูน่ากลัวน้อยกว่าที่ฉันคาดไว้เล็กน้อย ...

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


6

Mathematica, 146 ไบต์

Image@Table[Total[#3{##4}/255&@@@{##2}/(1+#~ManhattanDistance~{x,y}&/@({#1,#2}&@@@{##2}))],{y,0,Last@#-1},{x,0,#&@@#-1}]&@@#~ImportString~"Table"&

ฟังก์ชั่นแท้การสตริง หากต้องการรันในระยะเวลาที่เหมาะสมให้แทนที่ด้วย1in ; กองกำลังนี้การคำนวณตัวเลขแทนสัญลักษณ์1+#~ManhattanDistance...1.

Ungolfed:

Image[
    Table[
        Total[
        (#3 * {##4} / 255 & @@@ {##2})
            / (1 + ManhattanDistance[#, {x, y}]& /@ ({#1, #2}& @@@ {##2}) )
        ], {y, 0, Last[#]-1}, {x, 0, First[#]-1}
    ] (* Header is #, data is {##2} *)
]& @@ ImportString[#, "Table"]&

6

Python 2, 287 251 ไบต์

รหัสต้นฉบับเวอร์ชัน golfed ที่ฉันใช้ในการสร้างภาพ อาจจะเป็นสนามกอล์ฟอีกเล็กน้อย (โดยนักกอล์ฟที่ดีกว่าฉัน) มันเป็นฟังก์ชั่นที่ใช้ในสตริงอินพุตแบบเต็ม การประมวลผลภาพทำกับPIL 's โมดูลภาพ ใช้ระยะทางแมนฮัตตัน

from PIL import Image
def S(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1.+abs(I[i]-z%w)+abs(I[i+1]-z/w))for i in r(2,len(I),6)))for j in r(3))
 M.show()

การใช้ระยะทางแบบยุคลิดนานกว่า 5 ไบต์ (256 ไบต์):

from PIL import Image
def O(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1+((I[i]-z%w)**2+(I[i+1]-z/w)**2)**.5)for i in r(2,len(I),6)))for j in r(3))
 M.show()

ต่อไปนี้เป็นชุดทดสอบที่สมบูรณ์ที่ใช้งานตัวอย่าง A ถึง E จากคำถามสำหรับตัวชี้วัดระยะทางทั้งสอง:

from PIL import Image
def S(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1.+abs(I[i]-z%w)+abs(I[i+1]-z/w))for i in r(2,len(I),6)))for j in r(3))
 M.show()

def O(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1+((I[i]-z%w)**2+(I[i+1]-z/w)**2)**.5)for i in r(2,len(I),6)))for j in r(3))
 M.show()

A = """400 150
-10 30 100 255 128 0"""
B = """200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255"""
C = """400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123"""
D = """400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123"""
E = """100 1"""
for i in (A, B, C, D, E):
    S(i) #S for Star
    O(i) #O for Orb

พวกเขาทั้งหมดแยกไม่ออก วัตถุที่ใหญ่กว่าอาจใช้เวลาสองสามวินาทีในการทำงาน


ผมเชื่อว่าคุณสามารถบันทึกพวงของไบต์โดยการเปลี่ยนโดยการเปลี่ยนมันfor x in r(I[0]):...for y in r(I[1]): for x in r(I[0]*I[1]):แล้วคุณสามารถใช้ทุกระดับภายในเยื้องลงโดยที่ 1 และแทนที่xด้วยx/I[1]และมีy y%I[1]
Kade

คุณสามารถประหยัดได้ 5 ไบต์โดยเปลี่ยนfrom PIL import Imageเป็นfrom PIL import*
sagiksp

6

C, 247 ไบต์

จะไม่ชนะ แต่ฉันชอบเล่นกอล์ฟใน C. ไม่มีไลบรารีรูปภาพภายนอกที่ใช้แสดงผลเป็น stdout ในรูปแบบ PPM ใช้อินพุตบน stdin ใช้ระยะทางของแมนฮัตตันเพื่อตีกอล์ฟ

j,w,h,k,*b,t[6];main(){scanf("%d %d",&w,&h);b=calloc(w*h,24);for(;~scanf("%d",t+j++%6);)for(k=0;j%6?0:k<3*w*h;k++)b[k]=fmin(b[k]+t[2]*t[3+k%3]/(abs(k/3%w-*t)+abs(k/3/w-t[1])+1),255);printf("P6\n%d %d\n255\n",w,h);for(k=0;k<3*w*h;putchar(b[k++]));}

นี่คือตัวแปรระยะทางแบบยุคลิด (257 ไบต์):

j,w,h,k,*b,t[6];main(){scanf("%d %d",&w,&h);b=calloc(w*h,24);for(;~scanf("%d",t+j++%6);)for(k=0;j%6?0:k<3*w*h;k++)b[k]=fmin(b[k]+t[2]*t[3+k%3]/(sqrt(pow(k/3%w-*t,2)+pow(k/3/w-t[1],2))+1),255);printf("P6\n%d %d\n255\n",w,h);for(k=0;k<3*w*h;putchar(b[k++]));}

6

CJam, 86 ไบต์

q~]"P3 "\_2>:T;2<_S*" 255 "@:,~\m*{(+0a3*T6/{_2<3$.-:z~+)d\2>(f*\f/.+}/:i255fe<\;S*S}/

แม้ว่านี่อาจดูยาวสำหรับภาษากอล์ฟ แต่ฉันเชื่อว่าวิธีแก้ปัญหาที่โพสต์ไปนั้นเป็นระยะเวลาสั้นที่สุดที่ไม่ได้ใช้ฟังก์ชั่นเอาต์พุตภาพ สิ่งนี้สร้างไฟล์ PPM ในรูปแบบ ASCII ภาพด้านล่างถูกแปลงจาก PPM เป็น PNG โดยใช้ GIMP

ฉันไม่แนะนำให้เรียกใช้รหัสในล่าม CJam ออนไลน์ อย่างน้อยก็ไม่ใช่สำหรับภาพขนาดเต็ม เบราว์เซอร์ของฉันถูกล็อคส่วนใหญ่เป็นเพราะการใช้หน่วยความจำ มันเสร็จสิ้นภาพ 400x400 ในช่วงที่สองกับรุ่นออฟไลน์

ตัวอย่างค

คำอธิบาย:

q~      Read and parse input.
]       Wrap it in an array.
"P3 "   Output start of PPM header.
\       Swap input to top.
_2>     Slice off first two values, leaving the star descriptors.
:T;     Store star descriptors in variable T.
2<      Get first two values in input, which is the image size.
_S*     Leave a copy of the size in the output for the PPM header.
" 255 " Rest of PPM header, range of color values.
@       Pop sizes to top.
:,      Expand sizes to ranges.
~       Unwrap size ranges into separate stack elements.
\       Swap ranges, since we need x-range second for Cartesian product.
m*      Generate all coordinate pairs with Cartesian product.
{       Loop over pixel coordinate pairs.
  (+      Swap values in coordinate pair to get x-coordinate first again.
  0a3*    Generate [0 0 0] array. Will be used to sum up colors from stars.
  T       Get list of stars.
  6/      Split into sub-lists with 6 values for each star.
  {       Loop over the stars.
    _2<     Get the first two values (position) of the star.
    3$      Pull current pixel coordinates to top of stack.
    .-      Subtract pixel coordinates from star position.
    :z      Absolute value of difference.
    ~+      Unpack differences and add them to get Manhattan distance.
    )d      Add 1 and convert to double to get denominator of formula.
    \       Swap star values to top.
    2>      Slice off first two values, leaving intensity and color.
    (       Pop off intensity.
    f*      Multiply it with color values.
    \       Swap denominator to top.
    f/      Perform division of color components by denominator.
    .+      Add it to sum of colors.
  }/      End loop over stars.
  :i      Convert double values for colors to integer.
  255fe<  Cap color components at 255.
  \;      Swap pixel coordinate to top and pop it.
  S*S     Join color components with space, and add another space.
}/      End loop over coordinate pairs.

5

C # 718 ไบต์

ฉันรู้ว่า c # แย่มากสำหรับการเล่นกอล์ฟ แต่นี่คือความพยายามของฉันที่ 718 ไบต์

namespace System{using Collections.Generic;using Drawing;using Linq;using O=Convert;class P{int j,i;List<S> s=new List<S>();Image G(string t){var l=t.Replace("\r","").Split('\n');var w=O.ToInt32(l[0].Split(' ')[0]);var h=O.ToInt32(l[0].Split(' ')[1]);for(i=1;i < l.Length;i++){var p=l[i].Split(' ');s.Add(new S{X=O.ToInt32(p[0]),Y=O.ToInt32(p[1]),I=O.ToSingle(p[2]),R=O.ToByte(p[3]),G=O.ToByte(p[4]),B=O.ToByte(p[5])});}var b=new Bitmap(w,h);for(j=0;j<h;j++)for(i=0;i<w;i++)b.SetPixel(i,j,C());return b;}Color C(){return Color.FromArgb(X(x=>x.R),X(x=>x.G),X(x=>x.B));}int X(Func<S,float>f){return(int)Math.Min(s.Sum(x=>x.I*f(x)/(Math.Sqrt((x.X-i)*(x.X-i)+(x.Y-j)*(x.Y-j))+1)),255);}class S{public float X,Y,R,G,B,I;}}}

หากใครมีข้อเสนอแนะใด ๆ ที่จะทำให้สั้นลงโปรดแจ้งให้เราทราบ


คุณพลาด Color.FromArgb เกิน (int, int, int) จะประหยัด 4 ไบต์ ...
เมลวิน

นอกจากนี้คุณควรใช้. Length แทน .Count () หนึ่งไบต์น้อยและมีประสิทธิภาพมากขึ้น และโดยวิธีการที่คุณสามารถบันทึกได้มากขึ้นไบต์โดยใช้สมาชิกใหม่ฉกรรจ์ของ C # 6 ถ้าคุณยินดีที่จะ
Melvyn

จุดดีทั้งความยาวและการโอเวอร์โหลดปรับตอนนี้ และมองหาสมาชิกที่มีร่างกายที่แสดงออก ไม่เคยเห็นมาก่อน ขอบคุณ
อัลลันฮาร์เปอร์

4

Python ขนาด 259 ไบต์

ในที่สุดก็เสร็จ! รหัสกอล์ฟครั้งแรกที่ฉันได้ลองตัดสินใจใช้ Python และไปกับระยะทางแมนฮัตตัน ตะโกนไปที่ Maltysen เพื่อช่วยฉันด้วยผู้วนซ้ำลดขนาดโดยรวมเกือบครึ่งแล้ว!

from PIL.Image import new
N,*s=[list(map(int,i.split()))for i in iter(input,'')]
q,m=new("RGB",(N[0],N[1])),[]
[m.append(tuple(sum(k[2]*k[i]//(abs(k[1]-x)+abs(k[0]-y)+1)for k in s)for i in(3,4,5)))for x in range(N[1])for y in range(N[0])]
q.show(q.putdata(m))

ฉันรู้ว่าต้องมีวิธีหนึ่งในการคำนวณทั้งหมดสำหรับพวกเขา แต่ฉันไม่รู้จัก Python อย่างแท้จริง
Nicolás Siplis

ขอให้เรายังคงอภิปรายนี้ในการแชท
Maltysen

ของคุณยังทำงานไม่ถูกต้องเปลี่ยนk[0]และk[1]ในการคำนวณ
Maltysen

ใช้เวลาประมาณ 10 นาทีในการรู้ว่าทำไมมันถึงทำงานบนเครื่องของฉันกลับกลายเป็นว่าฉันกลับหัวกลับหาง แต่ลืมเปลี่ยนที่นี่
Nicolás Siplis

2

CJam, 70 ไบต์

"P3"l_~\:W*255\,[q~]6Te]6/f{\[Wmd\]f{.-Z/~\)\~mh)/f*}:.+{i255e<}/}~]S*

ระยะทางแบบยุคลิด, เอาต์พุต ASCII PPM ลองออนไลน์

เป็นไปได้ที่จะบีบเพิ่มอีกไม่กี่ไบต์ แต่ฉันไม่ต้องการใช้เวลามากเกินไป

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