星の色


90

最初の行の形式が文字列またはテキストファイルであるプログラムを作成する

width height

後続の各行の形式は

x y intensity red green blue

どこ:

  • widthまた、height任意の正の整数を指定できます。
  • xまた、y任意の整数を指定できます。
  • intensity 負でない整数を指定できます。
  • redgreen、およびblue0から255までの任意の整数であります。

あなたのプログラムを出力しなければならないトゥルーカラー寸法は任意の一般的なロスレス画像ファイル形式の画像widthによりますheight。各線x y intensity red green blueは、画像上に描画する必要があるカラフルな星または球を表します。0を含む、描画する星の数はいくつでもかまいません。文字列またはファイルの末尾に改行があると仮定できます。

画像を描画するアルゴリズムは次のとおりですが、結果が同じである限り、好きな方法で実装できます。

画像のすべてのピクセル(XY)(Xは左端が0 、右端がwidth-1Yは上端が0 、下端がheight-1)に対して、カラーチャネルC ϵ { redgreenblue }(0から255の間に固定された値)は、次の方程式で与えられます。

カラーチャンネル方程式

どこのdist関数はどちらかであるユークリッド距離

ユークリッド距離方程式

またはマンハッタン距離

マンハッタン距離方程式

ゴルフ可能性または美観に基づいて、好みの距離関数を選択します。

入力の最初の行以外の各行は、スターセットの要素です。だから、例えば、SのXが表すx入力ラインのいずれかに値を、及びS Cは、いずれかを表しredgreenまたはblue、これに応じて、カラーチャネルは、現在計算されています。

例A

入力が

400 150
-10 30 100 255 128 0

出力は

例A、ユークリッド

ユークリッド距離を使用している場合

例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

ユークリッド距離とマンハッタン距離のそれぞれの出力は

例B、ユークリッドおよび例B、マンハッタン

例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

出力は

例C、ユークリッド

ユークリッド距離を使用している場合

例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、ユークリッド

ユークリッド距離を使用している場合

例D、マンハッタン

マンハッタン距離を使用している場合。

例E

入力が

100 1

出力は、幅100ピクセル、高さ1ピクセルの完全に黒のイメージになります。

ノート

  • 入力文字列またはそれを含むテキストファイルの名前をstdinまたはコマンドラインから取得するか、文字列を取得する関数を記述できます。
  • 画像の「出力」とは、次のいずれかを意味します。
    • 選択した名前のファイルに保存します。
    • 生の画像ファイルのデータを標準出力に印刷します。
    • そのような場合と同様に画像表示するPILのをimage.show()
  • 私はあなたの画像が完璧なピクセルであることをチェックしません(Stack Exchangeはとにかく画像を損失的に圧縮します)。
  • グラフィック/画像ライブラリを使用できます。

勝ち

バイト単位の最短提出が勝ちです。同点の場合、最も早い提出が優先されます。

楽しいボーナス:本当に素晴らしい出力画像の入力を提供します。


38
+1うわー。これは素晴らしいです。(そして、私たちが健康なニューホライズンズ宇宙船からの言葉を聞くので、投稿する適切な時間です!)
BrainSteel

入力はそのスペースで区切られた形式にする必要がありますか、それともコンマで区切ることができますか?とにかく、+ 1。
マルティセン

1
@Maltysenスペース区切り。(私はそれがケチだと知っていますが、ダースの入力バリアントを許可するよりも簡単です。)
カルビンの趣味

4
オーブや星がもっと美しいかどうかはわかりません。
trichoplax

ピクセルの完璧さのために、ビットマップのハッシュを比較することができます
トバイアスKienzler

回答:


26

パイス-46バイト

これは楽しかった!私はついにPythの画像I / O機能を使用するようになりました。マンハッタンはほんの短い変化ですが、ゴルフ性のためにユークリッド距離を行います。

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

これは、数式ですべてのピクセルをループしますが、ピクセルループを1つのループに凝縮しdivmod、Pythは3つのネストされたマップのみをサポートし、計算には2つ(RGBに1つ、星に1つ)を使用するため、使用します。

