Los colores en nuestras estrellas


90

Escriba un programa que tome una cadena o archivo de texto cuya primera línea tenga la forma

width height

y cada línea posterior tiene la forma

x y intensity red green blue

dónde:

  • widthy heightpuede ser cualquier número entero positivo.
  • xy ypuede ser cualquier número entero.
  • intensity puede ser cualquier número entero no negativo.
  • red, greeny bluepueden ser enteros de 0 a 255 inclusive.

Su programa debe generar una imagen en color verdadero en cualquier formato de archivo de imagen sin pérdida común cuyas dimensiones sean widthde height. Cada x y intensity red green bluelínea representa una estrella u orbe colorida que debe dibujarse en la imagen. Puede haber cualquier número de estrellas para dibujar, incluido 0. Puede suponer que la cadena o el archivo tiene una nueva línea final.

El algoritmo para dibujar la imagen es el siguiente, aunque puede implementarlo de la forma que desee siempre que el resultado sea idéntico:

Para cada píxel ( X , Y ) en la imagen (donde X es 0 en el borde izquierdo y ancho-1 en el borde derecho, e Y es 0 en el borde superior y altura-1 en el borde inferior), el canal de color C ϵ { rojo , verde , azul } (un valor fijado entre 0 y 255) viene dado por la ecuación:

ecuación de canal de color

Donde la función dist es la distancia euclidiana :

Ecuación de distancia euclidiana

O la distancia de Manhattan :

Ecuación de distancia de Manhattan

Elija la función de distancia que prefiera, en función de la capacidad de juego o la estética.

Cada una de las líneas en la entrada además de la primera es un elemento del conjunto de estrellas . Así, por ejemplo, S x representa el xvalor en una de las líneas de entrada, y S C representa o bien red, green, o blue, dependiendo de cual se calcula actualmente canal de color.

Ejemplos

Ejemplo A

Si la entrada es

400 150
-10 30 100 255 128 0

la salida debe ser

Ejemplo A, Euclidiana

si está utilizando la distancia euclidiana, y

Ejemplo A, Manhattan

Si estás usando la distancia de Manhattan.

Ejemplo B

Si la entrada es

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

las salidas respectivas para la distancia euclidiana y de Manhattan deben ser

Ejemplo B, euclidianoy Ejemplo B, Manhattan.

Ejemplo C

Si la entrada es

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

la salida debe ser

Ejemplo C, Euclidiana

si está utilizando la distancia euclidiana, y

Ejemplo C, Manhattan

Si estás usando la distancia de Manhattan.

Ejemplo D

Si la entrada es

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

la salida debe ser

Ejemplo D, euclidiano

si está utilizando la distancia euclidiana, y

Ejemplo D, Manhattan

Si estás usando la distancia de Manhattan.

Ejemplo E

Si la entrada es

100 1

entonces la salida debe ser una imagen de 100 píxeles de ancho por 1 píxel de alto que sea completamente negra.

Notas

  • Tome la cadena de entrada o el nombre de un archivo de texto que lo contiene desde stdin o la línea de comando, o puede escribir una función que tome una cadena.
  • "Mostrar" la imagen significa:
    • Guardarlo en un archivo con el nombre de su elección.
    • Imprimir los datos del archivo de imagen en bruto en stdout.
    • Mostrar la imagen, como con PIL 's image.show().
  • No comprobaré que tus imágenes sean perfectas en píxeles (Stack Exchange comprime las imágenes de forma perdida de todos modos), pero sospecharé si puedo ver visualmente alguna diferencia.
  • Puede usar bibliotecas de gráficos / imágenes.

Victorioso

La presentación más corta en bytes gana. En caso de empate, la primera presentación gana.

Bono divertido: dé la entrada para una imagen de salida realmente espectacular.


38
+1 Wow. Esto es hermoso. (¡Y un momento apropiado para publicar, ya que escuchamos noticias de una nave espacial New Horizons saludable!)
BrainSteel

¿La entrada tiene que estar en ese formato separado por espacios, o puede estar separada por comas? De todos modos, +1.
Maltysen

1
@Maltysen Espacio separado. (Sé que es tacaño, pero es más fácil que permitir una docena de variantes de entrada).
Calvin's Hobbies

44
No puedo decidir si los orbes o las estrellas son más hermosos.
trichoplax

