Utwórz zły piksel

40

Twoim zadaniem jest napisanie programu, który sprawi, że twój ekran będzie miał zły piksel.

Powinieneś wybrać dokładnie jeden piksel na ekranie i dokładnie jeden kanał między czerwonym, zielonym i niebieskim, a jego wartość powinna zawsze wynosić 0 lub zawsze maksymalnie (zwykle 255). Wartości innych kanałów powinny być takie same, jak gdyby Twój program się nie uruchomił.

Możesz wybrać piksel i kanał na dowolne sposoby, na przykład zakodować go na stałe lub wygenerować losowo przy każdym uruchomieniu. Ale zawsze musi być widoczny na dość nowoczesnym oprogramowaniu sprzętowym.

Jeśli kolor, który pierwotnie powinien być wyświetlany na tym pikselu, zmienił się, twój program powinien zaktualizować się w mniej niż 0,5 sekundy, gdy system jest wystarczająco szybki.

Nie można zakładać, co jest aktualnie wyświetlane na ekranie (np. Pasek zadań z domyślnym motywem).

Twój program nie musi działać, gdy aktywny jest wygaszacz ekranu, ekran logowania, efekt z menedżera okien itp.

Najkrótszy kod wygrywa.

jimmy23013
źródło
1
Czy możemy założyć określony system operacyjny?
Loovjo,
@Loovjo Tak, możesz.
jimmy23013,
Ow ... wymóg zachowania innych kanałów prawdopodobnie podwaja moją i tak już śmieszną liczbę bajtów.
Bob

Odpowiedzi:

21

Bash w systemie Linux - 25 bajtów Latin-1

+3 z @wyldstallyns / -2 od usuwania cudzysłowów / -1, ponieważ zapomniałem, jak to działa / -9 z @Dennis

printf ÿ>/dev/fb0;exec $0

Zakłada się, że / dev / fb0 istnieje (działa na moim systemie Arch Linux i myślę, że powinien na każdym innym systemie Linux). Wymaga również dostępu do roota. To nie działa dla mnie, gdy X jest uruchomiony. W moim systemie to po prostu ustawia niebieski kanał lewego górnego piksela na pełny ( ÿto 255).

sztuczny zero
źródło
Potrzebujesz echa -n - w przeciwnym razie mógłby to zrobić golf: tak ff> / dev / fb0
wyldstallyns
@wyldstallyns Tak, odpowiednio to naprawiłem. AFAIK, wydrukowanie nowego wiersza wpłynęłoby na więcej niż jeden piksel (niedozwolone w opisie wyzwania)
sztuczne
1
Jak to ÿ 255? Nie sądzę, że to działa. 255 nie jest prawidłowym znakiem Unicode, nie jest też ascii, więc musi polegać na jednym z tych starożytnych stron kodowych, których nigdy nie należy używać, ponieważ różnią się w zależności od maszyny.
orion
1
printf ÿ>/dev/fb0;exec $0oszczędza kilka bajtów.
Dennis,
3
@orion yesPodejście nie działa. /dev/fb0należy ponownie otworzyć po zapisaniu jednego kanału pikseli.
Dennis,
11

Visual C ++, 102 100 99 98 bajtów

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

Działa w systemie Windows, bezpośrednio przy użyciu Win32 API z kompilatorem Visual C ++ ukierunkowanym na podsystem konsoli. Używa kontekstu urządzenia „ekranowego” , aby ustawić czerwony kanał piksela na (9,9) na 0xFF.

Uśpienie jest konieczne, aby umożliwić innym programom rysowanie pomiędzy get / set - a 9ms było zbyt krótkie, co spowodowało, że piksel utknął 1 w początkowym kolorze.


1 Niestety nie do końca ten sam typ zablokowanego piksela, którego szuka to pytanie ...

Kok
źródło
8

HolyC, 13 bajtów

GrPlot(,9,9);

Bezpośrednio umieszcza czarną kropkę na trwałej warstwie.

Warstwy

Jak to wygląda.

Zrzut ekranu

m4kefile
źródło
6

C #, 247 244 371 366 354 352 bajtów

Działa w systemie Windows. Pobiera kontekst urządzenia dla całego ekranu i wielokrotnie maksymalizuje czerwony kanał przy (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);}}}

Początkowo nie chciałem importować GetPixel/ SetPixel, ale nie ma szczególnie łatwego sposobu na odczytanie jednego piksela z Graphic. Więc teraz jest to faktycznie to samo, co moja próba VC ++ . Może zapisywanie do bitmapy będzie krótsze ...


-5 bajtów dzięki @TuukkaX

Kok
źródło
1
Możesz usunąć białe znaki z listy parametrów SetPixel.
Yytsi,
@TuukkaX Thanks! Tęskniłem za nimi.
Bob
Możesz spać 9mszamiast99ms
Rob
2
@Rob Próbowałem tego, jak wspomniano w odpowiedzi na C ++. Niestety, 9ms nie wydawało się wystarczające, kiedy testowałem (Win7). Inne programy nie miały wystarczająco dużo czasu na malowanie, więc piksel skutecznie utknął w początkowym kolorze.
Bob
Można go również skrócić, wykonując około 0x1FFFFFFFiteracji w zajętej pętli zamiast w trybie uśpienia, ale to musiałoby być dostrojone, aby każda maszyna pozostała w granicach 0,5 s.
Bob
3

SmileBASIC, 20 bajtów

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

Aktualizacje stale.
Ustawia duszka 0na obszar 1x 1w 299, 99na arkuszu duszka (który jest czerwonym pikselem).
33to atrybut display, który wynosi 1(display on) + 32(mieszanie addytywne).

12Me21
źródło
1

Java 7, 266 bajtów

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

Uruchomiłem to w systemie Windows 7. Otwiera aplet Java, który domyślnie ma białe tło. Dodaje etykietę z kropką, a następnie zmienia kolor etykiety na muzeum.

Szturchać
źródło
2
Nie jestem pewien, czy jest to poprawne, ponieważ zmienia tylko piksel w oknie apletu. Nie zmieniam koloru piksela, jeśli aplet straci ostrość ... Usunę tę odpowiedź, jeśli nie spełni kryteriów wyzwania.
Poke
0

Tcl / Tk, 61

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

Na obrazie znajduje się czarny piksel w lewym górnym rogu ikony Vivaldi: badpixel


W interaktywnej powłoce dostępne są skróty poleceń:

Tcl / Tk, 57

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

Na białym obszarze V ikony Vivaldi znajduje się czarny piksel: badpixel

sergiol
źródło