As cores em nossas estrelas


90

Escreva um programa que utilize uma string ou arquivo de texto cuja primeira linha tenha a forma

width height

e cada linha subseqüente tem a forma

x y intensity red green blue

Onde:

  • widthe heightpode ser qualquer número inteiro positivo.
  • xe ypode ser qualquer número inteiro.
  • intensity pode ser qualquer número inteiro não negativo.
  • red,, greene bluepodem ser quaisquer números inteiros de 0 a 255, inclusive.

Seu programa deve produzir uma imagem TrueColor em qualquer formato de arquivo de imagem sem perdas comum cujas dimensões sejam widthde height. Cada x y intensity red green bluelinha representa uma estrela ou esfera colorida que deve ser desenhada na imagem. Pode haver qualquer número de estrelas para desenhar, incluindo 0. Você pode assumir que a sequência ou o arquivo tem uma nova linha à direita.

O algoritmo para desenhar a imagem é o seguinte, embora você possa implementá-lo da maneira que desejar, desde que o resultado seja idêntico:

Para cada pixel ( X , Y ) na imagem (onde X é 0 na borda esquerda e largura-1 na borda direita e Y é 0 na borda superior e altura 1 na borda inferior), o canal de cores C ϵ { vermelho , verde , azul } (um valor fixado entre 0 e 255) é dado pela equação:

equação do canal de cores

Onde a função dist é a distância euclidiana :

Equação da distância euclidiana

Ou distância de Manhattan :

Equação da distância de Manhattan

Escolha a função de distância que você preferir, com base na capacidade de golfe ou na estética.

Cada uma das linhas na entrada além da primeira é um elemento do conjunto de Estrelas . Assim, por exemplo, S x representa o xvalor de uma das linhas de entrada, S e C representa ou red, greenou blue, dependendo do que está a ser calculada canal de cor.

Exemplos

Exemplo A

Se a entrada for

400 150
-10 30 100 255 128 0

a saída deve ser

Exemplo A, Euclidiano

se você estiver usando a distância euclidiana e

Exemplo A, Manhattan

se você estiver usando a distância de Manhattan.

Exemplo B

Se a entrada for

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

as respectivas saídas para distância Euclidiana e Manhattan devem ser

Exemplo B, Euclidianoe Exemplo B, Manhattan.

Exemplo C

Se a entrada for

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

a saída deve ser

Exemplo C, Euclidiano

se você estiver usando a distância euclidiana e

Exemplo C, Manhattan

se você estiver usando a distância de Manhattan.

Exemplo D

Se a entrada for

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

a saída deve ser

Exemplo D, Euclidiano

se você estiver usando a distância euclidiana e

Exemplo D, Manhattan

se você estiver usando a distância de Manhattan.

Exemplo E

Se a entrada for

100 1

a saída deve ter uma imagem de 100 pixels de largura por 1 pixel de altura, completamente preta.

Notas

  • Pegue a string de entrada ou o nome de um arquivo de texto que o contenha a partir de stdin ou da linha de comando, ou você pode escrever uma função que aceita uma string.
  • "Saída" da imagem significa:
    • Salvando-o em um arquivo com o nome de sua escolha.
    • Imprimir os dados brutos do arquivo de imagem em stdout.
    • Exibindo a imagem, como com PIL 's image.show().
  • Não vou verificar se as suas imagens são perfeitas em pixels (o Stack Exchange, com perdas, comprime imagens de qualquer maneira), mas ficarei muito desconfiado se conseguir distinguir visualmente alguma diferença.
  • Você pode usar bibliotecas de imagens / gráficos.

Ganhando

O menor envio em bytes vence. Em caso de empate, a primeira apresentação vence.

Bônus de diversão: dê a entrada para uma imagem de saída verdadeiramente espetacular.


38
+1 Uau. Isso é lindo. (E um momento apropriado para postar, como ouvimos a palavra de uma nave espacial New Horizons saudável!)
BrainSteel

A entrada precisa estar nesse formato separado por espaço ou pode ser separada por vírgula? De qualquer forma, +1.
Maltysen 15/07/2015

1
@ Maltysen Espaço separado. (Eu sei que é mesquinho, mas é mais fácil do que permitir que um variantes dúzia de entrada.)
de Calvino Hobbies