Para la perfección de píxeles, puede comparar el hash del mapa de bits
Tobias Kienzler

Respuestas:


26

Pyth - 46 bytes

¡Esto fue divertido! Finalmente pude usar las funciones de E / S de imagen de Pyth. Hace una distancia euclidiana debido al golf, aunque Manhattan es solo un pequeño cambio.

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

Esto solo recorre todos los píxeles con la fórmula, aunque condensa el bucle de píxeles en un bucle y lo usa, divmodya que Pyth solo admite 3 mapas anidados y los cálculos toman dos (uno para RGB y otro para las estrellas).

Guarda la imagen como o.png. Bastante lento, realiza las primeras 2 pruebas en <2 min, pero las otras 2 duran aproximadamente media hora.

Hay un error en el .wque nadie se dio cuenta porque nadie lo usa;) pero puse una solicitud de extracción, así que use mi tenedor para probar si no se fusiona pronto. Fusionado!

Ejemplos de salidas

Ejemplo A

Ejemplo A

Ejemplo B

Ejemplo B

Ejemplo C

Ejemplo C

Ejemplo D

Ejemplo D


77
Wow, no sabía que Pyth podía hacer eso. Algún día podríamos terminar escribiendo software empresarial en Pyth. Es menos código para escribir, por lo que debería ser más rápido y fácil de refactorizar. : D
Cristian Lupascu

77
@ w0lf "el tiempo del programador es más importante que el tiempo de ejecución" y todos sabemos que Pyth ayuda a reducir el tiempo del programador :) La E / S de la imagen se agregó recientemente después de que Pyth quedara fuera de un desafío de salida gráfica. Utiliza Pillow internamente.
Maltysen

11
@Nit Absolutamente. Tampoco tiene nada que ver con lo rápido que es escribir. Mi comentario anterior fue una broma.
Cristian Lupascu

2
Ustedes olvidaron una cosa importante: también es más fácil de depurar, ya que el código es menor;)
Optimizer

14
Al reducir el tiempo del programador, te refieres a "Están jugando código golf con pyth y, por lo tanto, tienen menos tiempo para escribir 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);}

Editar: acorté mucho el código aplicando las increíbles sugerencias de wolfhammer .

Prueba

Nota: Espere unos segundos para que se procese el fragmento de abajo (toma ~ 4 segundos en mi máquina).

También puede ejecutarlo en JSFiddle .

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

También puede ejecutarlo en JSFiddle .

Descripción

Esta es una implementación directa del lienzo JavaScript + HTML5: una función que toma un argumento de cadena (sin espacios finales / líneas nuevas) y muestra la salida en el DOM. Utiliza la distancia euclidiana.

Aquí está el código legible:

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

Me encanta cómo los halos se pegaron en Blue Eclipse, ¿puedes agregar el estilo manhatan?
PTwr

1
@PTwr Claro, aquí está: jsfiddle.net/pjLnazw1
Cristian Lupascu

¡Increíble! (7 más para ir ... ugh)
PTwr

@ w0lf Puede eliminar algunos bytes de su función combinando los iteradores x e y. jsfiddle
wolfhammer

@wolfhammer Wow, eso ahora es solo "algunos bytes", es una gran mejora. Echaré un vistazo a eso más adelante, ya que creo que hay algo que debe arreglarse sobre la indexación (para las imágenes de muestra 2, 3 y 4, los píxeles de la izquierda parecen envolverse). ¡Gracias!
Cristian Lupascu

26

Java - 627 bytes

Java es de hecho uno de los mejores lenguajes de golf :)

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 la entrada a continuación, puede crear un modelo algo realista de nuestro sistema solar (el tamaño de algunos planetas es incorrecto, pero la distancia entre ellos debe ser precisa). Traté de darle anillos a Saturno, pero no funcionó ... Fuente

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 con plutón

Imagen Full HD , que no se ve genial ... ¡Sería feliz si alguien pudiera mejorarla!


15
+1 para el sistema solar. -1 por dejar Plutón (ahora que sabemos su color y tamaño reales)
Optimizer

1
Además, sería realmente agradable si un fondo de pantalla completo de 1080p está vinculado :)
Optimizer

@Optimizer agregué plutón;) Veamos qué puedo hacer con el fondo de pantalla
CommonGuy

