Buat piksel yang buruk

40

Tugas Anda adalah menulis program yang membuat layar Anda tampak memiliki piksel buruk.

Anda harus memilih tepat satu piksel pada layar, dan tepat satu saluran antara merah, hijau dan biru, dan menjadikan nilainya selalu 0 atau selalu maksimum (biasanya 255). Nilai saluran lain harus sama seperti jika program Anda tidak berjalan.

Anda dapat memilih piksel dan saluran dengan cara apa pun, seperti hardcoding atau menghasilkannya secara acak di setiap proses. Tetapi harus selalu terlihat pada perangkat yang cukup modern.

Jika warna yang semula ditampilkan pada piksel itu telah berubah, program Anda harus memperbarui dalam waktu kurang dari 0,5 detik ketika sistem cukup cepat.

Anda tidak dapat membuat asumsi tentang apa yang sedang ditampilkan di layar (seperti taskbar menggunakan tema default).

Program Anda tidak perlu bekerja ketika screensaver, layar masuk, efek dari manajer jendela, dll, aktif.

Kode terpendek menang.

jimmy23013
sumber
1
Bisakah kita mengasumsikan OS tertentu?
Loovjo
@ Loojo Ya, Anda bisa.
jimmy23013
Ow ... persyaratan untuk mempertahankan saluran lain mungkin menggandakan jumlah byte saya yang sudah konyol.
Bob

Jawaban:

21

Bash di Linux - 25 byte Latin-1

+3 dari @wyldstallyns / -2 dari menghapus tanda kutip / -1 karena saya lupa bagaimana ini bekerja / -9 dari @Dennis

printf ÿ>/dev/fb0;exec $0

Asumsikan / dev / fb0 ada (ada di sistem Linux Arch saya, dan saya pikir seharusnya ada di sistem Linux lainnya). Membutuhkan akses root juga. Ini tidak berfungsi untuk saya ketika X sedang berjalan. Di sistem saya, ini hanya secara konstan mengatur saluran biru dari piksel kiri atas menjadi penuh ( ÿadalah 255).

artificialnull
sumber
Anda perlu echo -n - jika tidak ini bisa golf ke: yes ff> / dev / fb0
wyldstallyns
@ Nyatakan: Ya, saya sudah memperbaikinya. AFAIK, mencetak baris baru akan memengaruhi lebih dari satu piksel (tidak diizinkan oleh deskripsi tantangan)
artificialnull
1
Bagaimana ÿ 255? Saya pikir ini tidak berhasil. 255 bukan karakter unicode yang valid, ini juga bukan ascii, jadi ia harus bergantung pada salah satu codepage kuno yang tidak boleh digunakan, karena mereka berbeda dari mesin ke mesin.
orion
1
printf ÿ>/dev/fb0;exec $0menghemat beberapa byte.
Dennis
3
@orion yesPendekatannya tidak berhasil. /dev/fb0harus dibuka kembali setelah menulis satu saluran piksel.
Dennis
11

Visual C ++, 102 100 99 98 byte

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

Berjalan di Windows, langsung menggunakan Win32 API dengan kompiler Visual C ++ yang menargetkan subsistem konsol. Gunakan konteks perangkat "layar" untuk mengatur saluran merah piksel pada (9,9) menjadi 0xFF.

Tidur diperlukan untuk memungkinkan program lain menarik di antara get / set - dan 9ms terlalu pendek, yang menyebabkan piksel macet 1 pada warna awalnya.


1 Sayangnya, tidak cukup jenis pixel yang macet, pertanyaan ini mencari ...

Bob
sumber
8

HolyC, 13 byte

GrPlot(,9,9);

Letakkan titik hitam pada lapisan persisten secara langsung.

Layers

Seperti apa rupanya.

Tangkapan layar

m4kefile
sumber
6

C #, 247 244 371 366 354 352 byte

Berjalan di Windows. Mendapat konteks perangkat untuk seluruh layar, dan berulang kali memaksimalkan saluran merah di (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);}}}

Saya awalnya tidak ingin mengimpor GetPixel/ SetPixel, tetapi tidak ada cara yang sangat mudah untuk membaca satu piksel dari Graphic. Jadi sekarang ini secara efektif sama dengan upaya VC ++ saya . Mungkin menyimpan ke bitmap akan lebih pendek ...


-5 byte berkat @TuukkaX

Bob
sumber
1
Anda dapat menghapus spasi putih dari daftar parameter SetPixel.
Yytsi
@TuukkaX Terima kasih! Melewatkannya.
Bob
Anda bisa membuatnya tidur 9msdaripada99ms
Rob
2
@Rob aku mencobanya, seperti yang disebutkan dalam jawaban C ++. Sayangnya, 9ms sepertinya tidak cukup ketika saya diuji (Win7). Program lain tidak punya cukup waktu untuk melukis, jadi pikselnya secara efektif macet pada warna awalnya.
Bob
Bisa juga mempersingkat dengan menjalankan 0x1FFFFFFFiterasi dalam loop sibuk alih-alih tidur, tetapi ini harus disetel agar setiap mesin tetap dalam batas 0,5s.
Bob
3

SmileBASIC, 20 byte

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

Pembaruan terus-menerus.
Atur sprite 0ke area 1x 1pada 299, 99pada sprite sheet (yang merupakan piksel merah).
33adalah atribut tampilan, yaitu 1(tampilan aktif) + 32(campuran aditif).

12Me21
sumber
1

Java 7, 266 byte

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

Saya menjalankan ini pada windows 7. Membuka Java Applet yang memiliki latar belakang putih secara default. Menambahkan label dengan tanda titik dan kemudian mengubah warna label ad nauseum.

Menyodok
sumber
2
Tidak benar-benar yakin apakah ini valid karena hanya mengubah piksel di jendela applet. Tidak akan mengubah warna piksel jika applet kehilangan fokus ... Saya akan menghapus jawaban ini jika tidak memenuhi kriteria tantangan.
Poke
0

Tcl / Tk, 61

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

Pada gambar ada piksel hitam di dekat sudut kiri atas ikon Vivaldi: badpixel


Jika pada shell interaktif, ada singkatan dari perintah yang tersedia:

Tcl / Tk, 57

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

Ada piksel hitam di atas area V putih ikon Vivaldi: badpixel

sergiol
sumber