4
Não consigo decidir se os orbes ou estrelas são mais bonitos.
21815 Trichoplax

Para pixel perfeição você pode comparar de hash do bitmap
Tobias KIENZLER

Respostas:


26

Pitão - 46 bytes

Isso foi divertido! Finalmente, usei os recursos de E / S da imagem do Pyth. Faz distância euclidiana por causa da golfiness, embora manhattan seja apenas uma pequena mudança.

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

Isso apenas percorre todos os pixels com a fórmula, apesar de condensar o loop de pixels em um loop e ser usado, divmodjá que Pyth suporta apenas 3 mapas aninhados e os cálculos levam dois (um para RGB e outro para as estrelas).

Salva a imagem como o.png. Muito devagar, faz os dois primeiros testes em menos de 2 minutos, mas os outros 2 duram cerca de meia hora.

Há um bug no .wqual ninguém notou porque ninguém o usa;), mas eu fiz uma solicitação pull, então use meu fork para testar se não será mesclado em breve. Mesclado!

Exemplos de saídas

Exemplo A

Exemplo A

Exemplo B

Exemplo B

Exemplo C

Exemplo C

Exemplo D

Exemplo D


7
Uau, não sabia que Pyth poderia fazer isso. Um dia, podemos acabar escrevendo software comercial em Pyth. É menos código para escrever, portanto deve ser mais rápido e fácil refatorar. : D
Cristian Lupascu

7
@ w0lf "o tempo do programador é mais importante que o tempo de execução" e todos sabemos que o Pyth ajuda a reduzir o tempo do programador :) A imagem de E / S foi adicionada recentemente depois que o Pyth foi excluído de um desafio de saída gráfica. Ele usa travesseiro internamente.
Maltysen

11
@Nit Absolutamente. Também não tem nada a ver com a rapidez com que é escrever. Meu comentário anterior foi uma piada.
Cristian Lupascu

2
Vocês se esqueceram de uma coisa importante - mais fácil a sua para depurar também, uma vez que o código é menos;)
Optimizer

14
Ao reduzir o tempo do programador, você quer dizer "Eles estão jogando golfe com pyth e, portanto, têm menos tempo para escrever código 'real'"?

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

Edit: reduziu muito o código aplicando as sugestões impressionantes de wolfhammer .

Teste

Nota: Aguarde alguns segundos para que o trecho abaixo seja renderizado (leva aproximadamente 4 segundos na minha máquina).

Você também pode executá-lo no JSFiddle .

Bônus: Eclipse Azul

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

Você também pode executá-lo no JSFiddle .

Descrição

Esta é uma implementação simples da tela JavaScript + HTML5: uma função que utiliza um argumento de string (sem espaços à esquerda / novas linhas) e exibe a saída no DOM. Ele usa distância euclidiana.

Aqui está o código legível:

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

Eu amo como os halos colados no Blue Eclipse, você pode adicionar um estilo manhatan?
PTwr

1
@PTwr Claro, aqui está: jsfiddle.net/pjLnazw1 #
Cristian Lupascu

Impressionante! (7 mais para ir ... ugh) #
11787 PTwr

@ w0lf Pode eliminar alguns bytes da sua função combinando os iteradores xey. jsfiddle
wolfhammer

@ Wolfhammer Uau, agora isso é apenas "alguns bytes", é muita melhoria. Vou dar uma olhada nisso mais tarde, pois acredito que há algo a ser corrigido na indexação (para imagens de exemplo 2, 3 e 4, os pixels à esquerda parecem contornar). Obrigado!
Cristian Lupascu

26

Java - 627 bytes

Java é realmente uma das melhores linguagens de golfe :)

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

Usando a entrada abaixo, você pode criar um modelo um tanto realista do nosso sistema solar (o tamanho de alguns planetas está errado, mas a distância entre eles deve ser precisa). Eu tentei dar anéis para Saturno, mas não funcionou ... Source

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

Sistema solar com plutão

Imagem Full HD , que não parece ótima ... Ficaria feliz se alguém pudesse melhorá-la!


15
+1 para o sistema solar. -1 para deixar Plutão (agora que nós sequer sabe a sua verdadeira cor e tamanho)
Optimizer

1
Além disso, seria muito bom se um papel de parede 1080p está ligada :)
Optimizer