1
@ Sp3000 Ups, olvidé la intensidad cuando agregué Plutón
CommonGuy

2
Tenga en cuenta que Saturno no es el único planeta con anillos. Si obtienes anillos para trabajar, también debes agregarlos a Urano.
mbomb007

20

Bash, 147145 bytes

ImageMagick se usa para manipular imágenes. Se usa la distancia euclidiana.

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

Puede guardar un byte con $w\x$h.
deltab

... y otro con o=o.png.
deltab

16

Python 3, 189 bytes

No soy idea de un golfista experto, pero aquí va.

  • La entrada proviene stdiny va a stdouten formato PPM .
  • Ejecútelo así: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Primero, distancia de Manhattan:

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

Y en segundo lugar, la distancia 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)))

Podría ahorrar cuatro bytes usando la división de enteros en lugar de int(), y de hecho eso parece ser lo que hacen las imágenes originales: apenas puede distinguir algunas estrías en las franjas oscuras del resplandor de estrellas que no están presentes en estrictamente correcto código. Sin embargo, tal como está, este código sigue la descripción, no las imágenes.

La versión sin golf, y mi golf original antes de las muchas optimizaciones que otros señalaron o que me topé, están en esta esencia .

EDIT: Me salvó 7 bytes moviendo for xy for yen una sola print(o ofunción), pero esto produce un archivo PNM con una línea muy larga, que puede o no puede causar algunos problemas.

EDIT 2: Maltysen me salvó otros 20 bytes. ¡Gracias!

EDITAR de nuevo: ahora que solo hay uno print, el oalias es una responsabilidad, no un ahorro. 4 bytes más de descuento.

EDITE un poco más: Sp3000 me ahorró 2 bytes más. Mientras tanto, aliasing mapa mno fue guardar nada, por lo que en aras de la legibilidad (!) He ampliado de nuevo. Ahora es una buena ronda 2 8 bytes.

EDITE el último (?): Ahora con soporte de distancia euclidiana, y al abusar de números complejos, ¡lo hice exactamente en el mismo número de bytes!

EDIT, el reinicio de Hollywood: la siguiente sugerencia de Sp3000 eliminó 5 bytes.

EDIT, la secuela estúpidamente nombrada: 6 bytes recortados, gracias a una sugerencia que Maltysen hizo que no entendí hasta que Sp3000 lo repitió ... luego otros 8 bytes del %abuso. Y hablarlo en el chat provocó un fenomenal2126 bytes. Estoy humilde


@Maltysen: Muy bien. ¡20 bytes guardados!
Tim Pederick

un poco más: en lugar de las complicadas cosas de sys.stdin con EOFs que puede usar iter()con valores centinela: docs.python.org/2/library/functions.html#iter como iter(raw_input,''), también coloque w,h,Sen la misma línea con desempaquetado extendido.
Maltysen

@Maltysen: no estoy seguro de que funcione. Ya estaba haciendo casi exactamente eso, pero golpea EOFError(y necesitaba un trybloque), porque no hay una línea en blanco en el archivo de entrada y no estoy seguro de que el desafío me permita agregar uno. ¿O me estoy perdiendo algo?
Tim Pederick

Creo que si usted es el valor del centinela, podría terminar con una línea en blanco en lugar de alimentar el archivo, aunque, sí, el archivo no funcionaría.
Maltysen

@ Sp3000: Sorprendentemente, ¡sí! Esperaba que se quejara de que stdinno era un 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");}

Necesita un compilador indulgente de C ++ 11 (GCC 4.9.2 solo está un poco disgustado) y la biblioteca png ++ , que a su vez requiere libpng. Distancia de Manhattan utilizada. Toma entradas stdin, salidas a un archivo llamado "a" en el directorio actual en formato PNG.

Ejemplo D

ingrese la descripción de la imagen aquí


ingrese la descripción de la imagen aquí


ingrese la descripción de la imagen aquí


1
Me gusta la PCGimagen :) (Aunque PPCGes mi abreviatura preferida;))
Calvin's 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()

Utiliza la distancia de Manhattan. Esto probablemente sería aún más corto en Python 3, pero recientemente estropeé mis paquetes de Python y tengo problemas para reinstalar Pillow. PPM probablemente sería aún más corto, pero me gusta PIL.

