Escriba un programa que imprima el color RGB de un píxel en la pantalla.
El programa debe leer una línea de stdin en el formato x,y
, donde x e y son enteros sin signo. El píxel (0,0) es el píxel superior izquierdo de la pantalla.
El programa debería generar una línea para stdout en el formato RRR,GGG,BBB
, que representa el color del píxel en ( x
, y
).
RRR
, GGG
Y BBB
debe ser números de punto flotante entre 0 y 1, O enteros en el rango [0, 255]. Los ceros iniciales no importan, por ejemplo: ambos 074
y 74
son aceptables.
Comportamiento indefinido
Está bien que el programa exhiba un comportamiento indefinido (bloqueo, dar salida incorrecta, etc.) en las siguientes condiciones:
- El usuario ingresa una cadena, entero con signo, flotante o cualquier otro tipo de datos no válido
- La entrada del usuario no está en el formato
x,y
- El píxel especificado está fuera de la pantalla.
Notas:
- El programa no puede modificar el píxel en las coordenadas dadas.
- Si tiene varios monitores, no importa en qué monitor esté encendido el píxel, siempre que se use el mismo monitor cada vez que se ejecute el programa.
La respuesta con la menor cantidad de bytes gana.
RRR
,GGG
yBBB
ser puntos flotantes entre 0 y 1? Por lo general, son enteros en el rango[0,255]
. Sugeriría permitir ambos.RRR
,GGG
yBBB
en la especificación, peroR
,G
,B
0, 0, 0
, frustrando el propósito del desafío.Respuestas:
Java 10 (función lambda),
10575 bytesUna función que toma dos parámetros enteros y devuelve una cadena
RRR,GGG,BBB
, donde los colores son enteros en el rango[0, 255]
.-30 bytes gracias a @LukeStevens mediante el uso
java.awt.Color
de latoString()
salida predeterminada y modificándola para que solo queden los dígitos y las comas.Explicación:
NOTA: La
toString()
implementación predeterminada de lajava.awt.Color
siempre ha sido la misma en todas las versiones de JVM, que yo sepa, pero potencialmente puede cambiar en el futuro. Lo probé en Java 8 y Java 10 y regresó"java.awt.Color[r=#,g=#,b=#]"
.Pero, como el desafío dice:
x,y
de STDINR,G,B
STDOUTR
,G
,B
como puntos flotantes en el rango[0.0, 1.0]
El código se vuelve MUCHO más detallado:
Java 10 (programa completo), 266 bytes
Explicación:
fuente
x->y->(new java.awt.Robot().getPixelColor(x,y)+"").replaceAll("[^\\d,]","")
75 bytestoString()
dejava.awt.Color
. ¡Gracias!toString()
camino también ... ;-) Excepto que tuve que descargar un IDE para hacer todo eso: solo uso TIO ahora :(Color::toString
es discrecional de implementación. Por lo tanto, podría ser bueno especificar qué JVM se usó para las pruebas (funciona como está con OpenJDK y Oracle JDK)." "
con","
para cumplir con elRRR,GGG,BBB
formato estricto (noRRR GGG BBB
).6502 código máquina (C64),
280260 bytesEsperaba que esto fuera posible en muchos menos bytes, pero desafortunadamente ... bueno, desde que lo terminé, publicando ahora de todos modos. Al menos, el formato restrictivo ayudó con una cosa: algo similar a
stdin
(entrada desde un dispositivo actual) solo existe en el C64 en modo de texto, porque el sistema operativo solo admite este modo, por lo que no es necesario considerar otros modos del chip de gráficos .Nota sobre la salida de los valores de color: el chip gráfico C64 no usa colores RGB, sino que genera directamente una señal de video con colores YUV, con una paleta fija de 16 colores. Utilicé valores redondeados de la conversión de colodore a RGB con la configuración de monitor "predeterminada" aquí.
-20 bytes : mejor rutina de salida, codificando la salida de 3 caracteres por canal de color en un solo byte.
Con respecto al comentario: en teoría es posible usar incluso el modo de caracteres multicolor del VIC con el sistema operativo C64 estándar, pero requiere una fuente personalizada que en realidad sea legible con solo 4 píxeles horizontales de doble ancho. No del todo imposible, pero muy poco probable. Del mismo modo, el modo de color extendido (o el modo de fondo extendido, que es el mismo) podría usarse con el sistema operativo C64, pero requiere reconfigurar el chip de gráficos directamente. Opté por ignorar todas estas posibilidades en el sentido del golf de código aquí: no es el entorno estándar que se encuentra en un Commodore 64 con sistema operativo stock en ejecución. Lo que es posible con el sistema operativo estándar es cambiar entre dos fuentes incorporadas (shift + tecla Commodore), el programa lo explica.
Demostración en línea
Uso:
SYS49152
para comenzar.Desmontaje comentado :
fuente
cc65
... bastante posible :) pero al menos, el código compilado será más grande :)TI-BASIC (TI-83/84 +), 22 bytes
Dado que la pantalla es en blanco y negro, solo necesitamos probar si el píxel especificado está activado o desactivado y asignarlo a RGB en blanco o negro. Además, solo se puede acceder a los píxeles a través de filas y columnas en ese orden, por eso se invierten las coordenadas.
fuente
bash, 103/86 bytes
Con una interpretación estricta de la especificación (la entrada de STDIN y la salida en STDOUT están separadas por comas):
Con un formato de entrada más flexible (entrada separada más como un argumento de línea de comando, salida separada por espacios:
Depende de imagemagick, awk y coreutils.
fuente
Ensamblaje TI-Nspire - 112 bytes
Este programa genera enteros en el rango 0-31 para R y B y 0-63 para G, porque el dispositivo utiliza de forma nativa un bufferbuffer RGB565. Utiliza serial para entrada y salida.
Fuente:
fuente
Bash en Linux con xserver, 30 bytes
Usando la idea presentada en mi comentario sobre la pregunta, esta solución debería apagar completamente la salida de la pantalla y luego hacer eco de que la pantalla es realmente negra.
También estaba pensando en usar
xbacklight =0
, pero eso no cambia los colores de los píxeles.fuente
Python 2 + biblioteca PIL,
9691 bytesImplementa la especificación literalmente según lo solicitado. Sin embargo, Windows solo no funciona en Linux y produce una salida adicional (valor alfa) en Mac.
fuente
from PIL import ImageGrab as i
→from PIL import*
,i.grab
→ImageGrab.grab
.__import__('...')
camino funcioneMathematica, 69 Bytes
Solo la función es de 34 bytes.
CurrentScreenImage[]~PixelValue~#&
Toma entrada en la forma {x, y}.
La imagen es la fusión de imágenes en todos los monitores. Si desea una pantalla en particular, use el índice entero, p. Ej.
CurrentScreenImage[1]
El programa completo exactamente como se especifica es 69 Bytes
CurrentScreenImage[]~PixelValue~ToExpression["{"<>InputString[]<>"}"]
fuente
AutoHotKey, 113 bytes
Use cuadros de diálogo en lugar de stdin / stdout.
fuente
Bash + coreutils + scrot + netpbm, 90 bytes
Versión de E / S suelta
Toma
x
yy
como argumentos separados de la línea de comandos.Prints
r
,g
,b
como enteros de 0-255 en líneas separadasBash + coreutils + scrot + netpbm + bc + sed, 172 bytes
Versión estricta de E / S
Entrada en stdin como
x,y
Salida en stdout como
r.rr,g.gg,b.bb
(sin nueva línea).fuente
TI-BASIC (TI-83/84 +), 15 bytes
Toma un entero de
Ans
y otro de la solicitud.rand(3)
crea una lista de 3 números aleatorios distintos de cero, por lo que el producto es cero si el píxel está oscuro.fuente