@Optimizer eu adicionei Plutão;) Vamos ver o que posso fazer sobre o papel de parede
CommonGuy

1
@ Sp3000 Ups, esqueci a intensidade quando adicionei plutão
CommonGuy

2
Note que Saturno não é o único planeta com anéis. Se você conseguir que os anéis funcionem, você deve adicioná-los também a Urano.
mbomb007

20

Bash, 147 145 bytes

ImageMagick é usado para manipular imagens. A distância euclidiana é usada.

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

Você pode salvar um byte com $w\x$h.
Deltab

... e outro com o=o.png.
Deltab

16

Python 3, 189 bytes

Eu não sou a idéia de ninguém como um jogador experiente, mas aqui vai.

  • A entrada vem stdine vai para stdoutno formato PPM .
  • Execute-o assim: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Primeiro, Manhattan distância:

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

E segundo, a distância euclidiana:

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

Eu poderia salvar quatro bytes usando divisão inteira em vez de int(), e na verdade isso parece ser o que as imagens originais fazem - você mal consegue distinguir algumas estrias nas bordas escuras do brilho da estrela que não estão estritamente corretas código. No entanto, este código segue a descrição, não as imagens.

A versão ungolfed, e meu golfe original antes das muitas otimizações que outros apontaram ou que eu tropecei em mim mesmo, estão nesta essência .

EDIT: salvei 7 bytes movendo for x-me for ypara uma única função print(ou o), mas isso produz um arquivo PNM com uma linha muito longa, o que pode ou não causar alguns problemas.

EDIT 2: Maltysen me salvou outros 20 bytes. Obrigado!

EDITAR novamente: agora que existe apenas um print, o oalias é um passivo, não uma economia. Mais 4 bytes de desconto.

Edite um pouco mais: o Sp3000 me salvou mais 2 bytes. Enquanto isso, aliasing mappara mnão salvar nada, por isso, no interesse da legibilidade (!), Expandi-lo novamente. Agora é uma boa rodada 2 8 bytes.

EDITAR o último (?): Agora, com suporte à distância euclidiana - e abusando de números complexos, fiz exatamente no mesmo número de bytes!

EDIT, a reinicialização de Hollywood: a próxima sugestão do Sp3000 bateu 5 bytes.

EDIT, a sequência estupidamente nomeada: 6 bytes cortados, graças a uma sugestão que Maltysen fez que eu não entendi até o Sp3000 repeti-lo ... depois outros 8 bytes de %abuso. E falar no bate-papo derrubou um fenomenal2126 bytes. Estou humilhado.


@ Maltysen: Muito bem. 20 bytes salvos!
Tim Pederick

um pouco mais: em vez das coisas complicadas do sys.stdin com EOFs, você pode usar os iter()valores sentinel: docs.python.org/2/library/functions.html#iter as iter(raw_input,''), também colocar w,h,Sna mesma linha com a descompactação estendida.
Maltysen

@ Maltysen: Não tenho certeza se isso funcionaria. Eu já estava fazendo quase exatamente isso, mas ele acerta EOFError(e, portanto, eu precisava de um trybloco), porque não há linha em branco no arquivo de entrada e não tenho certeza se o desafio me permite adicionar uma. Ou eu estou esquecendo de alguma coisa?
Tim Pederick

Eu acho que se você é o valor do sentinela, você pode terminar com uma linha em branco versus inserir o arquivo, mas sim, o arquivo não funcionaria.
Maltysen

@ Sp3000: Surpreendentemente, sim! Eu esperava reclamar que stdinnão era um iterador.
Tim Pederick

10

C ++, 272 bytes

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

Precisa de um compilador C ++ 11 brando (o GCC 4.9.2 é apenas um pouco insatisfeito) e a biblioteca png ++ , que ela mesma exige libpng. Distância de Manhattan usada. Ativa a entrada stdine gera um arquivo chamado "a" no diretório atual no formato PNG.

Exemplo D:

insira a descrição da imagem aqui


insira a descrição da imagem aqui


insira a descrição da imagem aqui


1
Eu gosto da PCGimagem :) (Embora PPCGé minha abreviatura preferido;))
de Calvino Hobbies

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

Usa a distância de Manhattan. Provavelmente isso seria ainda mais curto no Python 3, mas estraguei meus pacotes Python recentemente e estou tendo problemas para reinstalar o Pillow. O PPM provavelmente seria ainda mais curto, mas eu gosto do PIL.

