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:
width
yheight
puede ser cualquier número entero positivo.x
yy
puede ser cualquier número entero.intensity
puede ser cualquier número entero no negativo.red
,green
yblue
pueden 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 width
de height
. Cada x y intensity red green blue
lí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:
Donde la función dist es la distancia euclidiana :
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
x
valor en una de las líneas de entrada, y S C representa o bienred
,green
, oblue
, 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
si está utilizando la distancia euclidiana, y
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
y .
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
si está utilizando la distancia euclidiana, y
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
si está utilizando la distancia euclidiana, y
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.
fuente
Respuestas:
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.
Esto solo recorre todos los píxeles con la fórmula, aunque condensa el bucle de píxeles en un bucle y lo usa,
divmod
ya 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 elFusionado!.w
que 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.Ejemplos de salidas
Ejemplo A
Ejemplo B
Ejemplo C
Ejemplo D
fuente
JavaScript
394344Editar: 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).
Mostrar fragmento de código
También puede ejecutarlo en JSFiddle .
Bonus: Eclipse Azul
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:
fuente
Java - 627 bytes
Java es de hecho uno de los mejores lenguajes de golf :)
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
Imagen Full HD , que no se ve genial ... ¡Sería feliz si alguien pudiera mejorarla!
fuente
Bash,
147145bytesImageMagick se usa para manipular imágenes. Se usa la distancia euclidiana.
fuente
$w\x$h
.o=o.png
.Python 3, 189 bytes
No soy idea de un golfista experto, pero aquí va.
stdin
y va astdout
en formato PPM .python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm
Primero, distancia de Manhattan:
Y en segundo lugar, la distancia euclidiana:
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 x
yfor y
en una solaprint
(oo
funció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
, elo
alias 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
map
am
no 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 humildefuente
EOF
s que puede usariter()
con valores centinela: docs.python.org/2/library/functions.html#iter comoiter(raw_input,'')
, también coloquew,h,S
en la misma línea con desempaquetado extendido.EOFError
(y necesitaba untry
bloque), 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?stdin
no era un iterador.C ++, 272 bytes
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 entradasstdin
, salidas a un archivo llamado "a" en el directorio actual en formato PNG.Ejemplo D
fuente
PCG
imagen :) (AunquePPCG
es mi abreviatura preferida;))Python 2,
240232228 bytesUtiliza 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 ...
fuente
Mathematica, 146 bytes
Una función pura que toma una cadena. Para ejecutarlo en un período de tiempo razonable, reemplace
1
in1+#~ManhattanDistance...
con a1.
; esto fuerza el cálculo numérico en lugar de simbólico.Sin golf:
fuente
Python 2,
287251bytesUna 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.
El uso de la distancia euclidiana es 5 bytes más largo (256 bytes):
Aquí hay un conjunto de pruebas completo que ejecuta los ejemplos A a E de la pregunta, para ambas métricas de distancia:
Todos parecen indistinguibles. Los más grandes pueden tardar unos segundos en ejecutarse.
fuente
for x in r(I[0]):...for y in r(I[1]):
al cambiarlo afor x in r(I[0]*I[1]):
. A continuación, puede tomar cada nivel de sangría en 1, y reemplazarx
conx/I[1]
yy
cony%I[1]
.from PIL import Image
afrom PIL import*
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.
Aquí está la variante de distancia euclidiana (257 bytes):
fuente
CJam, 86 bytes
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.
Explicación:
fuente
C # 718 bytes
Me doy cuenta de que C # es terrible para jugar al golf, pero aquí está mi intento de 718 bytes
Si alguien tiene alguna sugerencia para acortarlo, no dude en hacérmelo saber.
fuente
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!
fuente
k[0]
yk[1]
en los cálculos.CJam, 70 bytes
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.
fuente