Создать плохой пиксель


40

Ваша задача - написать программу, которая заставит ваш экран иметь плохой пиксель.

Вы должны выбрать ровно один пиксель на экране и ровно один канал между красным, зеленым и синим, и сделать его значение либо всегда 0, либо всегда максимальным (обычно 255). Значения других каналов должны быть такими же, как если бы ваша программа не запускалась.

Вы можете выбрать пиксель и канал любым способом, например жестко закодировать его или сгенерировать случайным образом при каждом запуске. Но это всегда должно быть видно на довольно современном оборудовании.

Если изменился цвет, который первоначально должен отображаться на этом пикселе, ваша программа должна обновиться менее чем за 0,5 секунды, когда система будет достаточно быстрой.

Вы не можете делать предположения о том, что в данный момент отображается на экране (например, панель задач с использованием темы по умолчанию).

Ваша программа не должна работать, когда активны заставка, экран входа в систему, эффект из оконного менеджера и т. Д.

Самый короткий код выигрывает.


1
Можем ли мы принять конкретную ОС?
Loovjo

@ Loovjo Да, вы можете.
jimmy23013

Оу ... требование сохранить другие каналы, вероятно, удваивает мой и без того нелепый счетчик байтов.
Боб

Ответы:


21

Bash на Linux - 25 байт латиницы-1

+3 от @wyldstallyns / -2 от удаления кавычек / -1, потому что я забыл, как это работает / -9 от @Dennis

printf ÿ>/dev/fb0;exec $0

Предполагается, что / dev / fb0 существует (он существует в моей системе Arch Linux, и я думаю, что это должно быть в любой другой системе Linux). Требуется также root-доступ. Это не работает для меня, когда X работает. В моей системе это просто постоянно устанавливает синий канал верхнего левого пикселя на полный ( ÿ255).


Вам нужен echo -n - иначе это может привести к: yes ff> / dev /
fb0

@wyldstallyns Да, я исправил это соответственно. AFAIK, печать новой строки будет влиять более чем на один пиксель (не разрешено описанием задачи)
искусственный

1
Как ÿ 255? Я не думаю, что это работает. 255 не является действительным символом юникода, это также не ascii, поэтому он должен опираться на одну из тех древних кодовых страниц, которые никогда не должны использоваться, поскольку они различаются от машины к машине.
Орион

1
printf ÿ>/dev/fb0;exec $0сохраняет несколько байтов.
Деннис

3
@orion yesПодход не работает. /dev/fb0должен быть открыт после записи одного пиксельного канала.
Деннис

11

Visual C ++, 102 100 99 98 байт

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

Работает в Windows, напрямую используя Win32 API с компилятором Visual C ++, ориентированным на консольную подсистему. Использует «экранный» контекст устройства для установки красного канала пикселя в (9,9) 0xFF.

Спящий режим необходим для того, чтобы другие программы могли рисовать между get / set - и 9 мс были слишком короткими, что приводило к застреванию пикселя 1 на его первоначальном цвете.


1 К сожалению, не совсем такой же тип застрявшего пикселя ищет этот вопрос ...


8

HolyC, 13 байт

GrPlot(,9,9);

Помещает черную точку на постоянный слой напрямую.

Слои

На что это похоже.

Скриншот


6

C #, 247 244 371 366 354 352 байта

Работает на Windows. Получает контекст устройства для всего экрана и многократно увеличивает красный канал в (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);}}}

Изначально я не хотел импортировать GetPixel/ SetPixel, но нет особенно простого способа прочитать один пиксель из a Graphic. Так что сейчас это фактически так же, как моя попытка VC ++ . Может быть, сохранение в растровое изображение будет короче ...


-5 байт благодаря @TuukkaX


1
Вы можете удалить пробелы из списка параметров SetPixel.
Yytsi

@TuukkaX Спасибо! Пропустил те.
Боб

Вы можете заставить его спать, 9msа не99ms
Роб

2
@Rob Я попробовал это, как уже упоминалось в ответе C ++. К сожалению, 9 мс не хватило, когда я тестировал (Win7). У других программ не было достаточно времени для рисования, поэтому пиксель эффективно застрял на своем первоначальном цвете.
Боб

Можно также сократить его, выполнив около 0x1FFFFFFFитераций в занятом цикле вместо сна, но это должно быть настроено для каждой машины, чтобы оставаться в пределах 0,5 с.
Боб

3

SmileBASIC, 20 байтов

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

Обновления постоянно.
Наборы спрайт 0к 1й 1области в 299, 99на спрайтах листа (который представляет собой красный пиксель).
33является атрибутом отображения, который 1(отображение включено) + 32(аддитивное смешивание).


1

Java 7, 266 байт

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

Я запустил это в Windows 7. Открывает апплет Java, который по умолчанию имеет белый фон. Добавляет метку с точкой, а затем меняет цвет метки до тошноты.


2
На самом деле не уверен, что это действительно так, поскольку это только изменяет пиксель в окне апплета. Не изменит цвет пикселя, если апплет потеряет фокус ... Я удалю этот ответ, если он не соответствует критериям задачи.
Тыкни

0

Tcl / Tk, 61

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

На изображении есть черный пиксель в верхнем левом углу значка Вивальди: badpixel


Если в интерактивной оболочке есть сокращения команд:

Tcl / Tk, 57

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

Над V-образной белой областью значка Вивальди есть черный пиксель: badpixel

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.