创建坏像素


40

您的任务是编写一个程序,使您的屏幕看起来像一个坏像素。

您应该在屏幕上选择一个像素,在红色,绿色和蓝色之间选择一个通道,并使其值始终为0或始终为最大值(通常为255)。其他通道的值应与程序未运行相同。

您可以通过任何方式选择像素和通道,例如对其进行硬编码或在每次运行时随机生成。但是它必须在相当现代的硬件上始终可见。

如果最初应在该像素上显示的颜色已更改,则当系统速度足够快时,程序应在不到0.5秒的时间内更新。

您无法假设屏幕上当前显示的内容(例如使用默认主题的任务栏)。

当屏幕保护程序,登录屏幕,来自窗口管理器的效果等处于活动状态时,您的程序无需运行。

最短的代码胜出。


1
我们可以假设一个特定的操作系统吗?
Loovjo '16

@Loovjo是的,可以。
jimmy23013

糟糕,保留其他通道的要求可能会使我本来荒谬的字节数加倍。
鲍勃

Answers:


21

Bash在Linux上-25字节的Latin-1

+3从@wyldstallyns / -2从去掉引号 / -1,因为我忘了这是如何工作 / -9从@Dennis

printf ÿ>/dev/fb0;exec $0

假设/ dev / fb0存在(它在我的Arch Linux系统上确实存在,我认为应该在任何其他Linux系统上)。还需要root访问。当X运行时,这对我不起作用。在我的系统上,这只是不断将左上角像素的蓝色通道设置为满(ÿ为255)。


您需要echo -n-否则这可能会导致以下问题:是ff> / dev / fb0
wyldstallyns

@wyldstallyns是的,我已相应地对其进行了修复。AFAIK,打印换行符将影响一个以上的像素(挑战说明不允许)
Artificialnull

1
255 255是多少?我认为这行不通。255不是有效的unicode字符,也不是ascii,因此它必须依赖那些永远不应该使用的古老代码页之一,因为它们因机器而异。
Orion

1
printf ÿ>/dev/fb0;exec $0保存一些字节。
丹尼斯

3
@orion该yes方法不起作用。/dev/fb0写一个像素通道后必须重新打开。
丹尼斯

11

视觉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之间进行插入-9ms太短,导致像素在其初始颜色上停留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
Rob

2
如C ++答案中所述,我尝试了@Rob。不幸的是,当我测试(Win7)时9ms似乎还不够。其他程序没有足够的时间绘画,因此像素实际上停留在其初始颜色上。
鲍勃

也可以通过0x1FFFFFFF在繁忙的循环中而不是在睡眠中运行大约几次迭代来缩短它,但是必须对每台机器进行调整,以使其保持在0.5s的限制内。
鲍勃

3

SmileBASIC,20个字节

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

不断更新。
套精灵0到一个1X 1在区域29999在精灵表(这是一个红色像素)。
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 Applet。添加带有句点的标签,然后更改标签的颜色。


2
实际不确定这是否有效,因为它仅会更改applet窗口中的像素。如果小程序失去焦点,则不会更改像素颜色。如果不符合挑战的标准,我将删除此答案。

0

Tcl / Tk,61

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

在图像上,Vivaldi图标的左上角附近有一个黑色像素: 坏像素


如果在交互式外壳上,则可以使用以下命令的缩写:

Tcl / Tk,57

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

Vivaldi图标的V white区域上方有一个黑色像素: 坏像素

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.