Tạo một pixel xấu


40

Nhiệm vụ của bạn là viết một chương trình làm cho màn hình của bạn có một pixel xấu.

Bạn nên chọn chính xác một pixel trên màn hình và chính xác một kênh giữa đỏ, lục và lam và làm cho giá trị của nó luôn là 0 hoặc luôn luôn tối đa (thường là 255). Giá trị của các kênh khác phải giống như khi chương trình của bạn không chạy.

Bạn có thể chọn pixel và kênh theo bất kỳ cách nào, chẳng hạn như mã hóa nó hoặc tạo ngẫu nhiên trên mỗi lần chạy. Nhưng nó phải luôn được nhìn thấy trên các phần cứng khá hiện đại.

Nếu màu ban đầu được hiển thị trên pixel đó đã thay đổi, chương trình của bạn sẽ cập nhật sau chưa đầy 0,5 giây khi hệ thống đủ nhanh.

Bạn không thể đưa ra các giả định về những gì hiện đang hiển thị trên màn hình (chẳng hạn như thanh tác vụ sử dụng chủ đề mặc định).

Chương trình của bạn không cần hoạt động khi trình bảo vệ màn hình, màn hình đăng nhập, hiệu ứng từ trình quản lý cửa sổ, v.v., đang hoạt động.

Mã ngắn nhất sẽ thắng.


1
Chúng ta có thể giả định một hệ điều hành cụ thể không?
Loovjo

@Loovjo Vâng, bạn có thể.
jimmy23013

Ow ... yêu cầu bảo toàn các kênh khác có thể tăng gấp đôi số byte đã vô lý của tôi.
Bob

Câu trả lời:


21

Bash trên Linux - 25 byte tiếng Latin-1

+3 từ @wyldstallyns / -2 khi xóa dấu ngoặc kép / -1 vì tôi quên cách hoạt động của nó / -9 từ @Dennis

printf ÿ>/dev/fb0;exec $0

Giả sử rằng / dev / fb0 tồn tại (nó có trên hệ thống Arch Linux của tôi và tôi nghĩ nó nên có trên bất kỳ hệ thống Linux nào khác). Yêu cầu quyền truy cập root là tốt. Điều này không làm việc cho tôi khi X đang chạy. Trên hệ thống của tôi, điều này chỉ liên tục đặt kênh màu xanh lam của pixel trên cùng bên trái thành đầy đủ ( ÿlà 255).


Bạn cần echo -n - nếu không thì điều này có thể đánh gôn thành: yes ff> / dev / fb0
wyldstallyns

@wyldstallyns Vâng, tôi đã sửa nó cho phù hợp. AFAIK, in dòng mới sẽ ảnh hưởng đến nhiều hơn một pixel (không được phép mô tả thách thức)
nhân tạo

1
Làm thế nào là 255? Tôi không nghĩ rằng nó hoạt động. 255 không phải là một ký tự unicode hợp lệ, nó cũng không phải là ascii, vì vậy nó phải dựa vào một trong những mật mã cổ xưa không bao giờ được sử dụng, vì chúng khác nhau từ máy này sang máy khác.
orion

1
printf ÿ>/dev/fb0;exec $0tiết kiệm một vài byte.
Dennis

3
@orion Cách yestiếp cận không hiệu quả. /dev/fb0phải được mở lại sau khi viết một kênh pixel.
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);}

Chạy trên Windows, trực tiếp sử dụng API Win32 với trình biên dịch Visual C ++ nhắm vào hệ thống con giao diện điều khiển. Sử dụng bối cảnh thiết bị "màn hình" để đặt kênh màu đỏ của pixel ở (9,9) thành 0xFF.

Giấc ngủ là cần thiết để cho phép các chương trình khác rút ra giữa get / set - và 9ms quá ngắn, dẫn đến pixel bị kẹt 1 trên màu ban đầu.


1 Thật không may, không hoàn toàn cùng một loại điểm ảnh bị mắc kẹt câu hỏi này đang tìm kiếm ...


8

HolyC, 13 byte

GrPlot(,9,9);

Đặt một chấm đen trên lớp liên tục trực tiếp.

Lớp

Nó trông như thế nào

Ảnh chụp màn hình


6

C #, 247 244 371 366 354 352 byte

Chạy trên Windows. Nhận bối cảnh thiết bị cho toàn bộ màn hình và liên tục tối đa hóa kênh màu đỏ ở (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);}}}

Ban đầu tôi không muốn nhập GetPixel/ SetPixelnhưng không có cách nào đặc biệt dễ dàng để đọc một pixel tắt a Graphic. Vì vậy, ngay bây giờ điều này thực sự giống như nỗ lực VC ++ của tôi . Có lẽ việc lưu vào bitmap sẽ ngắn hơn ...


-5 byte nhờ @TuukkaX


1
Bạn có thể xóa các khoảng trắng khỏi danh sách tham số SetPixel.
Yytsi

@TuukkaX Cảm ơn! Nhớ những người đó.
Bob

Bạn có thể làm cho nó ngủ 9msthay vì99ms
Rob

2
@Rob Tôi đã thử điều đó, như đã đề cập trong câu trả lời của C ++. Thật không may, 9ms dường như không đủ khi tôi thử nghiệm (Win7). Các chương trình khác không có đủ thời gian để vẽ, do đó, pixel bị kẹt một cách hiệu quả trên màu sắc ban đầu.
Bob

Cũng có thể rút ngắn nó bằng cách chạy qua các vòng 0x1FFFFFFFlặp trong một vòng lặp bận rộn thay vì ngủ, nhưng điều này sẽ phải được điều chỉnh cho mọi máy để ở trong giới hạn 0,5 giây.
Bob

3

SmileBASIC, 20 byte

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

Cập nhật liên tục.
Đặt sprite 0thành một vùng 1x 1tại 299, 99trên bảng sprite (là pixel màu đỏ).
33là thuộc tính hiển thị, là 1(hiển thị trên) + 32(trộn phụ gia).


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

Tôi đã chạy cái này trên windows 7. Mở một Applet Java có nền trắng theo mặc định. Thêm nhãn với dấu chấm và sau đó thay đổi màu của nhãn quảng cáo.


2
Không thực sự chắc chắn nếu điều này là hợp lệ vì nó chỉ thay đổi pixel trong cửa sổ applet. Sẽ không thay đổi màu pixel nếu applet mất tiêu điểm ... Tôi sẽ xóa câu trả lời này nếu nó không đáp ứng tiêu chí của thử thách.
Chọc

0

Tcl / Tk, 61

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

Trên hình ảnh có một pixel đen gần góc trên bên trái của biểu tượng Vivaldi: badpixel


Nếu trên một vỏ tương tác, có các chữ viết tắt của các lệnh có sẵn:

Tcl / Tk, 57

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

Có một pixel đen trên vùng trắng V của biểu tượng Vivaldi: badpixel

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.