Створіть неправильний піксель


40

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

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

Ви можете вибирати піксель і канал будь-якими способами, наприклад, жорстким кодуванням або генерувати їх випадковим чином під час кожного запуску. Але це завжди повинно бути видно на досить сучасних металовиробах.

Якщо колір, який повинен був відображатися на цьому пікселі, змінився, програма має оновитись менше ніж за 0,5 секунди, коли система буде достатньо швидкою.

Не можна робити припущення щодо того, що наразі відображається на екрані (наприклад, на панелі завдань із використанням теми за замовчуванням).

Вашій програмі не потрібно працювати, коли активні заставка, екран входу, ефект від менеджера вікон тощо.

Найкоротший код виграє.


1
Чи можемо ми припустити конкретну ОС?
Loovjo

@Loovjo Так, можна.
jimmy23013

О, ... вимога зберегти інші канали, ймовірно, подвоює мій і безглуздий підрахунок байтів.
Боб

Відповіді:


21

Bash на Linux - 25 байт Latin-1

+3 від @wyldstallyns / -2 від видалення лапок / -1, бо я забув, як це працює / -9 від @Dennis

printf ÿ>/dev/fb0;exec $0

Припустимо, що / dev / fb0 існує (це відбувається в моїй системі Arch Linux, і я думаю, що це має бути в будь-якій іншій системі Linux). Також потрібен кореневий доступ. Це не працює для мене, коли працює X. У моїй системі це просто постійно встановлює повний синій канал верхнього лівого пікселя ( ÿстановить 255).


Вам потрібно echo -n - інакше це може призвести до гольфу: так ff> / dev / fb0
wyldstallyns

@wyldstallyns Так, я це виправив відповідно. AFAIK, друк нового рядка вплинув би на більше ніж один піксель (не дозволено описом виклику)
штучно до

1
Як ÿ 255? Я не думаю, що це працює. 255 не є дійсним символом унікоду, він також не є ascii, тому він повинен покладатися на одну з тих давніх кодових сторінок, які ніколи не слід використовувати, оскільки вони відрізняються від машини до машини.
orion

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, безпосередньо використовуючи API Win32 з компілятором 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, але немає особливо простого способу зчитування одного пікселя з а 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, який має білий фон за замовчуванням. Додає мітку з періодом, а потім змінює колір мітки ad nauseum.


2
Насправді не впевнений, що це дійсно, оскільки він змінює лише піксель у вікні аплету. Не змінить колір пікселя, якщо аплет втратить фокус ... Я видалю цю відповідь, якщо вона не відповідає критеріям завдання.
Кука

0

Tcl / Tk, 61

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

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


Якщо на інтерактивній оболонці є скорочення команд:

Tcl / Tk, 57

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

Над білою областю піктограми Вівальді є чорний піксель: бадпіксель

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.