Por diversión, traté de aplicar el algoritmo tal como está en el espacio de color L * a * b * en su lugar, pensando que daría una mejor combinación de colores (especialmente en el ejemplo B). Desafortunadamente, el algoritmo de Calvin permite que los canales superen sus valores máximos, lo que hace que las imágenes se vean un poco menos impresionantes de lo que esperaba ...

ingrese la descripción de la imagen aquí


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"&

Una función pura que toma una cadena. Para ejecutarlo en un período de tiempo razonable, reemplace 1in 1+#~ManhattanDistance...con a 1.; esto fuerza el cálculo numérico en lugar de simbólico.

Sin golf:

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, 287251 bytes

Una versión de golf del código original que utilicé para generar las imágenes. Probablemente podría jugar al golf un poco más (por un mejor golfista que yo). Es una función que toma la cadena de entrada completa. Procesamiento de imagen realizado con el módulo de imagen de PIL . Utiliza la distancia 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()

El uso de la distancia euclidiana es 5 bytes más largo (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()

Aquí hay un conjunto de pruebas completo que ejecuta los ejemplos A a E de la pregunta, para ambas métricas de distancia:

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 parecen indistinguibles. Los más grandes pueden tardar unos segundos en ejecutarse.


Creo que puede guardar un montón de bytes cambiando for x in r(I[0]):...for y in r(I[1]):al cambiarlo a for x in r(I[0]*I[1]):. A continuación, puede tomar cada nivel de sangría en 1, y reemplazar xcon x/I[1]y ycon y%I[1].
Kade

Puede guardar 5 bytes reemplazando from PIL import Imageafrom PIL import*
sagiksp

6

C, 247 bytes

No voy a ganar, pero me gusta jugar al golf en C. No se usa una biblioteca de imágenes externa, las salidas a stdout en formato PPM. Toma entrada en stdin. Utiliza la distancia de Manhattan para el golf.

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

Aquí está la variante de distancia 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}/

Si bien esto puede parecer bastante largo para un lenguaje de golf, creo que de las soluciones publicadas hasta ahora, es la más corta que no utiliza la funcionalidad de salida de imagen. Esto produce un archivo PPM en forma ASCII. La imagen a continuación se convirtió de PPM a PNG usando GIMP.

No recomiendo ejecutar el código en el intérprete de CJam en línea. Al menos no para las imágenes a tamaño completo. Mi navegador bloqueado, probablemente debido al uso de memoria. Completa las imágenes de 400x400 en el segundo rango con la versión fuera de línea.

Ejemplo C

Explicación:

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 bytes

Me doy cuenta de que C # es terrible para jugar al golf, pero aquí está mi intento 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;}}}

Si alguien tiene alguna sugerencia para acortarlo, no dude en hacérmelo saber.


Te has perdido la sobrecarga Color.FromArgb (int, int, int). Ahorraría 4 bytes ...
Melvyn

Además, probablemente debería usar .Length en lugar de .Count (). un byte menos y más eficiente. Y, por cierto, podría ahorrar muchos más bytes utilizando los nuevos miembros con cuerpo de expresión de C # 6, si está dispuesto a hacerlo.
Melvyn

Buenos puntos tanto en la longitud como en la sobrecarga, ajustándose ahora. Y mirando a los miembros con cuerpo de expresión. No los he visto antes. Gracias
Allan Harper

4

Python, 259 bytes

¡Finalmente hecho! Primer código de golf que probé, decidí usar Python y seguí la distancia de Manhattan. Gracias a Maltysen por ayudarme con los iteradores, ¡reduje el tamaño total a casi la mitad!

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

Sé que debe haber una manera de hacer un cálculo para todos ellos, pero sinceramente, no conozco Python tan bien.
Nicolás Siplis


Tu todavía no funciona correctamente, tienes que cambiar el k[0]y k[1]en los cálculos.
Maltysen

Me llevó unos 10 minutos darme cuenta de por qué funcionaba en mi máquina, resultó que los invertí pero olvidé cambiarlo aquí.
Nicolás Siplis

2

CJam, 70 bytes

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

Distancia euclidiana, salida ASCII PPM. Pruébalo en línea

Debería ser posible exprimir algunos bytes más, pero no quiero pasar demasiado tiempo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.