Kötü bir piksel oluşturun


40

Göreviniz, ekranınızın kötü bir piksele sahip görünmesini sağlayan bir program yazmaktır.

Ekranda tam olarak bir piksel ve kırmızı, yeşil ve mavi arasında tam olarak bir kanal seçmeli ve değerini her zaman 0 veya her zaman maksimum (genellikle 255) yapmalısınız. Diğer kanalların değerleri, programınız çalışmamış gibi aynı olmalıdır.

Piksel ve kanalı, kodlama veya her çalıştırmada rastgele üretme gibi herhangi bir yolla seçebilirsiniz. Ancak oldukça modern donanımlarda her zaman görünür olmalıdır.

Orijinal olarak o piksel üzerinde gösterilmesi gereken renk değişmişse, sistem yeterince hızlı olduğunda programınız 0,5 saniyeden kısa sürede güncellenmelidir.

Ekranda o anda görüntülenenler hakkında varsayımlarda bulunamazsınız (örneğin, varsayılan temayı kullanan görev çubuğu).

Bir ekran koruyucu, giriş ekranı, bir pencere yöneticisinden efekt vb. Etkin olduğunda programınızın çalışması gerekmez.

En kısa kod kazanır.


1
Belirli bir işletim sistemi varsayabilir miyiz?
Loovjo

@Loovjo Evet, yapabilirsiniz.
jimmy23013

Ow ... diğer kanalları koruma zorunluluğu muhtemelen çok saçma bayt sayımı iki katına çıkardı.
Bob

Yanıtlar:


21

Linux'ta Bash - Latin-1'in 25 baytı

@Wyldstallyns dan 3 / -2 çıkarmadan tırnak gelen / -1 Unuttum çünkü bu nasıl çalışır / -9 dan @Dennis

printf ÿ>/dev/fb0;exec $0

/ Dev / fb0 öğesinin bulunduğunu varsayar (Arch Linux sistemimde var ve bence diğer Linux sistemlerinde olması gerekiyor). Kök erişimi de gerektirir. X çalışırken bu benim için işe yaramaz. Sistemimde bu, sol üst pikselin mavi kanalını sürekli olarak tam olarak ayarlıyor ( ÿ255).


Echo-n'ye ihtiyacınız var - aksi takdirde golf oynayabilir: evet ff> / dev / fb0
wyldstallyns

@wyldstallyns Evet, buna göre düzelttim. AFAIK, yeni çizgiyi yazdırmak birden fazla piksele etki eder (meydan okuma tanımlamasına izin verilmez)
artificialnull

1
255 nasıl? Bunun işe yaradığını sanmıyorum. 255 geçerli bir unicode karakter değildir, ya ascii değildir, bu nedenle makineden makineye farklılık gösterdiğinden, hiç kullanılmaması gereken eski kodlardan birine dayanmalıdır.
orion

1
printf ÿ>/dev/fb0;exec $0birkaç bayt kaydeder.
Dennis,

3
@ orion yesYaklaşım çalışmıyor. /dev/fb0bir piksel kanalı yazdıktan sonra yeniden açılmalıdır.
Dennis,

11

Visual C ++, 102 100 99 98 bayt

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

Konsol alt sistemini hedefleyen Visual C ++ derleyici ile doğrudan Win32 API kullanarak Windows üzerinde çalışır. Piksel kırmızı kanalını (9,9) olarak ayarlamak için "ekran" cihaz bağlamını kullanır 0xFF.

Uyku diğer programlar get / set arasında çekmek için izin vermek için gerekli olan - ve 9ms sıkışmış alma piksel yol açan çok kısa 1 başlangıç rengine.


1 Ne yazık ki, tam olarak aynı tipte sıkışmış piksel bu soru değil ...


8

HolyC, 13 bayt

GrPlot(,9,9);

Doğrudan kalıcı katmana siyah bir nokta koyar.

Katmanlar

Ne gibi görünüyor.

Ekran görüntüsü


6

C #, 247 244 371 366 354 352 bayt

Windows üzerinde çalışır. Tüm ekran için bir cihaz bağlamı alır ve art arda kırmızı kanalı (9,9) en üst düzeye çıkarır.

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

Başlangıçta GetPixel/ almak istemedim SetPixel, ancak tek bir pikseli okumak için özellikle kolay bir yol yok a Graphic. Yani şu anda bu etkili aynıdır benim VC ++ girişimi . Belki bitmap'e kaydetme daha kısa sürer ...


@TuukkaX sayesinde -5 bayt


1
Beyaz alanları parametre listesinden kaldırabilirsiniz SetPixel.
Yytsi

@TuukkaX Teşekkürler! Onları özledim.
Bob

Daha 9msziyade uyku için yapabilirsiniz99ms
Rob

2
@Rob C ++ cevabında da belirtildiği gibi denedim. Ne yazık ki, test ettiğimde 9ms yeterli gözükmüyordu (Win7). Diğer programlar boyamak için yeterli zamana sahip olmadığından, piksel başlangıçtaki rengine etkili bir şekilde yapışmıştı.
Bob

0x1FFFFFFFUyku yerine yoğun bir döngüde yineleme yaparak da kısaltabilirdi , ancak bunun her makinenin 0,5s limitinde kalması için ayarlanması gerekir.
Bob

3

SmileBASIC, 20 bayt

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

Sürekli güncellemeler.
Set sprite 0a 1x 1altındaki alan 299, 99(kırmızı piksel) hareketli grafik kağıda. (ekran açık) + (ilave karışım)
33olan ekran özelliğidir .132


1

Java 7, 266 bayt

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

Bunu windows 7'de çalıştırdım. Varsayılan olarak beyaz arka planı olan bir Java Uygulaması açar. Bir döneme sahip bir etiket ekler ve daha sonra etiketli reklam müzesinin rengini değiştirir.


2
Bunun sadece applet penceresindeki pikseli değiştirdiği için geçerli olup olmadığından emin değilsiniz. Uygulama odağı kaybederse piksel rengini değiştirmez ... Bu soruyu, meydan okuma kriterlerine uymuyorsa silerim.
Poke

0

Tcl / Tk, 61

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

Görüntüde Vivaldi simgesinin sol üst köşesinde siyah bir piksel var: badpixel


Etkileşimli bir kabukta, mevcut komutların kısaltmaları vardır:

Tcl / Tk, 57

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

Vivaldi simgesinin V beyaz alanı üzerinde siyah bir piksel var: badpixel

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.