Crie um pixel ruim

40

Sua tarefa é escrever um programa que faça com que sua tela pareça ter um pixel ruim.

Você deve escolher exatamente um pixel na tela e exatamente um canal entre vermelho, verde e azul e tornar seu valor sempre 0 ou sempre máximo (geralmente 255). Os valores de outros canais devem ser os mesmos, como se o seu programa não fosse executado.

Você pode escolher o pixel e o canal de qualquer maneira, como codificá-lo ou gerá-lo aleatoriamente em cada execução. Mas sempre deve estar visível em hardwares bastante modernos.

Se a cor que originalmente deveria ser exibida naquele pixel mudou, seu programa deve ser atualizado em menos de 0,5 segundos quando o sistema for rápido o suficiente.

Você não pode fazer suposições sobre o que é exibido atualmente na tela (como uma barra de tarefas usando o tema padrão).

Seu programa não precisa funcionar quando um protetor de tela, tela de login, efeito de um gerenciador de janelas etc. está ativo.

O menor código vence.

jimmy23013
fonte
11
Podemos assumir um sistema operacional específico?
Loovjo
@Loovjo Sim, você pode.
jimmy23013
Ow ... o requisito de preservar os outros canais provavelmente dobra minha já ridícula contagem de bytes.
Bob

Respostas:

21

Bash no Linux - 25 bytes de Latin-1

+3 de @wyldstallyns / -2 de remover aspas / -1 porque eu esqueci como isso funciona / -9 de @Dennis

printf ÿ>/dev/fb0;exec $0

Assume que / dev / fb0 existe (existe no meu sistema Arch Linux e acho que deveria existir em qualquer outro sistema Linux). Requer acesso root também. Isso não funciona para mim quando o X está sendo executado. No meu sistema, isso apenas define constantemente o canal azul do pixel superior esquerdo ( ÿé 255).

artificialnull
fonte
Você precisa echo -n - caso contrário, isso poderia ser golfe para: sim ff> / dev / fb0 #
wyldstallyns
@wyldstallyns Sim, eu corrigi de acordo. AFAIK, a impressão da nova linha iria influenciar mais do que um pixel (não é permitido pela descrição desafio)
artificialnull
11
Como é ÿ 255? Eu não acho que isso funciona. 255 não é um caractere unicode válido, também não é ascii, portanto, deve confiar em uma daquelas páginas de código antigas que nunca deveriam ser usadas, pois diferem de máquina para máquina.
orion
11
printf ÿ>/dev/fb0;exec $0salva alguns bytes.
Dennis
3
@orion A yesabordagem não funciona. /dev/fb0precisa ser reaberto depois de gravar um canal de pixel.
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);}

É executado no Windows, usando diretamente a API Win32 com o compilador Visual C ++, visando o subsistema do console. Usa o contexto do dispositivo "tela" para definir o canal vermelho do pixel em (9,9) para 0xFF.

O sono é necessário para permitir que outros programas entrem entre o get / set - e 9ms era muito curto, levando o pixel a ficar preso 1 em sua cor inicial.


1 Infelizmente, não é exatamente o mesmo tipo de pixel preso que esta pergunta está procurando ...

Prumo
fonte
8

HolyC, 13 bytes

GrPlot(,9,9);

Coloca diretamente um ponto preto na camada persistente.

Camadas

O que isso parece.

Captura de tela

m4kefile
fonte
6

C #, 247 244 371 366 354 352 bytes

Executa no Windows. Obtém um contexto de dispositivo para a tela inteira e maximiza repetidamente o canal vermelho em (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, não queria importar GetPixel/ SetPixel, mas não há uma maneira particularmente fácil de ler um único pixel de uma Graphic. Então, neste momento, é efetivamente o mesmo que minha tentativa de VC ++ . Talvez salvar no bitmap seja mais curto ...


-5 bytes graças a @TuukkaX

Prumo
fonte
11
Você pode remover os espaços em branco da lista de parâmetros de SetPixel.
Yytsi 12/12/16
@TuukkaX Thanks! Perdeu aqueles.
1212 Bob
Você pode fazê-lo dormir 9msem vez de99ms
Rob
2
@ Rob Eu tentei isso, como mencionado na resposta C ++. Infelizmente, 9ms não parecem ser suficientes quando eu testei (Win7). Como outros programas não tinham tempo suficiente para pintar, o pixel ficou preso na cor inicial.
Bob
Também poderia reduzi-lo executando 0x1FFFFFFFiterações em um loop ocupado, em vez de dormir, mas isso teria que ser ajustado para que cada máquina permanecesse dentro do limite de 0,5s.
1212 Bob
3

SmileBASIC, 20 bytes

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

Atualiza constantemente.
Define o sprite 0para uma área 1x 1em 299, 99na folha de sprite (que é um pixel vermelho).
33é o atributo de exibição, que é 1(exibição em) + 32(mistura aditiva).

12Me21
fonte
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);}}

Eu executei isso no Windows 7. Abre um Java Applet que possui um fundo branco por padrão. Adiciona um rótulo com um ponto final e depois muda a cor do rótulo ad nauseum.

Cutucar
fonte
2
Na verdade, não tenho certeza se isso é válido, pois altera apenas o pixel na janela do applet. Não mudará a cor do pixel se o applet perder o foco ... Excluirei esta resposta se não atender aos critérios do desafio.
Poke
0

Tcl / Tk, 61

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

Na imagem, há um pixel preto perto do canto superior esquerdo do ícone Vivaldi: badpixel


Se em um shell interativo, há abreviações de comandos disponíveis:

Tcl / Tk, 57

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

Há um pixel preto sobre a área branca V do ícone Vivaldi: badpixel

sergiol
fonte