Créer un mauvais pixel

40

Votre tâche consiste à écrire un programme qui donne à votre écran un mauvais pixel.

Vous devez choisir exactement un pixel à l'écran et exactement un canal entre le rouge, le vert et le bleu, et attribuer sa valeur toujours à 0 ou toujours à son maximum (généralement 255). Les valeurs des autres canaux doivent être les mêmes que si votre programme ne fonctionnait pas.

Vous pouvez choisir le pixel et le canal de quelque manière que ce soit, comme le coder en dur ou le générer de manière aléatoire à chaque passage. Mais il doit toujours être visible sur des matériels assez modernes.

Si la couleur initialement affichée sur ce pixel a changé, votre programme doit être mis à jour en moins de 0,5 seconde lorsque le système est suffisamment rapide.

Vous ne pouvez pas émettre d'hypothèses sur ce qui est actuellement affiché à l'écran (telle qu'une barre de tâches utilisant le thème par défaut).

Votre programme n'a pas besoin de fonctionner lorsqu'un économiseur d'écran, un écran de connexion, un effet provenant d'un gestionnaire de fenêtres, etc. sont actifs.

Le code le plus court gagne.

jimmy23013
la source
1
Peut-on supposer un système d'exploitation spécifique?
Loovjo
@ Loovjo Oui, vous pouvez.
Jimmy23013
Ow ... l'obligation de préserver les autres canaux double probablement le nombre d'octets déjà ridicule.
Bob

Réponses:

21

Bash sur Linux - 25 octets de latin-1

+3 de @wyldstallyns / -2 de supprimer les guillemets / -1 car j'ai oublié comment cela fonctionne / -9 de @Dennis

printf ÿ>/dev/fb0;exec $0

Suppose que / dev / fb0 existe (cela existe sur mon système Arch Linux, et je pense que cela devrait être le cas sur tout autre système Linux). Nécessite également un accès root. Cela ne fonctionne pas pour moi lorsque X est en cours d'exécution. Sur mon système, le canal bleu du pixel situé en haut à gauche est paramétré en permanence ( ÿ255).

artificiel
la source
Vous avez besoin de echo -n - sinon cela pourrait jouer au golf à: oui ff> / dev / fb0
wyldstallyns
@wyldstallyns Oui, j'ai corrigé le problème en conséquence. Autant que je sache, l'impression de la nouvelle ligne aurait une influence sur plus d'un pixel (non autorisé par la description du défi)
artificialnull
1
Comment va 255? Je ne pense pas que ça marche. 255 n'est pas un caractère unicode valide, il n'est pas non plus ascii, il doit donc s'appuyer sur l'une de ces anciennes pages de codes qui ne devrait jamais être utilisée, car elles diffèrent d'une machine à l'autre.
orion
1
printf ÿ>/dev/fb0;exec $0enregistre quelques octets.
Dennis
3
@orion L' yesapproche ne fonctionne pas. /dev/fb0doit être rouvert après l'écriture d'un canal de pixel.
Dennis
11

Visual C ++, 102 100 99 98 octets

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

Fonctionne sous Windows, directement à l'aide de l'API Win32 avec le compilateur Visual C ++ ciblant le sous-système de la console. Utilise le contexte de périphérique "écran" pour définir le canal rouge du pixel à (9,9) sur 0xFF.

La mise en veille est nécessaire pour permettre aux autres programmes d’attirer entre le get / set - et 9 ms était trop court, le pixel se bloquant 1 sur sa couleur initiale.


1 Malheureusement, cette question ne correspond pas au même type de pixel bloqué ...

Bob
la source
8

HolyC, 13 octets

GrPlot(,9,9);

Place un point noir sur le calque persistant directement.

Couches

À quoi il ressemble.

Capture d'écran

m4kefile
la source
6

C #, 247 244 371 366 354 352 octets

Fonctionne sous Windows. Obtient un contexte de périphérique pour tout l'écran et maximise à plusieurs reprises le canal rouge à (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);}}}

Au départ, je ne voulais pas importer GetPixel/ SetPixel, mais il n’existe pas de moyen particulièrement facile de lire un pixel sur un fichier Graphic. Donc, pour l’instant, c’est la même chose que ma tentative de VC ++ . Peut-être que l'enregistrement en bitmap sera plus court ...


-5 octets grâce à @TuukkaX

Bob
la source
1
Vous pouvez supprimer les espaces blancs de la liste de paramètres de SetPixel.
Yytsi
@ TuukkaX Merci! Manqué ceux.
Bob
Tu peux le faire dormir 9msplutôt que de99ms
Rob
2
@ Rob J'ai essayé cela, comme mentionné dans la réponse C ++. Malheureusement, 9 ms ne semblait pas être suffisant lorsque j'ai testé (Win7). Les autres programmes n’ont pas eu le temps de peindre et le pixel est donc resté bloqué sur sa couleur initiale.
Bob
Pourrait aussi le raccourcir en parcourant les 0x1FFFFFFFitérations dans une boucle occupée au lieu du sommeil, mais cela devrait être réglé pour que chaque machine reste dans la limite de 0,5 s.
Bob
3

SmileBASIC, 20 octets

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

Mises à jour constamment.
Définit l’image-objet 0sur une zone 1x 1située à 299, 99sur la feuille de l’image-objet (qui est un pixel rouge).
33est l'attribut display, qui est 1(display on) + 32(fusion additive).

12Me21
la source
1

Java 7, 266 octets

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

J'ai exécuté ceci sur Windows 7. Ouvre une applet Java qui a un fond blanc par défaut. Ajoute une étiquette avec un point, puis modifie la couleur de l'étiquette ad nauseum.

Poussée
la source
2
Pas vraiment sûr que cela soit valide car cela ne change que le pixel dans la fenêtre de l'applet. Ne changera pas la couleur du pixel si l'applet perd le focus ... Je supprimerai cette réponse si elle ne répond pas aux critères du défi.
Poke
0

Tcl / Tk, 61

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

Sur l'image, il y a un pixel noir près du coin supérieur gauche de l'icône Vivaldi: badpixel


Si sur un shell interactif, il existe des abréviations de commandes disponibles:

Tcl / Tk, 57

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

Un pixel noir recouvre la zone V blanche de l’icône Vivaldi: badpixel

sergiol
la source