画像をとして保存しo.pngます。かなり遅く、最初の2回のテストは2分未満で完了しますが、残りの2回は30分程度かかります。

.w誰も使用していないので誰も気付かないというバグがあります;)しかし、プルリクエストを入力するので、フォークを使用して、すぐにマージされないかどうかをテストします。合併!

出力例

例A

例A

例B

例B

例C

例C

例D

例D


7
うわー、Pythがそれができるとは知らなかった。ある日、Pythでビジネスソフトウェアを書くことになります。書くコードが少ないので、リファクタリングがより速く、より簡単になるはずです。:D
クリスチャンルパスク

7
@ w0lf「実行時間よりもプログラマー時間が重要」とPythがプログラマーの時間を短縮するのに役立つことは誰もが知っています:) Pythがグラフィカルな出力チャレンジから除外された後、画像I / Oが最近追加されました。Pillowを内部で使用します。
マルティセン

11
@Nit絶対に。また、書き込みの速さとは関係ありません。以前のコメントは冗談でした。
クリスチャンルパスク

2
皆さんは1つの重要なことを忘れていました-コードが少ないのでデバッグも簡単です;)
オプティマイザー

14
プログラマーの時間を短縮するということは、「彼らはコードゴルフを熱心にプレイしているので、「本物の」コードを書く時間が少なくなる」ということですか?

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キャンバス実装です。文字列引数(末尾のスペース/改行なし)を取り、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でハローがどのように接着されているかが大好きです。マンハタンスタイルを追加できますか?
PTwr

1
@PTwrもちろん、jsfiddle.net / pjLnazw1
Cristian Lupascu

驚くばかり!(あと7つ...
うーん

@ w0lf xおよびy反復子を組み合わせることにより、関数からいくつかのバイトを削ることができます。 jsfiddle
ウルフハンマー

@wolfhammerうわー、それは今「ほんの数バイト」に過ぎません、それは多くの改善です。インデックス作成について修正する必要があると思われるので、後で見ていきます(サンプル画像2、3、4の場合、左のピクセルが折り返されているように見えます)。ありがとう!
クリスチャンルパスク

26

Java-627バイト

Javaは確かに最高のゴルフ言語の1つです:)

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 255140 0
68 25 4 0191255
92 25 2 255 0 0
269 25 10245222179
475 25 7245245220
942 25 6 0 250150
1464 25 6 0 0 255
1920 25 1 255 245 238

uto王星を備えたソーラーシステム

素晴らしく見えないフルHD画像 ...誰かがそれを改善できたら幸いです!


15
ソーラーシステムの場合は+1。-1 leaving王星を離れる(今ではその実際の色とサイズさえわかっている)
オプティマイザー

1
また、完全な1080pの壁紙がリンクされていると本当にいいです:)
オプティマイザー

@Optimizer私はpl王星を追加しました;)私が壁紙についてできることを見てみましょう
CommonGuy

1
@ Sp3000 Ups、pl王星を追加したときの強度を忘れてしまった
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
デルタブ

...と別のものo=o.png
デルタブ

16

Python 3、189バイト

私はゴルファーの専門家という考えはありませんが、ここに行きます。

  • 入力から来ているstdinとに行くstdoutPPM形式
  • 次のように実行します。 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)))

の代わりに整数除算を使用することで4バイトを節約できましたがint()、実際には元の画像のように見えます-厳密には正しくない星の輝きの暗い縞模様の縞模様をわずかに見つけることができますコード。ただし、現状では、このコードは説明ではなく画像に続きます。

未ゴルフバージョンと、他の人が指摘した、または私がつまずいたという多くの最適化の前の私のオリジナルのゴルフは、この要点にあります。

編集:移動して単一の(または)関数に7バイトを保存for xfor yましたが、これにより非常に長い行のPNMファイルが生成され、問題が発生する場合と発生しない場合があります。printo

編集2: Maltysenはさらに20バイト節約しました。ありがとう!

もう一度編集:唯一のが存在するようprintになったため、oエイリアスは節約ではなく負債になります。さらに4バイトオフ。

