Erstelle ein schlechtes Pixel

40

Ihre Aufgabe ist es, ein Programm zu schreiben, das Ihren Bildschirm so aussehen lässt, als hätte er ein schlechtes Pixel.

Sie sollten genau ein Pixel auf dem Bildschirm und genau einen Kanal zwischen Rot, Grün und Blau auswählen und den Wert entweder immer auf 0 oder immer auf Maximum setzen (normalerweise 255). Die Werte anderer Kanäle sollten so sein, als ob Ihr Programm nicht ausgeführt würde.

Sie können Pixel und Kanal auf beliebige Weise auswählen, z. B. durch Hardcodierung oder zufällige Generierung bei jedem Durchlauf. Aber es muss immer auf ziemlich modernen Hardware sichtbar sein.

Wenn sich die Farbe, die ursprünglich auf diesem Pixel angezeigt werden sollte, geändert hat, sollte Ihr Programm in weniger als 0,5 Sekunden aktualisiert werden, wenn das System schnell genug ist.

Sie können keine Annahmen darüber treffen, was aktuell auf dem Bildschirm angezeigt wird (z. B. eine Taskleiste mit dem Standarddesign).

Ihr Programm muss nicht funktionieren, wenn ein Bildschirmschoner, ein Anmeldebildschirm, ein Effekt von einem Fenstermanager usw. aktiv sind.

Kürzester Code gewinnt.

jimmy23013
quelle
1
Können wir ein bestimmtes Betriebssystem annehmen?
Loovjo
@ Loovjo Ja, das kannst du.
jimmy23013
Au ... die Anforderung, die anderen Kanäle beizubehalten, verdoppelt wahrscheinlich meine ohnehin schon lächerliche Byteanzahl.
Bob

Antworten:

21

Bash unter Linux - 25 Bytes Latin-1

+3 von @wyldstallyns / -2 vom Entfernen von Anführungszeichen / -1, weil ich vergessen habe, wie das funktioniert / -9 von @Dennis

printf ÿ>/dev/fb0;exec $0

Nimmt an, dass / dev / fb0 existiert (auf meinem Arch Linux-System, und ich denke, es sollte auf jedem anderen Linux-System sein). Erfordert ebenfalls Root-Zugriff. Dies funktioniert bei mir nicht, wenn X ausgeführt wird. Auf meinem System setzt dies den blauen Kanal des oberen linken Pixels konstant auf voll ( ÿist 255).

künstlich
quelle
Du brauchst echo -n - sonst könnte das golfen zu: yes ff> / dev / fb0
wyldstallyns
@wyldstallyns Ja, ich habe es entsprechend behoben. AFAIK, das Drucken der neuen Zeile würde mehr als ein Pixel beeinflussen (nicht durch Herausforderungsbeschreibung erlaubt)
künstlich
1
Wie ist ÿ 255? Ich denke nicht, dass das funktioniert. 255 ist kein gültiges Unicode-Zeichen, es ist auch kein ASCII-Zeichen, daher muss es sich auf eine dieser alten Codepages stützen, die niemals verwendet werden sollten, da sie sich von Maschine zu Maschine unterscheiden.
Orion
1
printf ÿ>/dev/fb0;exec $0spart ein paar Bytes.
Dennis
3
@orion Der yesAnsatz funktioniert nicht. /dev/fb0muss nach dem Schreiben eines Pixelkanals wieder geöffnet werden.
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);}

Läuft unter Windows direkt über die Win32-API mit Visual C ++ - Compiler, der auf das Konsolensubsystem abzielt. Verwendet den Gerätekontext "Bildschirm" , um den roten Kanal des Pixels auf (9,9) zu setzen 0xFF.

Der Energiesparmodus ist erforderlich, damit andere Programme zwischen get / set zeichnen können - und 9 ms waren zu kurz, was dazu führte, dass das Pixel 1 an seiner ursprünglichen Farbe hängen blieb .


1 Leider nicht ganz die gleiche Art von feststeckendem Pixel, nach der diese Frage sucht ...

Bob
quelle
8

HolyC, 13 Bytes

GrPlot(,9,9);

Setzt einen schwarzen Punkt direkt auf die beständige Ebene.

Schichten

Wie es aussieht.

Bildschirmfoto

m4kefile
quelle
6

C #, 247 244 371 366 354 352 Bytes

Läuft unter Windows. Ruft einen Gerätekontext für den gesamten Bildschirm ab und maximiert den roten Kanal wiederholt auf (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);}}}

Eigentlich wollte ich GetPixel/ nicht importieren SetPixel, aber es gibt keine besonders einfache Möglichkeit, ein einzelnes Pixel von einem zu lesen Graphic. Im Moment ist dies praktisch das Gleiche wie mein VC ++ - Versuch . Möglicherweise ist das Speichern auf einer Bitmap kürzer ...


-5 Bytes dank @TuukkaX

Bob
quelle
1
Sie können die Leerzeichen aus der Parameterliste von entfernen SetPixel.
Yytsi
@ TuukkaX Danke! Habe die verpasst.
Bob
Sie können es für Schlaf machen , 9msanstatt99ms
Rob
2
@Rob Ich habe das versucht, wie in der C ++ Antwort erwähnt. Leider schienen 9 ms beim Testen nicht genug zu sein (Win7). Andere Programme hatten nicht genügend Zeit zum Malen, so dass das Pixel effektiv an seiner ursprünglichen Farbe hängen blieb.
Bob
Könnte auch verkürzt werden, indem 0x1FFFFFFFetwaige Iterationen in einer belegten Schleife anstelle des Ruhezustands durchlaufen werden , dies müsste jedoch für jeden Computer so eingestellt werden, dass er innerhalb der 0,5-Sekunden-Grenze bleibt.
Bob
3

SmileBASIC, 20 Bytes

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

Ständig aktualisiert.
Sets Sprite 0zu einem 1x - 1Bereich auf 299, 99auf dem Sprite - Blatt (das ein rotes Pixel ist).
33ist das Anzeigeattribut 1(Anzeige ein) + 32(additive Mischung).

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

Ich habe dies unter Windows 7 ausgeführt. Öffnet ein Java-Applet, das standardmäßig einen weißen Hintergrund hat. Fügt eine Beschriftung mit einem Punkt hinzu und ändert dann die Farbe der Beschriftung ad nauseum.

Sack
quelle
2
Ich bin mir nicht sicher, ob dies gültig ist, da es nur die Pixel im Applet-Fenster ändert. Ändert die Pixelfarbe nicht, wenn das Applet den Fokus verliert ... Ich lösche diese Antwort, wenn sie die Kriterien der Herausforderung nicht erfüllt.
Poke
0

Tcl / Tk, 61

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

Auf dem Bild befindet sich ein schwarzes Pixel in der oberen linken Ecke des Vivaldi-Symbols: badpixel


In einer interaktiven Shell stehen Abkürzungen für Befehle zur Verfügung:

Tcl / Tk, 57

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

Über dem V-weißen Bereich des Vivaldi-Symbols befindet sich ein schwarzes Pixel: badpixel

Sergiol
quelle