Por diversão, tentei aplicar o algoritmo como está no espaço de cores L * a * b * , pensando que daria uma melhor mistura de cores (especialmente no exemplo B). Infelizmente, o algoritmo de Calvin permite que os canais ultrapassem seus valores máximos, o que torna as imagens um pouco menos impressionantes do que eu esperava ...

insira a descrição da imagem aqui


6

Mathematica, 146 bytes

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

Uma função pura usando uma string. Para executá-lo em um período de tempo razoável, substitua o 1in 1+#~ManhattanDistance...por a 1.; isso força a computação numérica em vez de simbólica.

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 bytes

Uma versão em golf do código original que usei para gerar as imagens. Provavelmente poderia ser jogado um pouco mais (por um jogador melhor do que eu). É uma função que recebe a string de entrada completa. Processamento de imagem realizado com o Módulo de Imagem da PIL . Usa a distância de Manhattan.

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

O uso da distância euclidiana é de 5 bytes a mais (256 bytes):

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

Aqui está um conjunto de testes completo que executa os exemplos A a E da pergunta, para as duas métricas de distância:

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

Todos eles parecem indistinguíveis. Os maiores podem levar alguns segundos para serem executados.


Eu acredito que você pode salvar um monte de bytes for x in r(I[0]):...for y in r(I[1]):, alterando-o para for x in r(I[0]*I[1]):. Você pode reduzir cada nível de recuo dentro de 1 por 1 e substituir xpor x/I[1]e ycom y%I[1].
Kade

Você pode salvar 5 bytes substituindo-o from PIL import Imageporfrom PIL import*
sagiksp 31/03

6

C, 247 bytes

Não vou ganhar, mas eu gosto de jogar golfe em C. Nenhuma biblioteca de imagens externa usada, gera stdout no formato PPM. Recebe entrada em stdin. Usa a distância de Manhattan para jogar golfe.

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++]));}

Aqui está a variante de distância euclidiana (257 bytes):

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 bytes

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

Embora isso pareça meio demorado para um idioma de golfe, acredito que, das soluções postadas até agora, é a mais curta que não usa a funcionalidade de saída de imagem. Isso produz um arquivo PPM no formato ASCII. A imagem abaixo foi convertida de PPM para PNG usando o GIMP.

Não recomendo executar o código no interpretador CJam online. Pelo menos não para as imagens em tamanho real. Meu navegador travou, provavelmente por causa do uso de memória. Ele completa as imagens de 400x400 no segundo intervalo com a versão offline.

Exemplo C

Explicação:

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

Bytes em C # 718

Sei que c # é terrível para o golfe, mas aqui está a minha tentativa de 718 bytes

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

Se alguém tiver alguma sugestão para encurtá-lo, entre em contato.


Você perdeu a sobrecarga Color.FromArgb (int, int, int). Iria salvar 4 bytes ...
Melvyn

Além disso, você provavelmente deve estar usando .Length em vez de .Count (). um byte a menos e mais eficiente. E, a propósito, você pode economizar muito mais bytes usando os novos membros do C # 6, caso deseje.
Melvyn

Bons pontos no comprimento e na sobrecarga, ajustando agora. E olhando para os membros com expressão corporal. Não vi isso antes. Obrigado
Allan Harper

4

Python, 259 bytes

Finalmente pronto! Primeiro código de golfe que experimentei, decidi usar Python e segui a distância de Manhattan. Shoutout to Maltysen por me ajudar com os iteradores, reduziu o tamanho total para quase a metade!

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

Sei que deve haver uma maneira de fazer um cálculo para todos eles, mas honestamente não conheço Python tão bem.
Nicolás Siplis 15/07


Seus de ainda não funcionar corretamente, terá de mudar o k[0]e k[1]nos cálculos.
Maltysen 16/07/2015

Levei 10 minutos para perceber por que estava funcionando na minha máquina. Acontece que eu os inverti, mas esqueci de mudar aqui.
Nicolás Siplis 16/07/2015

2

CJam, 70 bytes

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

Distância euclidiana, saída ASCII PPM. Experimente online

Deve ser possível espremer mais alguns bytes, mas não quero gastar muito tempo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.