Crea un píxel malo

40

Su tarea es escribir un programa que haga que su pantalla parezca tener un píxel malo.

Debe elegir exactamente un píxel en la pantalla y exactamente un canal entre rojo, verde y azul, y hacer que su valor sea siempre 0 o siempre máximo (generalmente 255). Los valores de otros canales deben ser los mismos que si su programa no se ejecutara.

Puede elegir el píxel y el canal de cualquier forma, como codificarlo o generarlo aleatoriamente en cada ejecución. Pero siempre debe ser visible en hardwares bastante modernos.

Si el color que originalmente debería mostrarse en ese píxel ha cambiado, su programa debería actualizarse en menos de 0.5 segundos cuando el sistema sea lo suficientemente rápido.

No puede hacer suposiciones sobre lo que se muestra actualmente en la pantalla (como una barra de tareas que usa el tema predeterminado).

Su programa no necesita funcionar cuando un protector de pantalla, pantalla de inicio de sesión, efecto de un administrador de ventanas, etc., están activos.

El código más corto gana.

jimmy23013
fuente
1
¿Podemos asumir un sistema operativo específico?
Loovjo
@Loovjo Sí, puedes.
jimmy23013
Ow ... el requisito de preservar los otros canales probablemente duplica mi recuento de bytes ya ridículo.
Bob

Respuestas:

21

Bash en Linux: 25 bytes de Latin-1

+3 de @wyldstallyns / -2 de eliminar comillas / -1 porque olvidé cómo funciona esto / -9 de @Dennis

printf ÿ>/dev/fb0;exec $0

Asume que / dev / fb0 existe (existe en mi sistema Arch Linux, y creo que debería hacerlo en cualquier otro sistema Linux). Requiere acceso raíz también. Esto no funciona para mí cuando X se está ejecutando. En mi sistema, esto establece constantemente el canal azul del píxel superior izquierdo a lleno ( ÿes 255).

artificial
fuente
Necesita echo -n; de lo contrario, esto podría jugar golf: sí ff> / dev / fb0
wyldstallyns
@wyldstallyns Sí, lo arreglé en consecuencia. Que yo sepa, la impresión de la nueva línea influiría más de un píxel (no permitido por la descripción desafío)
artificialnull
1
¿Cómo es ÿ 255? No creo que esto funcione. 255 no es un carácter Unicode válido, tampoco es ascii, por lo que debe confiar en una de esas antiguas páginas de códigos que nunca deberían usarse, ya que difieren de una máquina a otra.
orion
1
printf ÿ>/dev/fb0;exec $0Guarda algunos bytes.
Dennis
3
@orion El yesenfoque no funciona. /dev/fb0tiene que reabrirse después de escribir un canal de píxeles.
Dennis
11

Visual C ++, 102 100 99 98 bytes

#include<Windows.h>
int main(){for(HDC d=GetDC(0);;Sleep(99))SetPixel(d,9,9,GetPixel(d,9,9)|255);}

Se ejecuta en Windows, directamente usando la API Win32 con el compilador de Visual C ++ dirigido al subsistema de la consola. Utiliza el contexto del dispositivo "pantalla" para establecer el canal rojo del píxel en (9,9) en 0xFF.

La suspensión es necesaria para permitir que otros programas dibujen entre get / set, y 9 ms fue demasiado corto, lo que provocó que el píxel se atascara 1 en su color inicial.


1 Desafortunadamente, no es exactamente el mismo tipo de píxel atascado que esta pregunta busca ...

Mover
fuente
8

HolyC, 13 bytes

GrPlot(,9,9);

Pone un punto negro en la capa persistente directamente.

Capas

Cómo se ve

Captura de pantalla

m4kefile
fuente
6

C #, 247 244 371 366 354 352 bytes

Se ejecuta en Windows. Obtiene un contexto de dispositivo para toda la pantalla y maximiza repetidamente el canal rojo en (9,9).

namespace System.Runtime.InteropServices{using I=IntPtr;class P{[DllImport("User32")]static extern I GetDC(I h);[DllImport("Gdi32")]static extern int GetPixel(I h,int x,int y);[DllImport("Gdi32")]static extern int SetPixel(I h,int x,int y,int c);static void Main(){for(I d=GetDC((I)0);;Threading.Thread.Sleep(99))SetPixel(d,9,9,GetPixel(d,9,9)|255);}}}

Originalmente no quería importar GetPixel/ SetPixel, pero no hay una manera particularmente fácil de leer un solo píxel en un Graphic. Así que en este momento esto es efectivamente lo mismo que mi intento de VC ++ . Tal vez guardar en mapa de bits será más corto ...


-5 bytes gracias a @TuukkaX

Mover
fuente
1
Puede eliminar los espacios en blanco de la lista de parámetros de SetPixel.
Yytsi
@TuukkaX ¡Gracias! Los perdí.
Bob
Puedes hacer que duerma en 9mslugar de99ms
Rob
2
@Rob Intenté eso, como se menciona en la respuesta de C ++. Desafortunadamente, 9ms no parecían ser suficientes cuando lo probé (Win7). Otros programas no tuvieron suficiente tiempo para pintar, por lo que el píxel se atascó efectivamente en su color inicial.
Bob
También podría acortarlo ejecutando 0x1FFFFFFFiteraciones en un bucle ocupado en lugar de la suspensión, pero esto tendría que ajustarse para que cada máquina permanezca dentro del límite de 0.5s.
Bob
3

SmileBASIC, 20 bytes

SPSET.,299,99,1,1,33

Se actualiza constantemente.
Establece sprite 0en un área 1x 1en 299, 99en la hoja de sprite (que es un píxel rojo).
33es el atributo de visualización, que es 1(visualización activada) + 32(combinación de aditivos).

12Me21
fuente
1

Java 7, 266 bytes

import java.awt.*;public class K extends java.applet.Applet{public static void main(String[]a){new K();}Label l=new Label(".");public K(){add(l);}public void paint(Graphics g){s(Color.red);s(Color.green);s(Color.blue);repaint();}void s(Color c){l.setForeground(c);}}

Ejecuté esto en Windows 7. Abre un Applet Java que tiene un fondo blanco por defecto. Agrega una etiqueta con un punto y luego cambia el color de la etiqueta hasta la náusea.

Meter
fuente
2
No estoy seguro de si esto es válido, ya que solo cambia el píxel en la ventana del applet. No cambiará el color del píxel si el applet pierde el foco ... Eliminaré esta respuesta si no cumple con los criterios del desafío.
Poke
0

Tcl / Tk, 61

wm at . -tr #F0F0F0
wm o . 1
grid [canvas .c]
.c cr o 9 9 9 9

En la imagen hay un píxel negro cerca de la esquina superior izquierda del icono de Vivaldi: badpixel


Si se encuentra en un shell interactivo, hay abreviaturas de comandos disponibles:

Tcl / Tk, 57

wm at . -tr #F0F0F0
wm o . 1
gri [can .c]
.c cr o 9 9 9 9

Hay un píxel negro sobre el área blanca V del icono de Vivaldi: badpixel

sergiol
fuente