さらに編集: Sp3000により、さらに 2バイト節約できました。一方、エイリアシングmapmそう可読性の利益のために、何を保存していなかった(!)私は再びそれを拡大してきました。これで、2 バイトの丸い2 8バイトになりました。

最後の編集(?):ユークリッド距離のサポートがあり、複素数を乱用することで、まったく同じバイト数でそれを行いました!

編集、ハリウッドの再起動: Sp3000の次の提案は5バイトをノックアウトしました。

EDIT、愚かな名前の続編: 6バイトが削除されました。MaltysenがSp3000がそれを繰り返すまで把握しなかったという提案のおかげで... さらに 8バイトが%悪用されました。そして、チャットでそれを話すことは驚異的でした2126バイト。私は謙虚です。


@Maltysen:まったくその通りです。20バイト節約!
ティムペデリック

さらにいくつか:EOFsを持つ複雑なsys.stdinの代わりに、iter()センチネル値で使用できるdocs.python.org/2/library/functions.html#iter as iter(raw_input,'')w,h,S同様に拡張アンパックで同じ行に配置します。
マルティセン

@Maltysen:それがうまくいくかどうかわかりません。私はすでにそれをほぼ正確にやっていたが、入力ファイルに空白行がなく、チャレンジで追加できるかどうかわからないので、ヒットしましたEOFError(したがって、tryブロックが必要でした)。それとも何か不足していますか?
ティムペデリック

センチネルの価値があれば、ファイルを入力するのではなく、空行で終了することができると思いますが、ファイルの動作は機能しません。
マルティセン

@ Sp3000:驚いたことに、はい!私はそれがstdinイテレータではないと文句を言うことを期待していました。
ティムペデリック

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、私の好みの略語です;))
カルビンの趣味

8

パイソン2、240の 232 228バイト

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パッケージを台無しにしたため、Pillowの再インストールに問題があります。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.;に置き換えます。これにより、記号ではなく数値計算が強制されます。

ゴルフをしていない:

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バイト

画像の生成に使用した元のコードのゴルフバージョン。おそらくもう少しゴルフをすることができます(私よりも良いゴルファーによって)。これは、完全な入力文字列を受け取る関数です。PILImage Moduleで実行される画像処理。マンハッタン距離を使用します。

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でダウン内のすべてのインデントレベルを取る、と置き換えることができるxx/I[1]してyy%I[1]
ケード

に置き換えるfrom PIL import Imageことで5バイト節約できますfrom PIL import*
-sagiksp

6

C、247バイト

勝つつもりはありませんが、Cでゴルフをするのが好きです。外部の画像ライブラリは使用せず、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}/

これは、ゴルフの言語には少し長く見えるかもしれませんが、これまでに投稿されたソリューションの中で、画像出力機能を使用しない最短のものだと思います。これにより、ASCII形式のPPMファイルが生成されます。以下の画像は、GIMPを使用してPPMからPNGに変換されました。

オンラインCJamインタープリターでコードを実行することはお勧めしません。少なくともフルサイズの画像ではありません。ブラウザがロックしたのは、おそらくメモリ使用量が原因です。オフラインバージョンで2番目の範囲の400x400の画像を完成させます。

例C

説明:

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バイトを節約します
...-メルビン

また、.Count()の代わりに.Lengthを使用する必要があります。1バイト少なく、より効率的です。ちなみに、喜んでC#6の新しい式を使用したメンバーを使用すると、さらに多くのバイトを節約できます。
メルビン

長さとオーバーロードの両方で良い点、今調整します。そして、表現力のあるメンバーを調べます。それらを見たことがありません。ありがとう
アランハーパー

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))

それらのすべてに対して1つの計算を行う方法がなければならないことは知っていますが、正直なところPythonについてはよく知りません。
ニコラスシプリス


あなたのものはまだ適切に動作しません。計算を切り替える必要がk[0]ありk[1]ます。
マルティセン

私のマシンでなぜ機能していたのかを理解するために10分ほどかかりました。
ニコラスシプリス

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.